C# struct
很困惑,为什么C#会有struct 这样一个关键字。虽然我用C#几年了,但绝少用到此关键字。我在相关书籍上学习C#的时候,看到过struct内容——但C#并不是我的第一入门语言,所以没有那么细致的学习。这其中也有一部分原因是有些书籍会淡化struct,更在的原因则在于我的先验经验上。忽略struct关键字的理由如下:
- 已经有class了,还有struct干啥?节约内存?这不是C#的主要卖点吧。
- 各种神奇的限制。既然如此,就更不想用了。
- 难道只是为了与C++、win32的互操作?现在应用越来越远离OS,场景也难得碰到,还是不用吧。
大概如此想法吧。最近当做面试官,面试了一些应聘者,另一C++出生的哥们,问到了struct与class的区别——甚至内存布局,一想到自己也不甚清楚,还是了解一下吧。C++出身的人,总是不忘内存。
在MSDN上找到关于struct的相关信息:strcut是值类型,而class是引用类型。struct在赋值时,是拷贝操作。而引用类型,只是引用了同一内容。值类型类似C语言中的函数形参,而引用类型类似实参。还拥有值类型的一些其他特征,比如可空(Nullable),等等。
使用上还有其他一些特征与限制[1],但我更想知道为什么要有struct。
- 可以自定义新的值类型。一般值类型只有原始基本类型,比如int, byte。
- 结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。[2]
- 结构更加有效,也就是更加节省内存, 提升处理效率[3]。因为没有class的很多特性,所以也没有class的元数据块。
- 结构是值类型,而值类型是可计算的,拥有可计算的语义。例如DataTime。[4]
从以上内容可以看出使用struct的一般场景:
- 自定义的类型语义上为值类型。稳定不变的,可计算的。
- 需要更高效率的场景。
关于上述第二点,记得其失去了面向对象很多特性。
[1] 结构(C#编程指南), https://msdn.microsoft.com/zh-cn/library/saxz13w4(v=vs.90).aspx
[2] 类和结构(C#编程), https://msdn.microsoft.com/zh-cn/library/ms173109.aspx
[3] 使用结构(C#编程指南), https://msdn.microsoft.com/zh-cn/library/0taef578.aspx
[4] 深入理解C#,人民邮电出版社, p41-43
C# struct的更多相关文章
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- go-使用 unsafe 修改 struct 中的 field 的值
以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...
- C语言中struct位域的定义和使用
位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...
- C# Struct结构体里数组长度的指定
typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>
最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- 窥探Swift之别具一格的Struct和Class
说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...
- struct 大小计算
结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...
随机推荐
- 在CentOS 5.8上搭建PPTP VPN服务
在天朝上网,vpn已经是必备之物了,我也记录一下搭建vpn服务的方法. 1. 确认内核是否支持MPPE模块MPPE用来支持Microsoft Point to Point Encryption, 包括 ...
- window8家庭版上的RationalRose
来点儿小插曲儿,本是继续Java系列文章的续集的,但是最近要用到UML,在网上看了看,查了查推荐的到是不少,最终还是选择了rose,哈哈,一半是冲着名字去的,一半看看了与其它的UML的比较,最终中意r ...
- jdk各个班本官网下载地址
http://www.oracle.com/technetwork/java/archive-139210.html
- MyEclipse使用总结——使用MyEclipse打包带源码的jar包
平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...
- eclipse插入自定义注释(含当前系统时间)
/** * @author ${user} * @description * ${tags} * @CreateDate ${date} ${time} * @modifyUser * @modify ...
- 直接运行PowerShell脚本
以管理员权限运行下面语句:ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\pow ...
- 处理linux下面的mysql乱码问题(下面的utf8换成gb2312也是可以的)
有时候因为编码需要修改mysql的编码,windows下修改有图文界面简单一些,linux大家就可以参考下面的方法 默认登录mysql之后可以通过SHOW VARIABLES语句查看系统变量及其值 ...
- Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- accept函数
accept()函数 系统调用 accept() 会有点古怪的地方的! 你能够想象发生 这种事情:有人从非常远的地方通过一个你在侦听 (listen()) 的port连接 (connect()) 到你 ...
- cocos2d-x 3.1.1 学习笔记[3]Action 动作
这些动画貌似都非常多的样子,就所有都创建一次. 代码例如以下: /* 动画*/ auto sp = Sprite::create("card_bg_big_26.jpg"); Si ...