C#中类与结构体的区别

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值赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。

18,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。

19,两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。

如何选择结构还是类?   1.  堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2.   结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。3.  在表现抽象和多级别的对象层次时,类是最好的选择4.  大多数情况下该类型只是一些数据时,结构时最佳的选择 
时间: 2024-10-27 05:44:26

C#中类与结构体的区别的相关文章

C语言的结构体和C++结构体的区别

关于C++中声明结构体中需要使用构造器创建实例对象的语法: 接着上两个代码截图你就初步体会到C语言的结构体和C++结构体的区别了:     对于右边的C++结构体的使用类似Java,C++,Swift中的类,类中有构造器方法,然后构造器创建这个类的实例对象. 当然Swift中也有一样用法的结构体.毕竟Swfit是集大家之所成的现代语言.

Swift中类和结构体

1. 类和结构体对比 Swift 中类和结构体有很多共同点: 定义属性用于存储值 定义方法用于提供功能 定义附属脚本用于访问值 定义构造器用于生成初始化值 通过扩展以增加默认实现的功能 符合协议以对某类提供标准功能 与结构体相比,类还有如下的附加功能: 继承允许一个类继承另一个类的特征 类型转换允许在运行时检查和解释一个类实例的类型 解构器允许一个类实例释放任何其所被分配的资源 引用计数允许对一个类的多次引用 2. 类和结构体的定义语法 类和结构体有着类似的定义方式.我们通过关键字class和s

数组和链表的区别以及数组和结构体的区别

1,数组和链表的区别? 链表和数组都叫可以叫做线性表, 数组又叫做顺序表,主要区别在于,顺序表是在内存中开辟一段连续的空间来存储数据,而且必须是相同类型的数据. 而链表是通过存在元素中的指针联系到一起的,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域,链表既可以靠指针来连接多块不连续的的空间也可以用一段连续的空间, 在逻辑上形成一片连续的空间来存储数据. 两种数据结构各有各的好处,链表方便删除和插入,数组方便排序等. 数组从栈中分配空间, 对于程序员方便快速

C/C++结构体的区别

C/C++结构体的区别 >_<:C中的结构体和C++中结构体的不同之处: 在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. >_<:C++中的结构体和类的异同: 一.相同之处: 结构体中可以包含函数: 也可以定义public.private.protected数据成员: 定义了结构体之后,可以用结构体名来创建对象.但C中的结构体不允许有函数: 也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继

C语言的结构体和 C++结构体的区别

 C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的初始化方法> 接着下面两个代码截图(一个是C源码,一个是C++源码)对比你就初步体会到C语言的结构体和C++结构体的区别了:      对于右边的C++结构体的使用类似Java,C++,Swift中的类,类中有构造器方法,然后构造器创建这个类的实例对象. 当然Sw

UNITY3D c#脚本中处理类与结构体的区别

1.在C#中结构体类型定义时,成员是不能初始化的,这样就导致了,定义结构体变量时,变量的所有成员都要自己赋值初始化.但对于类,在定义类时,就可以初始化其中的成员变量,所以在定义对象时,对象本身就已经有了初始值,你可以自己在重新给个别变量赋值.(注意在C++中,类的定义中是不能初始化的,初始化要放在构造函数中) 2.结构体变量 和类对象 进行值传递时,结构体变量进行的就是值传递,而类对象进行的是引用传递,或者说传递的是指针,这样在函数中改变参数值,结构体对象的值是不变的,而类对象的值是变化了. 下

类的声明 , 类和结构体的区别 , 内联函数

#include<iostream> using namespace std; class A;//类的声明 class B { private: A *a;//必须是指针 ,不能为 A a; }; class  A { private: B b; }; int main() {} 类和结构体区别: 结构体默认public 类默认是private 在继承方式:结构体默认公有继承 类默认私有继承 inline 调用内联函数并没有执行函数的调用过程,只是把函数的代码嵌入到了程序的调用点 , 减少了

C和C++结构体的区别

C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数.所以C的结构体是没有构造函数.析构函数.和this指针的. C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种. C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的. 在C中定义一个结构体类型要用typedef,如下: typedef struct Complex{ int read; int image; }Comple

联合体与结构体的区别

联合体,又称共用体.编程的时候需要使几种不同类型的变量存放到同一段内存单元中,而衍生出来的一种类型.也就是说,联合体中每次只能存其中的一个变量,这个变量在联合体变量中存入新的成员就失效了!!!用法与结构体一致,但是多用于结构体内部. 1 struct name 2 { 3 int age; 4 char* name; 5 union text //text是标题,标题可以不写 ,此标题在在结构体内无作用 6 { 7 char a; 8 ... 9 } 10 }mytext;//mytext是结构