类和结构
类和结构都是创建对象的模版,每个对象包含数据,并提供处理和访问数据的方法。结构不同于类,因为结构不需要在堆上分配空间。类是引用类型,总是存储在堆(heap)上;结构是值类型,通常存储在栈(stack)上。而且结构不支持继承。
类和结构的重要区别:类类型的对象通过引用传递,结构类型的对象按值传递。
1.类
类包含有成员,成员可以是静态或者实例成员。静态成员属于类;而实例成员属于对象。静态字段的值对每个对象都是相同的,而每个对象的实例字段都可以有不同的值。静态成员关联static修饰符。
1.1构造函数初始化器
C#构造函数初始化器可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用(使用相同的语法,但应使用base关键字代替this)
初始化器中不能有多个调用。
this关键字仅调用参数最匹配的那个构造函数,构造函数初始化器在构造函数的函数体之前执行。
public Car(string description, uint nWheels)
{
_description = description;
_nWheels = nWheels;
}
public Car(string description ):this(description, 4) { }
2.结构
结构为值类型,不是引用类型。结构存储在栈中或存储为内联(如果它们是存储在堆中的另一个对象的一部分),其生存期的限制与简单的数据类型一样。结构不支持继承。
因为结构是值类型,所以new运算符与类和其他引用类型的工作方式不同。new运算符并不分配堆中的内存,只调用相应的构造函数,根据传送给他的参数初始化所有字段。
2.1结构的继承链
结构的继承链:每个结构派生自System.ValueType
类,System.ValueType
类又派生自System.Object。
ValueType
并没有给Object添加任何新成员,但提供了一些更适合结构的实现方式。
3.结构和类的传递
public static void ChangeA(A a)
{
a.X = 2;
}`
`static void Main()
{
A a1 = new A { X = 1 };
ChangeA(a1);
WriteLine($"a1.X: {a1.X}");
}
结构按值传递,通过按值传递,ChangeA
方法中的变量a得到堆栈中变量a1
的一个副本,在方法ChangeA
的最后修改、销毁副本之后,a1
的内容从不改变。
类按引用传递,a变量把堆上的同一个对象引用为变量a1
,当ChangeA
修改a的X属性值时,把它改为a1.X
,因为它是同一个对象。