C#中class与struct的区别

本文详细阐述了结构体与类之间的六大区别,包括存储位置、继承特性、字段赋值方式、析构函数的存在与否、构造函数的要求等。通过这些对比帮助读者理解两者的设计目的和使用场景。

1、结构体是值类型,存储在栈上,类是引用类型,存储在托管堆上,结构体在声明的时候就已经为其分配栈上的内存了,而类需要用 new为其分配堆上面的内存;
2、结构体是隐式密封的,不能用 sealed 和 abstract 修饰,结构体不能被继承,类可以被继承;

3、结构体中的实例字段只能声明,不能赋值,而类没有限制,结构体只声明没有用 new 进行初始化时,可以给他的实例字段赋值,而类不行;

4、结构体没有析构函数,结构体中的方法不能用 virtual 和 abstract 修饰,但是可以用 override 修饰,用来重写父类的方法;

5、结构体不能显示给出默认构造函数(无参数的构造),无论有没有自定义构造,默认构造都隐式存在,而类中有自定义构造函数时,默认构造会被隐藏,要想调用默认构造,必须显示给出默认构造。

6、结构体的自定义构造函数必须初始化所有的实例字段和没有初始化的非静态属性,类没有限制。

### 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] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值