《你必须知道的.NET》读后小结(4)

  今天给大家扫一下.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;}} // 静态只读字段必须在定义时,或者静态无参构造函数中进行。

用一段代码总结以上几点:

View Code
 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

 

转载于:https://www.cnblogs.com/OliverZh/archive/2012/03/16/YouMustKnowDotNet-5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值