上一篇: C# 字符串(String)

下一篇: C# 枚举(Enum)

C# 结构体(Struct)

结构体(Struct)是 C# 语言中一种自定义的值类型,它可以包含多个字段、属性和方法。结构体在某些情况下可以替代类,特别是当您需要一个轻量级、快速且不需要继承或引用语义的数据结构时。本教程将介绍如何在 C# 中定义和使用结构体。

定义结构体

要定义一个结构体,请使用 struct 关键字和名称来声明结构体。然后,在大括号 {} 内添加字段、属性和方法。例如:

                public struct Point
                {
                    public int X;
                    public int Y;

                    public Point(int x, int y)
                    {
                        X = x;
                        Y = y;
                    }

                    public double DistanceToOrigin()
                    {
                        return Math.Sqrt(X * X + Y * Y);
                    }
                }
                

在这个示例中,我们定义了一个名为 Point 的结构体,它具有两个整数字段(XY)以表示二维坐标系上的点,一个构造函数(用于初始化点的坐标),以及一个计算距离原点的方法(DistanceToOrigin())。

创建和使用结构体实例

创建结构体实例时,可以使用默认的无参构造函数或自定义的构造函数。但请注意,默认构造函数不会初始化字段,因此在访问未初始化的字段之前,需要显式地为其赋值。

                Point point1 = new Point(); // 使用默认构造函数创建实例
                point1.X = 3;
                point1.Y = 4;

                Point point2 = new Point(5, 6); // 使用自定义构造函数创建实例

                double distance1 = point1.DistanceToOrigin(); // 调用 DistanceToOrigin() 方法
                Console.WriteLine("Distance to origin for point1: " + distance1); // 输出: Distance to origin for point1: 5

                double distance2 = point2.DistanceToOrigin();
                Console.WriteLine("Distance to origin for point2: " + distance2); // 输出: Distance to origin for point2: 7.810249675906654
                

结构体与类的区别

结构体和类在 C# 中具有相似的特性,但它们之间存在以下关键差异:

  • 结构体是值类型,而类是引用类型。这意味着结构体赋值给另一个变量时,会发生值拷贝;而类赋值给另一个变量时,仅拷贝引用。
  • 结构体不能继承其他结构体或类,也不能被继承(但可以实现接口)。
  • 结构体不能有析构函数(Finalizer)。
  • 结构体的实例可以直接声明,而无需使用 new 关键字创建。然而,在这种情况下,必须显式地初始化每个字段。
  • 结构体中的字段不能未经初始化就被使用。

结构体的适用情况

在以下场景中,您可能需要考虑使用结构体而非类:

  • 当您需要一个轻量级的数据结构时。
  • 当您不需要引用类型的语义(例如继承、多态)时。
  • 当您不希望产生过多的堆内存分配(可能导致垃圾回收性能下降)时。

然而,请注意,当结构体变得较大时(尤其是包含多个字段或引用的情况下),使用结构体可能会降低性能。这是因为结构体是值类型,它们在作为方法参数传递时会进行值拷贝,导致额外的性能开销。