文档介绍:C#面试题
1. string str; string str=〃〃; string str=null;三者之间有什么区别,最好能用图形表示。
答:区别如下:
(1) string str;如果str是局部变量,编译时会忽略该变量,所以不会分配任何内存空间, 如下图。如果是类的成员变量,会被赋null空值,所以等于str=null;
堆区
栈区
string str=〃〃;堆和栈中都分配了空间,栈中保存堆中的地址,堆中为空字符串。
HE 堆区
str
市白帷地址
>
金字
(3) string str=null;H在栈中分配了指针,但该指针为空(指针的值为0)
懵区 堆区
•tr
string和StringBuilder有什么区别,在什么情况下使用StringBuilder?
答:区别如下:
string是一个不可变的字符串,如以下语句中
sring a=〃abcd”;
a="eftg〃;
语句1中a代表了栈区的指针,指向堆区的空间,堆区存放的是〃abcd〃这个字符串, string的不可变性体现在堆区中的值是不可变的,也就是说不能把堆区中的"abed"改为别 的值。在第二条语句中给a重新赋值,实质是重新在堆区分配新的内存,其中的值为新的 值〃eftg〃,并将a指向这个新的地址,也就是说第一条语句的a和第二条语句的a其实是不 同的地址。
在做大量的类似于a+=〃abcdd〃;这样的操作时string会频繁分配内存,因此速度慢。
StringBulider 通过 StringBuilder str=new StringBuilder("abcd〃);这种语句初始化,并且会 预留一些空间给将来追加字符串时使用。上面的语句用StringBuilder替换如下:
StringBuilder a=new StringBuilder("abcd");
("eftg");
两行代码中的a在栈区的值也保持了不变(也就是说堆区的地址相同),而且在预留空 间足够的情况下也不会重新分配内存,因此速度会快很多,这是一种用空间换时间的用法。
StringBuilder 一般在频繁改变字符串内容时使用。
GC是什么?为什么要有GC?
答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。 当引用类型在栈区的所有指针释放造成没有任何指针指向堆区的地址时,堆区的内存会被回 收。
public void Test()
(
object a=new object();
)
Test();
当调用Test函数进入Test函数内部时,内存如下:
当函数运行完成后,变量a的作用域已过,a因为位于栈区,会被自动弹出,此时内存 如下:
此时a已不存在,但堆区分配的内存还被占用,该内存没有任何指针指向它,这就是内 存中的垃圾。当GC启动时,会对堆区进行扫描,扫描到该内存区域时会将其销毁。
const和readonly有什么区别?
答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量 进行赋值。而readonly H能用于类的成员变量不能用于局部变量,在声明时可以不赋值, 除了在构造函数中可以再次赋值外,其它的地方和const 一样也不能赋值。
接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答
答:区别如下
抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现); 接口只有抽象成员。
一个类不能同时继承多个抽象类,一个类可以同时实现多个接口。
如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象
类的非抽象方法中,这样可以达到代码复用。当实现多个接口时因为抽象类不支持,只 能使用接口。
6. struct和class有什么区别
答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:
区别点
结构
类
类型
值类型
引用类型
成员变量
在声明时不能赋值
可以赋值也可以不赋值
构造函数
可以不写,系统提供默认构造函 数,默认构造函数中会将所有成员 值设为0,如果写了构造函数则构 造函数必须有参数,且在构造函数 中必须为每一个成员赋值。
可以不写,系统提供默认构造函 数,写了也没有结构中的限制。
析构函数
不能有析构函数
可以有析构函数
继承性
自定义的结构不能从类继承,但可 以实现接口,结构都是密封 (sealed),不能从结构继承
类没有限制
try后面一个finally, try中有一个return,那么finally中的代码会不会运行?如果运行, 是在retu