解释 .NET 中的自定义值类型


值类型的变量直接包含值。当您将一个值类型变量赋值给另一个变量时,每个变量都关联着内存中不同的存储位置。因此,更改一个值类型变量的值不会影响第二个变量的值。

类似地,当您将值类型的实例传递给方法时,编译器会将与参数关联的内存复制到与参数关联的新位置。对参数的任何更改都不会影响原始值。由于值类型会复制内存,因此它们应该很小(通常小于 16 字节)。

所有 C# 内置类型(例如 int、bool 等)都是值类型,除了 string 和 object,它们是引用类型。您还可以使用自定义值类型创建自己的值类型。C# 中有两种自定义值类型:结构体和枚举。

结构体

结构体在语法上类似于类和接口,只是它们在类型名称之前使用关键字 struct。与类类似,结构体可以包含字段、属性、方法和构造函数。例如,名为 Point 的结构体可以定义如下。

struct Point{
   public int X { get; set; }
   public int Y { get; set; }
}

结构体中的构造函数必须初始化结构体内的所有字段和属性。这样做是为了确保值类型变量由构造函数完全初始化。未能初始化结构体内的所有数据会导致编译时错误。

所有结构体类型都派生自 System.ValueType,并且默认情况下是密封的。这意味着您不能从结构体继承。结构体类型可以实现接口。

枚举

枚举是一种值类型,您可以使用一组命名常量来声明它。要定义枚举类型,请使用 enum 关键字后跟其成员的名称。

enum Protocol{
   TCP,
   IP,
   UDP
}

默认情况下,枚举成员的值是整数。第一个枚举值的值为 0,每个后续条目递增 1。此外,您可以显式地将值设置为您选择的整数。

enum Protocol{
   TCP = 0,
   IP = 50,
   UDP = 100
}

无法在枚举类型内定义方法。但是,使用扩展方法,您仍然可以向枚举类型添加行为。

枚举的一个重要特性是它在运行时声明了一组可能的常数值,并使代码更易于阅读。例如,您可以使用枚举替换布尔值,如下所示。

SetState(true);
// vs.
SetState(DeviceState.On);

更新于:2021年5月19日

1000+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告