首页 > 代码库 > 值类型和引用类型的区别?
值类型和引用类型的区别?
1、值类型和引用类型的区别?
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用(快捷方式),而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
2、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;函数的参数值,局部变量的值等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
1 //堆和栈的区别可以用如下的比喻来看出: 2 3 //使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 4 5 //使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
3、int、DateTime、string是否可以为null?
null表示“不知道”,而不是“没有”。没有年龄和不知道年龄是不一样。
数据库中null不能用0表示。0岁和不知道多少岁不一样。
Sex is zero。《色即是空》
1 //int i1 = null; //错误的 2 3 //int? i2 = null;//正确的,值类型后加?就成了可空数据类型 4 5 //int i3 = i2;//错误的,所以把可空的赋值给一定不能为空的会报错。 6 7 //int i4 = (int)i2;//显式转换,由程序员来保证“一定不为空” 8 9 //int? i5 = i4;//一定会成功!非可空类型一定会成功赋值给可空类型 10 11 12 //using()→try{]catch{}finally{} 13 14 15 //int?是微软的一个语法糖。是一种和int没有直接关系的(Nullable类型) 16 Nullable<int> d1 = new Nullable<int>();//int? d1=null; 17 18 Nullable<int> d2 = new Nullable<int>(3);//int? d2=3; 19 20 Console.WriteLine(d1==null);
int、DateTime不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null。string可以为null。
C#中int等值类型不可以为null、而数据库中的int可以为null,这就是纠结的地方。int?就变成了可空的int类型。bool?、DateTime?
1 int i1 = 3; 2 3 int? i2 = i1; 4 5 //int i3 = i2;//不能把可能为空的赋值给一定不能为空的变量 6 7 int i3 = (int)i2;//显式转换,由程序员来保证“一定不为空”
可空数据类型经典应用场景:三层中的Model属性的设计。
int?翻译生成.Net的Nullable<int>,CTS(Common type system),就是CLR能够支持所有的功能!用集合说是一个全集。
4、在dotnet中类(class)与结构(struct)的异同?
Class可以被实例化,属于引用类型,是分配在内存的堆上的;类类型是引用传递的。
Struct属于值类型,是分配在内存的栈(值得一栈)上的。结构体是复制传递的。加分的回答:Int32、Boolean等都属于结构体。