博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中类与结构体的区别
阅读量:6099 次
发布时间:2019-06-20

本文共 1916 字,大约阅读时间需要 6 分钟。

1,结构是实值类型(Value Types),而类则是(Reference Types)。 2,结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。 3,所有结构成员默认都是Public,而类的变量和数则默认位Private,不过其他类成员默认都是Public。 4,结构成员不能被声明位Protected,而类成员可以。 5,结构变量声明不能指定初始值、使用New关键字货对数组进行,但是类变量声明可以。 6,结构不能声明默认的,也就是不拥有参数的非共享,但是类则无此限制。 7,二者都可以拥有共享,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。 8,结构不允许声明(Destructor),类则无此限制。 9,结构的实例(Instance)声明,不允许对包含的变量进行设定,类则可以在声明类的实例时,同时进行变量。 10,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。 11,结构是无法被继承的,类则可以。 12,结构永远不会终止,因此CLR不会在任何结构上调用Finalize方法。类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法。 13,结构不需要构造函数,类则需要构造函数。 14,结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接受参数。但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数。 14,每一个结构都具有无参数的隐含公共构造函数,此构造函数会将结构的所有成员初始化为其。不需要重新定义这个行为。 在“实例和变量”层面上,由于结构是数值类型的,因此每一个结构变量会永远的绑定到结构实例上。然而类是的,而且对象变量可引用不同的类实例,在此方面的区别,会对使用将结构和类造成如下的影响: 15,结构变量会隐式的使用结构的无参数构造函数来初始化成员,这就意味语句 Struct S = new Struct()。 16,当您将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。当您将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。 17,您可以将赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。 18,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。 19,两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。 如何选择结构还是类?     1.  堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 2.   结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。 3.  在表现抽象和多级别的对象层次时,类是最好的选择 4.  大多数情况下该类型只是一些数据时,结构时最佳的选择  性能方面 结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。 在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。 这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。

转载于:https://www.cnblogs.com/khfang/p/5959090.html

你可能感兴趣的文章
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>
四种简单的排序算法(转)
查看>>
Quartz2D之着色器使用初步
查看>>
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>