C#中Class与Struct区别

本文详细对比了C#中的Class与Struct两种类型的特性,包括它们的引用与值类型属性、多态性、继承性、构造函数、内存管理、复制机制及参数传递方式等,帮助读者更好地理解并选择合适的数据结构。

C#中Class与Struct区别

   

1)class 是引用类型,继承自System.Object;stuce是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。
2)从职能观点来看,class表现为行为;而stuct常用于存储数据。
3)class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承。
4)classs可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有的值初始它的的0等价值。
5)实例化时,class要使用new关键字;而struct可以不使用new 关键字,对于struct如果是实例无参的时就可以无new了;但如果是有参的构造函数生成时,就要用new了。如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。


6)class可以是抽象类(abstract),可以声明抽象函数;而struct为抽象也不能声明抽象函数。
7)class可以声明protected成员,virtual成员,sealed成员和override成员;而struct不可以但是值得注意的是,struct可以重载System.Object的3个虚方法,(Equals(),Tostring(),GetHashTable())
8)class 的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可直接以等号连接即可。
9)class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。
10)作为参数传递时,class变量以按址方式传递;而struct变量是以按值方式传递的。

我们可以简单的理解,class是一个可以动的机器,有行为,有多态;而struct就是一个零件箱,组合了不同结构零件。
当然,使用class基本可以替代struct的任何场合,可以说在面向对象的编程里,横行天下。class后来居上。但有些地认识不这是有用的着struct。

a)实现一个订用于存储数据的结构时,可以考虑struct。
b)struct变量占用堆栈空间,因此只适用数据量相对小的场合。
c)结构数组具有更高的效率。
d)提供某些和非托管代码通信的兼容性

### C#Class Struct区别及使用场景 在 C# 中,`class` 和 `struct` 是两种不同的类型定义方式。以下是它们的主要区别和适用场景: #### 1. 类型分类 - **Class** 是引用类型,实例化后存储在托管堆中,通过引用访问。[^1] - **Struct** 是值类型,实例化后直接存储在栈中,按值传递。[^2] #### 2. 内存分配 - **Class** 在创建对象时,会在堆上分配内存,而引用存储在栈中。因此,引用类型的变量实际上保存的是指向堆中对象的引用。 - **Struct** 在创建对象时,直接在栈上分配内存,避免了额外的引用开销。[^3] #### 3. 默认构造函数 - **Class** 默认有一个无参构造函数,但可以被用户定义的构造函数覆盖。 - **Struct** 必须始终初始化其字段,且不允许显式定义无参构造函数(除非提供自定义构造函数)。[^4] #### 4. 继承特性 - **Class** 支持继承和多态,可以实现接口,并从其他类派生。 - **Struct** 不支持继承,但可以实现接口。由于是值类型,它不能派生子类型。[^5] #### 5. 性能考量 - **Class** 因为涉及堆内存分配和垃圾回收,可能带来一定的性能开销。 - **Struct** 因为直接在栈上分配内存,通常比类更高效,尤其是在频繁创建和销毁对象的情况下。[^3] #### 6. 使用场景 - **Class** 适用于复杂的数据结构或需要行为封装的情况,例如需要继承、多态或包含大量数据的实体类。 - **Struct** 适用于简单的数据结构或需要高性能操作的场景,例如表示点坐标、颜色值等轻量级数据。[^4] #### 示例代码 以下是一个简单的对比示例: ```csharp // 定义一个类 public class BookClass { public string Name { get; set; } public void SetValue(string name) { this.Name = name; } } // 定义一个结构体 public struct BookStruct { public string Name { get; set; } public void SetValue(string name) { this.Name = name; } } public static void Main(string[] args) { // 类的使用 BookClass bookClass = new BookClass(); bookClass.SetValue("C# Programming"); Console.WriteLine(bookClass.Name); // 输出: C# Programming // 结构体的使用 BookStruct bookStruct = new BookStruct(); bookStruct.SetValue("C# Struct"); Console.WriteLine(bookStruct.Name); // 输出: C# Struct } ``` #### 注意事项 - 当将结构体作为参数传递给方法时,会进行值拷贝,可能导致较大的性能开销。因此,对于较大的结构体,建议使用类。[^5] - 如果需要实现复杂的逻辑或状态管理,应选择类而非结构体。[^3] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值