1. const和readonly有什么区别?
const关键字用来声明编译时常量,readonly用来声明运行时常量。都可以标识一个常量,主要有以下区别:
1、初始化位置不同。const必须在声明的同时赋值;readonly即可以在声明处赋值,也可以在构造方法里赋值。
2、修饰对象不同。const即可以修饰类的字段,也可以修饰局部变量;readonly只能修饰类的字段 。
3、const是编译时常量,在编译时确定该值,且值在编译时被内联到代码中;readonly是运行时常量,在运行时确定该值。
4、const默认是静态的;而readonly如果设置成静态需要显示声明 。
5、支持的类型时不同,const只能修饰基元类型或值为null的其他引用类型;readonly可以是任何类型。
2. 哪些类型可以定义为常量?常量const有什么风险?
基元类型或值为null的其他引用类型,常量的风险就是不支持跨程序集版本更新,常量值更新后,所有使用该常量的代码都必须重新编译。
3. 字段与属性有什么异同?
- 属性提供了更为强大的,灵活的功能来操作字段
- 出于面向对象的封装性,字段一般不设计为Public
- 属性允许在set和get中编写代码
- 属性允许控制set和get的可访问性,从而提供只读或者可读写的功能 (逻辑上只写是没有意义的)
- 属性可以使用override 和 new
4. 静态成员和非静态成员的区别?
- 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。
- 不带有static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 。
- 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 。
- 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
5. 自动属性有什么风险?
因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。
6. 特性是什么?如何使用?
特性与属性是完全不相同的两个概念,只是在名称上比较相近。Attribute特性就是关联了一个目标对象的一段配置信息,本质上是一个类,其为目标元素提供关联附加信息,这段附加信息存储在dll内的元数据,它本身没什么意义。运行期以反射的方式来获取附加信息。使用方法可以参考:http://www.cnblogs.com/anding/p/5129178.html
7. 下面的代码输出什么结果?为什么?
List<Action> acs = new List<Action>(5); for (int i = 0; i < 5; i++) { acs.Add(() => { Console.WriteLine(i); }); } acs.ForEach(ac => ac());
输出了 5 5 5 5 5,全是5!因为闭包中的共享变量i会被提升为委托对象的公共字段,生命周期延长了
8. C#中的委托是什么?事件是不是一种委托?
什么是委托?简单来说,委托类似于 C或 C++中的函数指针,允许将方法作为参数进行传递。
- C#中的委托都继承自System.Delegate类型;
- 委托类型的声明与方法签名类似,有返回值和参数;
- 委托是一种可以封装命名(或匿名)方法的引用类型,把方法当做指针传递,但委托是面向对象、类型安全的;
事件可以理解为一种特殊的委托,事件内部是基于委托来实现的。
版权所有,文章来源:http://www.cnblogs.com/anding
个人能力有限,本文内容仅供学习、探讨,欢迎指正、交流。