很困惑,为什么C#会有struct 这样一个关键字。虽然我用C#几年了,但绝少用到此关键字。我在相关书籍上学习C#的时候,看到过struct内容——但C#并不是我的第一入门语言,所以没有那么细致的学习。这其中也有一部分原因是有些书籍会淡化struct,更在的原因则在于我的先验经验上。忽略struct关键字的理由如下:

  1. 已经有class了,还有struct干啥?节约内存?这不是C#的主要卖点吧。
  2. 各种神奇的限制。既然如此,就更不想用了。
  3. 难道只是为了与C++、win32的互操作?现在应用越来越远离OS,场景也难得碰到,还是不用吧。

大概如此想法吧。最近当做面试官,面试了一些应聘者,另一C++出生的哥们,问到了struct与class的区别——甚至内存布局,一想到自己也不甚清楚,还是了解一下吧。C++出身的人,总是不忘内存。

在MSDN上找到关于struct的相关信息:strcut是值类型,而class是引用类型。struct在赋值时,是拷贝操作。而引用类型,只是引用了同一内容。值类型类似C语言中的函数形参,而引用类型类似实参。还拥有值类型的一些其他特征,比如可空(Nullable),等等。

使用上还有其他一些特征与限制[1],但我更想知道为什么要有struct。

  1. 可以自定义新的值类型。一般值类型只有原始基本类型,比如int, byte。
  2. 结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。[2]
  3. 结构更加有效,也就是更加节省内存, 提升处理效率[3]。因为没有class的很多特性,所以也没有class的元数据块。
  4. 结构是值类型,而值类型是可计算的,拥有可计算的语义。例如DataTime。[4]

从以上内容可以看出使用struct的一般场景:

  1. 自定义的类型语义上为值类型。稳定不变的,可计算的。
  2. 需要更高效率的场景。

关于上述第二点,记得其失去了面向对象很多特性。

[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的更多相关文章

  1. 使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...

  2. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  3. go-使用 unsafe 修改 struct 中的 field 的值

    以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...

  4. C语言中struct位域的定义和使用

    位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...

  5. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  6. C 语言Struct 实现运行类型识别 RTTI

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast: ...

  7. 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版本的代码,但 ...

  8. 字节流与数据类型的相互转换---使用struct模块

    字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...

  9. 窥探Swift之别具一格的Struct和Class

    说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...

  10. struct 大小计算

    结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...

随机推荐

  1. c++常见输入方法[持续更新]

    字符串输入 cin>> 使用空格确认字符串结束位置,保留换行符在输入队列当中 单个字符读取 cin.get(), cin.get(char) 每次读取一行: cin.getline(cha ...

  2. Gson 和 Fastjson 你不知道的事

    背景 目前在公司负责的业务, 主要是跟JSON数据打交道, fastjson .gson都用, 他们适用于不同场景.fastjson号称是业界处理json效率最高的框架, 没有之一.但在某些场景下, ...

  3. .NET开发中的事务处理大比拼

    本文转载:http://www.cnblogs.com/jhxk/articles/2696307.html http://liubaolongg.blog.163.com/blog/static/2 ...

  4. openflashchart + flex

    Hello openflashchart+flex的demo: http://blog.webasp.com.au/2009/06/open-flash-chart-as-a-swc/ http:// ...

  5. 内网能PING通TELNET通不能访问解决

    遇到一个离奇故障,内网,两个主机在同一IP段内,能互相PING通,TELNET对方的WEB服务器端口,通. 但用IE访问时不能,显示HTTP400.这明显是客户端系统的问题啊!但如何解决呢?我强烈怀疑 ...

  6. vimrc常用配置项

    设置行号 set nu 设置自动缩进 set autoindent 设置tab占n个字符 set tabstop=n 设置以空格代替tab(因为有部分场合不允许使用tab) set expandtab ...

  7. cdoj 04 Complete Building the Houses 暴力

    Complete Building the Houses Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/# ...

  8. CustomProgressBar

    https://github.com/eltld/CustomProgressBar-master

  9. Gridview全选

    1.js代码 <script language="javascript" type="text/javascript">               ...

  10. 【React Native 实战】微信登录

    1.前言 在今天无论是游戏开发还是app开发,微信作为第三方登录必不可少,今天我们就用react-native-wechat实现微信登录,分享和支付同样的道理就不过多的介绍了. 2.属性 1)regi ...