在了解C#中的数据类型之前,先引入两个概念:
Stack线程栈:栈由操作系统管理,存放用于存放值类型和引用类型在托管堆上的地址。栈式基于线程,一个线程包含一个栈。
GCHeap堆: 进程初始化后在进程地址上划分的内存空间,用于存储.NET运行时对象,由GC管理和释放。
以下为值类型引用类型表
下面这个类的构造函数
public Text()
{
int i = 1;
}
其中 i 这个整型变量就是存储在栈上面。
再比如说一个类 Test,由上面我们可以知道的是,类是一个引用类型,在内存的Heap堆地址中存放,而且类中的所有字段、属性均存放在堆中,而不是栈。
class Test {
public int a;
public int A { get; set; }
public string str;
}
这个类一旦被实例化,所有的成员都存放在堆内存中。
了解了这么多,那么值类型和引用类型具体有什么区别呢?
1赋值方式不同:将一个值类型赋值给拎一个值类型时,是直接赋值该变量的值进行传递,引用类型则是传递在堆上的地址。
2继承 :值类型无法派生出新的类型,而且所有的值类型都默认继承System.ValueType,但结构是可以继承接口的。下面就是一个结构体继承了接口,实现接口中的一个方法、一个属性、一个索引器。
interface IFly {
public void Fly();
public string Name { get; set; }
int this[int index] {
get;
set;
}
}
struct Test : IFly
{
public int this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public string Name { get; set; }
public void Fly()
{
}
}
3.默认值:每个值类型都有一个默认的构造函数,默认值为0,引用类型默认为null。
4.存储位置 不用多说了吧?