上一篇: 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
的结构体,它具有两个整数字段(X
和
Y
)以表示二维坐标系上的点,一个构造函数(用于初始化点的坐标),以及一个计算距离原点的方法(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
关键字创建。然而,在这种情况下,必须显式地初始化每个字段。 - 结构体中的字段不能未经初始化就被使用。
结构体的适用情况
在以下场景中,您可能需要考虑使用结构体而非类:
- 当您需要一个轻量级的数据结构时。
- 当您不需要引用类型的语义(例如继承、多态)时。
- 当您不希望产生过多的堆内存分配(可能导致垃圾回收性能下降)时。
然而,请注意,当结构体变得较大时(尤其是包含多个字段或引用的情况下),使用结构体可能会降低性能。这是因为结构体是值类型,它们在作为方法参数传递时会进行值拷贝,导致额外的性能开销。