今天给大家扫一下.Net的盲。到底有哪些东西呢。2012-03-16
const&readonly:
记得那时候,我同事给我写了一个关于const和readonly的区别。一句话,一个编译时确定变量的值,一个是运行时确定变量的值。但是不太具体,只是最主要的一个区别。详细讲:
- private const string str = "123"; // const 必须在定义时指定初始化。
- private const object = new object(); // const 不能使用new运算初始化一个const常量,即使该数据是一个值类型,因为new运算符总是运行时才能确定,对于引用类型除string外,必须初始化为null。
- private static const string astr = "abc"; private const string str = astr + "efg"; // 编译错误,str必须确定于编译时,解决方法是astr声明为const,或者str声明为readonly。
- public void Fun(){ readonly const string myName = "Zhao";} // readonly不能在局部变量中使用,而const可以定义字段常量和局部常量。
- public class MyClass{ private static readonly string RCSTRING = "123"; public static MyClass(string str){ RCSTRING = str;}} // 静态只读字段必须在定义时,或者静态无参构造函数中进行。
用一段代码总结以上几点:
1 class Program 2 { 3 private const string astr = "abc"; 4 private const string str = astr + "efg"; 5 private readonly int int1 = 1; 6 private readonly int int2; 7 private static readonly string rs = "123"; 8 9 public Program() 10 { 11 int1 = 2; 12 int2 = 3; 13 } 14 15 static Program() 16 { 17 rs = "234"; 18 } 19 20 static void Main(string[] args) 21 { 22 Program p = new Program(); 23 Console.WriteLine(astr); 24 Console.WriteLine(str); 25 Console.WriteLine(rs); 26 Console.WriteLine(p.int1); 27 Console.WriteLine(p.int2); 28 } 29 }
Output:abc abcefg 234 2 3
我们将代码使用IL查看,const常量被定义为private static literal,可见const常量会自动编译为static成员,因此const常量是静态常量,确定于编译时,属于类型级。 readonly被定义为private initonly,为非静态常量。而static readonly常量被定义为private static initonly,为类型级。const常量编译后保存在模块的元数据中,而readonly常量需要分配独立存储空间。
class&struct:
引用类型和值类型的区别,就不细讲了。- -。
接口&抽象类:
相同点
- 都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点
- 接口支持多继承;抽象类不能实现多继承。
- 接口只能定义抽象规则; 抽象类既可以定义规则,还可以提供已实现的成员。
- 接口可以用于支持回调;抽象类在实现回调时有局限型。
- 接口只包含方法、属性、索引器、事件的签名;抽象类可以定义字段、属性、包含有实现的方法。
- 接口默认为public;abstract方法不能为private,但可以为public或protected。
is&as:
is:
- is返回true或false。
- 不会抛出异常。
- 如果对象为null,则永远返回false。
as:
- 检查对象类型的兼容性,并返回结果。
- 不会抛出异常。
- 如果结果判断为空,则强制类型转换抛出异常。
- as必须和引用类型一起使用。
深拷贝&浅拷贝:
对象克隆,也就是类型实例的拷贝,例如值类型之间的相互赋值,引用类型的相互赋值,值类型的装箱操作等,其实都是进行对象的克隆操作。IConeable接口,可以为对象提供Clone方法。从对象克隆可分为浅拷贝和深拷贝。
浅拷贝,对象的字段拷贝,而引用对象不会被拷贝,它们公用一份实体。
深拷贝,对象的字段被拷贝,同时字段引用的对象也进行了拷贝。
对深浅拷贝的实现:
浅拷贝,class MyClass:ICloneable { public object Clone() { return MemberwiseClone(); } } // 直接使用MemberwiseClone()方法就可以。
深拷贝,class MyClass:ICloneable { public object Clone() { return new MyClass(); } } // 返回新的实例化对象。
今天到这里吧。。。自用,谢绝转载!2012-03-16