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)条方式分配存储空间,各个成员 ...
随机推荐
- Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF
1>>Expression<Func<T,TResult>>和Func<T,TResult>http://www.cnblogs.com/xcsn/p/ ...
- strlen() 和 sizeof() 在字符串中的使用
#include <string.h> int _tmain(int argc, _TCHAR* argv[]) { char *pMyChar = "I like coding ...
- 第一章TP-Link 703N刷OpenWrt
1)下载编译好的固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin openwrt-ar71xx-generic-tl-wr703n ...
- Django官方文档学习2——数据库及模板
网址:https://docs.djangoproject.com/en/1.10/intro/tutorial02/ 1.扫描installed_apps,创建需要的数据库table python ...
- git免登录-ssh-key
1.生成ssh key公钥与私钥 ssh-keygen -t rsa -C "youname@example.com" 需输入三个内容:第一个,生成公私钥的路径及名称:后两个输入回 ...
- 【S4】使用empty()而不是判断size()是否为0
1.二者的作用是一样的,结果也是等价的.就是判断集合是否为空. 2.二者是等价的,为什么强调使用empty,因为empty效率更高. 3.在STL中,对于一般的集合,empty和size都是常数时间. ...
- Swift学习笔记十五
自动引用计数(Automatic Reference Counting) 和OC一样,Swift用自动引用计数机制来跟踪和管理你应用程序的内存,大多数情况下,你不需要考虑自己管理内存,Swift会自动 ...
- Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法
D. Longest k-Good Segment 题目连接: http://www.codeforces.com/contest/616/problem/D Description The arra ...
- 对jquery的 attr()和prop()理解
jquery1.6版本后引入了prop()方法,很多时候总是混淆attr()与prop()这俩,下面分析一下这俩的区别 在此之前,先来了解一下html 的attribute和property,因为jq ...
- Linux开机执行顺序
1. 加载 BIOS 的硬件信息,并取得第一个开机装置的代号: 2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub 等等) 的开机信息: 3. 加载 K ...