引用类型与值类型
C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
下面用一个实例来看一下引用类型和值类型的区别:
class Program
{
static void Main(string[] args)
{
ClassDemo obj1 = new ClassDemo();
obj1.x = 10;
ClassDemo obj2 = obj1;
obj1.x = 20;
Console.WriteLine(obj2.x);
StructDemo o1 = new StructDemo();
o1.x = 10;
StructDemo o2 = o1;
o1.x = 20;
Console.WriteLine(o2.x);
Console.ReadKey();
}
}
class ClassDemo
{
public int x;
}
struct StructDemo
{
public int x;
}
类是引用类型,在把类对象赋予变量时,实际上是把带有一个指针的变量给了该对象。在实际代码中,指针是内存中的一个地址。在把第一个对象引用赋给类别为ClassDemo的第二个变量时,实际上是复制了这个地址。这样两个变量就包含同一个对象的指针。
结构式值类型,创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
因此输出结果是:20,10
在此说下类与结构的区别:
1.类是引用类型 (继承system.object),结构式值类型(system.valueType)
2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
3.内部结构:
结构:
没有默认的构造函数,但是可以添加构造函数 没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化 在结构中初始化实例字段是错误的
类:
有默认的构造函数 有析构函数
可以使用 abstract 和 sealed
有protected 修饰符 必须使用new 初始化
如何选择类还是结构:
1.在表现抽象和多级别的对象层次时,类是最好的选择
2.大多数情况下该类型只是一些数据时,结构时最佳的选择