C#中结构(struct)与类(class)的核心区别及使用

Dylan
Dylan
发布时间:2026-10-13 | 4人浏览过
原创

在C#开发中,理解值类型(结构 struct)与引用类型(类 class)的差异是掌握面向对象编程的基础。两者虽都用于封装数据和行为,但在内存管理、继承支持及构造规则上存在显著不同:结构轻量且无继承,适合小型数据载体;类功能完整且支持继承,是构建复杂对象的核心。本文通过代码实例深入解析两者的声明格式、使用限制及实际应用场景。

结果或目标

明确 C# 中结构 (struct) 与类 (class) 的定义机制、内存行为差异,并掌握如何在实际编码中正确声明和实例化这两种类型。

准备条件

  1. 已安装 .NET Framework 或 .NET Core/5+ 开发环境。

  2. 具备基础的 C# 语法知识,如命名空间、方法定义及变量声明。

真实操作顺序

第1步:理解结构与类的核心差异

目的:建立对两种类型的底层认知,避免在错误场景使用导致性能浪费或逻辑错误。

关键点说明:

  • 存储位置:结构是值类型,变量直接包含数据本身,无需堆分配(Heap Allocation),赋值时发生值拷贝。类是引用类型,变量仅存储指向堆内存中对象的引用(指针),数据存储在堆上。

  • 适用场景:结构适用于小型、简单的数据结构(如复数、坐标点、键值对),要求具有“值语义”(Value Semantics)。类适用于需要继承、多态或包含大量数据的复杂对象。

  • 继承限制:类支持单继承,可被扩展为基类或派生类。结构不支持继承(除了隐式继承自 System.ValueType),也不能作为基类。

第2步:声明与使用结构 (Struct)

入口:使用 struct 关键字定义。

动作与参数:

  1. 声明格式:

    修饰符 struct 结构名
    {
        // 结构主体
    };
    

    修饰符包括 public, internal 等,但不能用于实例字段或方法的访问控制(结构成员默认始终为 public,但可通过属性控制封装)。

  2. 构造函数限制:

    • 严禁定义无参数构造函数:在结构中显式定义默认(无参)构造函数是错误的。
    • 字段初始化:不能在声明时直接初始化实例字段,必须在参数化构造函数中或通过赋值完成。
  3. 实例化方式:

    • 使用 new:调用相应的构造函数进行初始化。
    • 不使用 new:可直接声明变量。此时所有字段在未赋值前处于未定义状态,对象不可用,直到所有字段被显式赋值。

代码示例:创建一个结构来计算两个整数的和。

using System;

namespace Text
{
    struct Sum // 定义一个结构
    {
        public int sum(int a, int b) // 结构包含的方法
        {
            return a + b;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            int p = 10;
            int q = 10;
            
            // 创建结构对象 t,调用默认初始化
            Sum t = new Sum(); 
            
            Console.Write("{0}+{1}=", p, q);
            Console.WriteLine(t.sum(p, q)); // 调用结构中的方法
            
            // 输出结果: 10+10=20
        }
    }
}

第3步:声明与使用类 (Class)

入口:使用 class 关键字定义。

动作与参数:

  1. 声明格式:

    修饰符 class 类名 : 基类或接口
    {
        // 类体
    }
    

    修饰符包括 public, private, abstract (抽象类), sealed (密封类) 等。

  2. 构造函数与析构函数:

    • 构造函数:名称必须与类名相同,无返回值类型(连 void 都没有)。对象创建时自动执行,用于初始化。
    • 析构函数:以 ~ 开头,不能有参数或修饰符,不能手动调用。用于清理非托管资源,对象消亡时由 GC 自动触发。
  3. 继承与组合:类可以通过冒号 : 指定基类实现单继承。对象是类的实例,类是对象的模板。

  4. 实例化:通常使用 new 运算符在堆上分配内存并返回引用。

代码示例:创建类 A 并在主程序调用其方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Text
{
    class A // 创建的类
    {
        public int Sum(int i, int j) // 被类封装的方法
        {
            return i + j;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            // 创建类A的对象a
            A a = new A(); 
            int p = 10;
            int q = 10;
            
            // 调用类A的Sum方法
            Console.WriteLine(a.Sum(p, q)); 
            
            // 输出结果: 20
        }
    }
}

第4步:对比验证与排错

完成判断:运行上述两段代码,控制台均输出预期的计算结果(20),证明结构和类的实例化及方法调用正常。

常见错误排查:

  • 错误:在结构中定义无参构造函数。
    修正:移除结构的无参构造函数,若需自定义初始化逻辑,请使用带参数的构造函数或直接在赋值后初始化字段。
  • 错误:在结构中直接初始化实例字段,如 int x = 0; 放在字段声明处。
    修正:将字段声明改为 int x;,并在构造函数或使用 = 运算符时赋予初始值。
  • 错误:混淆引用类型与值类型的赋值行为。
    注意:类赋值只复制引用,修改新对象属性会影响原对象(同一实例);结构赋值复制整个数据块,修改副本不影响原结构。

简要总结

C# 的结构 (struct) 是轻量级的值类型,适合存储少量数据且不涉及继承的场景,使用时需注意其构造函数的限制。类 (class) 是引用类型,支持丰富的 OOP 特性如继承和多态,是构建应用程序逻辑的主流单元。开发者应根据数据的大小、生命周期及是否需要共享状态来选择合适的类型。

以上就是C#的结构和类的详细内容,更多关于C#编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表