- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅谈C#结构
结构是一种值类型,并且不需要堆分配。结构的实例化可以不使用new运算符。如果声明一个10000个Point对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。
AD:
结构是使用 struct关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构。
一般情况下,我们很少使用结构,而且很多人也并不建议使用结构,但作为.NET Framework 一般型別系统中的一个基本架构,还是有必要了解一下的。
结构的特征:
结构是一种值类型,并且不需要堆分配。结构的实例化可以不使用new运算符。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。结构类型永远不是抽象的,并且始终是隐式密封的,因此在结构声明中不允许使用abstract和sealed修饰符。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数,但可以声明带参数的构造函数。结构可以实现接口,但不能从另一个结构或类继承,而且不能作为一个类的基,所有结构都直接继承自 System.ValueType,后者继承自 System.Object。结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如 Dictionarystring, myStruct)时,请务必记住这一点。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应数据的一个引用(被引用的数据称为“对象”)。但是结构仍可以通过ref和out参数引用方式传递给函数成员。结构可用作可以为 null 的类型,因而可向其赋 null 值。structA
{publicintx;?//不能直接对其进行赋值publicinty; ?
public?static?stringstr?=?null;?//静态变量可以初始化publicA(intx,inty)?//带参数的构造函数 ?
{this.x?=x;this.y?=y; ?
Console.WriteLine(x={0},y={1},str={2},?x,?y,str); ?
} ?
}classProgram ?
{staticvoidMain(string[]?args) ?
{ ?
A?a?=newA(1,2); ?
A?a1?=a; ?
a.x?=10; ?
Console.WriteLine(a1.x={0},a1.x); ?
Console.Read(); ?
} ?
}?
结果为:x=1,y=2,str=
a1.x=1
此时a1.x值为1是因为,将a赋值给a1是对值进行复制,因此,a1不会受到a.x赋值得改变而改变。
但如果A是类,这时a和a1里的x引用的是同一个地址,则a1.x的值??输出10。
结构的装箱与拆箱我们知道,一个类类型的值可以转换为object类型或由该类实现的接口类型,这只需在编译时把对应的引用当作另一个类型处理即可。
与此类似,一个object类型的值或者接口类型的值也可以被转换回类类型而不必更改相应的引用。当然,在这种情况下,需要进行运行时类型检查。由于结构不是引用类型,上述操作对结构类型是以不同的方式实现的。
当结构类型的值被转换为object类型或由该结构实现的接口类型时,就会执行一次装箱操作。
反之,当 object类型的值或接口类型的值被转换回结构类型时,会执行一次拆箱操作。
与对类类型进行的相同操作相比,主要区别在于:
装箱操作会把相关的结构值复制为已被装箱的实例,而拆箱则会从已被装箱的实例中复制出一个结构值。
因此,在装箱或拆箱操作后,对“箱”外的结构进行的更改不会影响已被装箱的结构。structProgram
{staticvoidMain(string[]?args) ?
{inti?=1;objecto?=i;?//隐式装箱 ?
i?=123; ?
Console.WriteLine(i={0},o={1},i,o); ?
Console.Read(); ?
} ?
} ?
//结果为:i=123,o=1?
结构与构造函数我们知道结构不能使用默认的构造函数,只能使用带参数的构造函数,当定义带参数的构造函数时,一定要完成结构所有字段的初始化,如果没有完成所有字段的初始化,编译时会发生错误。结构可以使用静态构造函数吗?
可以,结构的静态构造函数与类的静态构造函数所遵循的规则大体相同。
结构的静态构造函数何时将触发呢?结构的实例成员被引用,结构的静态成员被引用,结构显示声明的构造函数被调用。但是创建结构类型的默认值不会触发静态构造函数。
为什么结构不能自定义无参数的构造函数?
结构类型的构造函数与类的构造函数类似,用来初始化结构的成员变量,但是struct不能包含显
文档评论(0)