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的应用场景的更多相关文章

  1. golang struct 转map 及 map[string]*Struct 初始化和遍历

    package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...

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

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

  3. 漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

  4. [转载]彻底弄清struct和typedef struct

    struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...

  5. C++11的enum class & enum struct和enum

    C++11的enum class & enum struct和enum C++标准文档--n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg ...

  6. 【Go入门教程4】struct类型(struct的匿名字段)

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...

  7. struct和typedef struct彻底明白了

    struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...

  8. Python使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  9. [C语言]关于struct和typedef struct

    在C中定义一个结构体类型要用typedef: *************************************************************************** t ...

随机推荐

  1. C3P0连接池工具类使用

    c3p0的基本连接配置文件 c3p0-config.xml <c3p0-config> <default-config> <property name="dri ...

  2. mongodb简单安装

    参考文档: http://www.cnblogs.com/hanyinglong/archive/2016/07/21/5690611.html conf文件: dbpath = /usr/local ...

  3. Python的程序结构[2] -> 类/Class[4] -> 内建类 super

    内建类 super / Built-in Type super 关于内建类 对于 super 可以从官方文档中看到基本介绍,super 接收一个类,以及类或类的实例,最终返回一个代理对象的实例.而 M ...

  4. Python之端口扫描器编写

    其实,写个扫描器也挺好玩的,牵涉到了RAW Socket编程,可以尽情地DIY数据包(当然,不符合数据包规则,比如checksum错误就没办法了),收获颇深.其中,我觉得用C语言写更有利于在编写过程中 ...

  5. JQuery里面的知识

    JQuery是一个javaScript库 JQuery极大的简化了javaScript编程 通过点击 "TIY" 按钮来看看它是如何运行的. 演示JQuery的hide函数,隐藏了 ...

  6. 分金币 Uva 11300

    题意 给定N个人成环状坐,每个人初始分配Ai的金币,金币总数可以被N整除,每个人可以给左右相邻的人一定数量的金币使得最终每个人的金币数量相同,求转移数量最小的方案所转移的总金币数量. N<=10 ...

  7. Laravel 使用firstOrCreate 报错MassAssignmentException

    今天尝试使用firstOrCreate去优化一段查找不到即创建的代码,结果发现会报MassAssignmentException错误,提示我参数错误,去网上找了好久没有找到结果,最后庆幸自己解决了,把 ...

  8. VS2010免费插件

    用惯了VC助手后,突然用裸的VS真不习惯... 1. 在Visual Studio 2010中,我们可以通过在任何代码文件中使用快捷键“Ctrl + ,”(Ctrl键加上逗号键)调出“Quick Se ...

  9. 解决413 Request Entity Too Large

    修改nginx配置    这是最简单的一个做法,着报错原因是nginx不允许上传配置过大的文件,那么件把nginx的上传大小配置调高就好. 1.打开nginx主配置文件nginx.conf,一般在/u ...

  10. 学号20175313 《数据库MySQL(课下作业,必做)》第十周

    目录 一.题目要求 二.需求分析 三.关键代码以及运行结果截图 任务一 任务二 任务三 任务四 四.代码实现过程中遇到的问题及其解决方法 五.码云链接 六.心得体会 一.题目要求 下载附件中的worl ...