首页 > 代码库 > 值类型和引用类型的区别?

值类型和引用类型的区别?

1、值类型和引用类型的区别?

1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用(快捷方式),而不复制对象本身。

2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。

3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。 

4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

 

 

2、堆和栈的区别?

 

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;函数的参数值,局部变量的值等都在栈内存中。

 

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

1 //堆和栈的区别可以用如下的比喻来看出: 
2 
3 //使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
4 
5 //使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

3intDateTimestring是否可以为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);

 

intDateTime不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值nullstring可以为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?翻译生成.NetNullable<int>CTS(Common type system),就是CLR能够支持所有的功能!用集合说是一个全集

 

4、在dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的;类类型是引用传递的。

Struct属于值类型,是分配在内存的栈(值得一栈)上的。结构体是复制传递的。加分的回答:Int32Boolean等都属于结构体。