值类型的变量直接包含值。当您将一个值类型变量分配给另一个值类型变量时,每个变量都与内存中的不同存储位置相关联。因此,更改一个值类型变量的值不会影响第二个变量中的值。
同样,当您将值类型的实例传递给方法时,编译器会将与参数关联的内存复制到与参数关联的新位置。对参数的任何更改都不会影响原始值。由于内存是为值类型复制的,因此它们应该很小(通常小于 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); // 对比 SetState(DeviceState.On);