C#中Class和Struct的区别

本文详细对比了C#中的类与结构的区别,包括它们的定义、实例化、继承、成员、构造函数和作用域等关键特性,并通过代码示例展示了如何正确使用类与结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从网上查看了很多相关的总结,现个人总结如下:

 

Class

Struct

本质

继承与System.Object,是引用类型。

其实例分配在堆上。

其实例可以设为Null。

作为参数时,按址方式传递。

可以声明析构函数,因为其实例由垃圾回收机制来确保内存回收。

继承自System.ValueType,是值类型。

其实例分配在栈上。(性能优势)

其实例不可以设为Null。

作为参数时,按值方式传递。

不可以声明析构函数,因为使用完后立即自动解除内存分配。

构造函数

可以显示声明无参数的构造函数。

不需要在构造函数中初始化全部字段。

不可以显示声明无参数的构造函数,只能声明有参数的构造函数。默认无参构造器只是简单地把所有的值初始它的的0等价值。

构造函数必须初始化所有字段。

成员

可以对成员进行初始化。

不可以对成员进行初始化。

实例化

使用new关键字。

可以不使用new关键字。对于struct如果是实例无参的时就可以无new了;但如果是有参的构造函数生成时,就要用new了。如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。

继承

可以继承类和接口。(扩展优势)

不能从类继承,也不能作为类的基类,但是可以继承接口。

抽象

可以是抽象类,并可声明抽象函数。

不支持抽象。

重载

可以声明protected成员、virtual成员、sealed成员和override成员。

只可以重载System.Object的3个虚方法,Equals()、ToString()、GetHashTable()。

职能

是行为的封装,用来表述对象。

是数据的封装,用于存储数据。

 

 1     struct fenshu
 2     {
 3         //'ConsoleApplication1.fenshu.fenzi': cannot have instance field initializers in structs
 4         //public int fenzi = 1;
 5 
 6         public int fenzi;
 7         public int fenmu;
 8 
 9         //Structs cannot contain explicit parameterless constructors
10         //fenshu()
11         //{ }
12 
13         //Field 'ConsoleApplication1.fenshu.fenzi' must be fully assigned before control is returned to the caller
14         //fenshu(int fm)
15         //{
16         //    fenmu = fm;
17         //}
18 
19         //need to mark the constructor as public (or internal).
20         internal fenshu(int fm)
21         {
22             fenzi = 0;
23             fenmu = fm;
24         }
25     }
26 
27     class Program
28     {
29         static void Main(string[] args)
30         {
31             fenshu fs = new fenshu();
32             fs.fenzi = 2;
33             fs.fenmu = 3;
34             Console.WriteLine("{0}/{1}", fs.fenzi, fs.fenmu);
35 
36             fenshu f;
37             f.fenzi = 1;
38             f.fenmu = 2;
39             Console.WriteLine("{0}/{1}", f.fenzi, f.fenmu);
40 
41             fenshu s = new fenshu(2);
42             Console.WriteLine("{0}/{1}", s.fenzi, s.fenmu);
43         }
44     }

 

Reference:

http://www.cnblogs.com/waitrabbit/archive/2008/05/18/1202064.html

http://witmax.cn/csharp-class-vs-struct.html

http://blog.sina.com.cn/s/blog_4a7b40d70101gl65.html

 

Addition:

枚举是值类型而System.Enum却是引用类型的原因

 

转载于:https://www.cnblogs.com/wxin/p/3476871.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值