1.C#中堆和栈的区别?
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,系统自动分配和维护;堆:是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC清理。使用引用类型的时候,一般是对指针进行的操作而非引用类型对象本身。但是值类型则操作其本身
2.C#中的委托是什么?事件是不是一种委托?
委托的本质是一个类,委托是将一种方法作为参数代入到另一种方法。事件是委托的实例,事件是一种特殊的委托。//比如:onclick事件中的参数就是一种方法。
3.C#静态构造函数特点是什么?
最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数执行顺序:静态变量>静态构造函数>实例变量>实例构造函数
4.CTS、CLS、CLR分别作何解释
CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。CTS:Common Type System 通用类型系统。Int32、Int16→int、String→string、Boolean→bool。每种语言都定义了自己的类型,.NET通过CTS提供了公共的类型,然后翻译生成对应的.NET类型。CLS:Common Language Specification 通用语言规范。不同语言语法的不同。每种语言都有自己的语法,.NET通过CLS提供了公共的语法,然后不同语言翻译生成对应的.NET语法。CLR:Common Language Runtime 公共语言运行时,就是GC、JIT等这些。有不同的CLR,比如服务器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相当于一个发动机,负责执行IL。
5.C#中什么是值类型与引用类型?
值类型:struct、enum、int、float、char、bool、decimal引用类型:class、delegate、interface、array、object、string
6.请详述在C#中类(class)与结构(struct)的异同?
class可以被实例化,属于引用类型,class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的.
7.new关键字的作用
运算符:创建对象实例修饰符:在派生类定义一个重名的方法,隐藏掉基类方法约束:泛型约束定义,约束可使用的泛型类型
8.int?和int有什么区别
int?为可空类型,默认值可以是nullint默认值是0int?是通过int装箱为引用类型实现
9.C#中值传递与引用传递的区别是什么?
值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应地复制给形参,此后,被调用方法中形参值得任何改变都不会影响到相应的实参;
引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方法体内相应形参值得任何改变都将影响到作为引用传递的实参。
简而言之,按值传递不是值参数是值类型,而是指形参变量会复制实参变量,也就是会在栈上多创建一个相同的变量。而按引用传递则不会。可以通过 ref 和 out 来决定参数是否按照引用传递。
10.C#中参数传递 ref 与 out 的区别?
(1)ref指定的参数在函数调用时必须先初始化,而out不用(2)out指定的参数在进入函数时会清空自己,因此必须在函数内部进行初始化赋值操作,而ref不用总结:ref可以把值传到方法里,也可以把值传到方法外;out只可以把值传到方法外注意:string作为特殊的引用类型,其操作是与值类型看齐的,若要将方法内对形参赋值后的结果传递出来,需要加上ref或out关键字。
11.C#中什么是装箱和拆箱?
装箱:把值类型转换成引用类型拆箱:把引用类型转换成值类型装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。(1)第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针。(2)第二步:将值类型的实例字段拷贝到新分配的内存中。(3)第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
拆箱:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。在装箱时是不需要显式的类型转换的,不过拆箱需要显式的类型转换。int i=0;System.Object obj=i; //这个过程就是装箱!就是将 i 装箱!int j=(int)obj;//这个过程 obj 拆箱!
12.C#实现多态的过程中 overload 重载 与override 重写的区别?
override 重写与 overload 重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要override 是进行基类中函数的重写。实现多态。重载:是方法的名称相同,参数或参数类型不同;重载是面向过程的概念。重写:是对基类中的虚方法进行重写。重写是面向对象的概念。
13.C# 中static关键字的作用?
对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符“.”进行访问; 对类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。注: 静态字段在内存中只有一个拷贝,非静态字段则是在每个实例对象中拥有一个拷贝。而方法无论是否为静态,在内存中只会有一份拷贝,区别只是通过类名来访问还是通过实例名来访问。
14.C# 成员变量和成员函数前加static的作用?
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。不用new
15.C