1、什么是装箱和拆箱,它们的执行步骤是什么?
装箱:把值类型转换为引用类型,首先分配托管堆内存,大小为值类型实例大小加方法指针大小,接着将值类型实例字段拷贝到新分配的内存中,最后返回托管堆中对象的内存地址。
拆箱:把引用类型转换为值类型,首先检查对象实例,确保它是给定值类型的装箱值,然后将这个值从实例中复制到值类型变量中。
2、overload (重载)和 override (重写)的区别
重载是方法名相同但参数或参数类型不同,通过多次重载以适应不同的需求,是面向对象的概念。重写是对基类中虚方法的重写,是面向对象的概念。
3、讲解一下 static
对于字段和方法使用 static 修饰,成为静态成员,通过类名加访问操作符进行访问,未使用 static 修饰的字段和方法称为非静态成员或实例成员。静态字段在内存中只有一个拷贝,非静态字段在每个实例对象中都会有一个拷贝。无论方法是否为静态,在内存中就只会有一份拷贝,唯一的区别就是通过类名来访问还是通过实例来访问。
4、成员变量和成员函数前加 static 的作用
用来反映类状态,例如统计类实例数,类成员函数负责这种统计。
5、索引器的实现过程,是否只能根据数字进行索引
C#通过提供索引器,可以象处理数组一样处理对象。特别是属性,每一个元素都以一个get或set方法暴露。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关, 索引器最大的好处是使代码看上去更自然,更符合实际的思考模式。微软官方一个示例:索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。在下面的示例中,定义了一个泛型类(class SampleCollection ),并为其提供了简单的 get 和 set访问器 方法(作为分配和检索值的方法)。Program 类为存储字符串创建了此类的一个实例。
6、abstract 修饰的类和 interface 的区别
abstract 声明抽象类抽象方法,一个类中如果包含抽象方法,那这个类就是抽象类,所谓的抽象方法就是不提供实现的方法,必须由继承者重写,因此抽象类不可实例化,只能通过继承被子类重写。
interface 声明接口,它只提供一个方法归于,不能用 public 、 abstract 等修饰,没有字段没有常量以及构造函数。
区别:
- interface 不能有字段,但是 abstract 声明的抽象类可以有;
- interface 不能有 public 等访问修饰符,但是 abstract 可以有;
- interface 可以实现多继承。
7、sealed 修饰的类的特点
密封,不能继承
8、string str=null 、 string str="" 和 string str=string.Empty 的区别
string.Empty 相当于"",Empty 是静态只读字段,string str="" 初始对象并分配一个空字符串的内存空间,string str=null 初始化对象但是不分配内存空间。
9、byte b=‘a’ 、byte c=1 、byte=‘ab’、byte e=‘我’、 byte g=256 有什么错误?
1 byte 等于 8bit ,1个汉字等于 2byte ,1个英文等 1byte 等于 8bit 因此 bc是对的,de 错误,c# 中 byte 取值范围为 0-255 因此 g 错误。
10、string 和 StringBuilder 的区别,以及性能比较
StringBuilder 默认容量是16,可以扩充容量,每个 StringBuilder 对象都有一个缓冲区容量,当字符串大小没有超过容量时不会分配新的容量,当字符串容量超过缓冲区容量时会自动增加容量,一般来说在进行简单字符串连接操作时应该使用 string ,因为 StringBuilder 对象的创建会消耗大量的性能并且在扩充容量的时候也会消耗一定的性能。