struct和class的不同以及struct的应用场景
struct在C#中被用来定义结构,它是一种比类小的数据类型。和类一样都是创建对象的模板,可以有自己的数据以及处理和访问数据的方法。
struct的用法:
struct FurnitureSize
{
public double Height;
public double Length { get; set; }
public double Width;
static FurnitureSize()
{
//nothing
}
public FurnitureSize(double paramLength, double paramWidth, double paramHeight = 2.2)
{
this.Height = paramHeight;
this.Length = paramLength;
this.Width = paramWidth;
}
public double Volume
{
get
{
return Height* Length* Width;
}
}
public double Area()
{
return Volume/ Height;
}
}
从上边的代码片段中可以看出,struct和class几乎相同,那么struct和class除了关键字不同外,还有哪些不同呢?下面一一例举。
1.struct不能创建自己的无参构造函数(除了静态的无参构造函数)。而类则可以。
如果我给上边的FurnitureSize增加一个无参非静态构造函数的话就会被IntelliSense提示不能创建无参构造函数。

而类的话就可以创建自己的无参构造器(这样做没有意义),IntelliSense检查语法通过。
class ConstructorTest
{
public int int1;
public string str1;
public Boolean bool1;
//static ConstructorTest() { }
public ConstructorTest()
{ }
public ConstructorTest(int paramInt,string paramString,Boolean paramBoolean)
{
Console.WriteLine("Constructor opened.");
}
}
为什么会这样?这是因为.Net运行库实现的时候如果碰到是Class类型的时候,会先判断你是否重载了构造函数,如果重载了新的构造函数并且又没有声明无参构造函数的话,
你想创建一个这个类的实例就只能使用新的有参构造函数。比如如果我在class ConstructorTest里没有定义无参构造函数的话,我想创建ConstructorTest的实例只能使用
ConstructorTest dct = new ConstructorTest(,"",false);
而struct不一样,.Net运行库运行struct时,不管你定义多少个有参构造函数它都会执行一遍无参构造函数,即使你没有显示的定义有参构造函数。
2.在struct里不能在声明的时候赋初值,而类可以。

类给字段赋初值:语法检查通过。

因为运行struct的时候运行库无论如何都会跑一遍struct的无参构造器,而在无参构造器里会给字段赋初值,数值型默认为0,引用型初始化为null。即使在struct里提供了字段的初始值也不能绕过默认构造函数。所以在struct里不能为字段显式的赋初始值。
3.结构是值类型,类是引用类型
结构和其他简单类型一样被分配在栈中,所以在实例化struct对象或者给struct里的字段赋值得时候可以像下边这样。
FurnitureSize fs = new FurnitureSize();
fs.Height = 2.2;
fs.Width = 1.8;
也可以像这样:
FurnitureSize fstmp;
fstmp.Height = 2.0;
fstmp.Width = 1.7;
而类的话只能先实例化对象,然后给对象的字段赋值。
ConstructorTest dct = new ConstructorTest();
dct.int1 = ;
像这样赋值是不对的:

4.除了Object,它不能继承别的结构。
结构的继承链:结构派生于System.ValueType--->System.Object。不能为结构提供其他基类,每个类都派生于ValueType。
struct适合用于小的数据结构,最好是它来定义简单类型的结合体。在为struct分配内存的时候速度非常快,在结构作用域消失的时候删除也非常快,因为它是一种值类型。当把struct作为参数传递给方法时,应该把它作为ref参数传递,以避免性能损失。
struct和class的不同以及struct的应用场景的更多相关文章
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- 漫谈C语言结构体struct、公用体union空间占用
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
- [转载]彻底弄清struct和typedef struct
struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...
- C++11的enum class & enum struct和enum
C++11的enum class & enum struct和enum C++标准文档--n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg ...
- 【Go入门教程4】struct类型(struct的匿名字段)
struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...
- struct和typedef struct彻底明白了
struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...
- Python使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- [C语言]关于struct和typedef struct
在C中定义一个结构体类型要用typedef: *************************************************************************** t ...
随机推荐
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3
使用之前的函数实现的简单聊天程序 TCP协议 双方实时发送/接收消息 实现后的问题: 可能是我虚拟机的IP地址配得有问题吧.在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通.但是两个虚 ...
- ppt提取图片,视频文件
1,将视频另存为htm格式,然后会生成文件夹,里面就有. 2,如果没法生成htm格式,可以生成odp格式,压缩文件,用解压缩软件查看odp文件,就能看到. 3,pptx直接修改后缀为rar或者zip, ...
- 在Laravel中使用Middleware进行身份验证
新建一个中间件: 方法写在handle中 判断用户是否登录而且是否是管理员,不是的话返回到主页 新建判断是否为管理员的方法 在kernel定义一个中间件,key是admin 注册群组路由:prefix ...
- 网易 监控 openstack
http://www.360doc.com/content/16/0416/08/13792507_551022987.shtml
- bootstrap只有遮罩层没有对话框的解决方法
前端很差很差,猜测应该是各种js冲突的问题,换了一个jquery或bootstrap版本的不兼容. https://blog.csdn.net/Pabebe/article/details/70230 ...
- UVA 437 巴比伦塔 【DAG上DP/LIS变形】
[链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...
- Hihocoder 1496 寻找最大值(状态压缩 + 高位前缀和)
题目链接 Hiho 1496 设$f[i]$为二进制集合包含$i$的最大的两个数,这个东西用高维前缀和维护. 高位前缀和转移的具体方案 :枚举每一位,然后枚举每个集合,大的转移到小的. 注意合并的时 ...
- 「kuangbin带你飞」专题十五 数位DP
传送门 A.CodeForces - 55D Beautiful numbers 题意 一个正整数是 漂亮数 ,当且仅当它能够被自身的各非零数字整除.我们不必与之争辩,只需计算给定范围中有多少个漂亮数 ...
- uva11107(后缀数组)
uva11107 题意 输入 n 个 DNA 序列,求出长度最大的字符串,使得它在超过一半的 DNA 序列中连续出现.如果有多解,按字典序输出. 分析 论文 后缀数组经典题.加深几个关键数组的印象. ...
- jQuery笔记:checkbox
用jQuery操作checkbox时的一点小问题. 勾选checkbox的时候,$("#id").attr("checked")变为"checked& ...