今天开始查漏补缺,看各种面试题,先从.net基础开始。
1.值类型和引用类型的区别?写出C#的样例代码。
答:值类型包括简单值类型(int、long、decimal等)、结构体类型、枚举类型。引用类型包括自定义类、数组、接口、委托等。自己记忆的话,值类型就是定义后的对象直接使用该对象的值的类型,而引用类型一般都有可以通过该对象调用的方法或属性的,就是引用类型。
赋值方式:把一个值类型赋值给另一个值类型对象时,是直接把对象的值复制过去的。而把一个引用类型赋值给另一个引用类型时,是复制对象的引用,不复制对象的本身,换句话来说复制的是对象的地址。
派生:值类型无法派生出子类,所有值类型都是派生于System.ValueType。引用类型可以派生出子类。注意一点是属于值类型的结构体类型,也可以与引用类型一样实现接口。
null:值类型不能包含null值,除非是可空值类型。比如 int? a = null
初始化:每个值类型都有一个默认的构造函数来初始化该值类型的默认值。
在内存中的存储方式:值类型存储在栈中。而引用类型存储在动态的堆中,堆可以由程序控制,随时申请和释放堆的空间(.net中的垃圾回收器GC管理的就是堆中的空间)。
样例代码:
static void Main(string[] args)
{
StringBuilder a = new StringBuilder();
var b = a;
b.Append("hjh");
Console.WriteLine("before clear,a value:" + a);
//a = null;//这里并不会清空StringBuilder的堆空间,因此a和b都还是有值的
a.Clear();//调用StringBuilder的方法清空堆,a、b对象指向的地址都被清空了
Console.WriteLine("before clear,a value:" + a);
Console.WriteLine("before clear,b value:" + b);
}