博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《你必须知道的.NET》读后小结(4)
阅读量:7015 次
发布时间:2019-06-28

本文共 2682 字,大约阅读时间需要 8 分钟。

  今天给大家扫一下.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

你可能感兴趣的文章
rpm命令如何打印调试信息?
查看>>
C#语言学习--基础部分(二) 方法重载
查看>>
深入学习Hive应用场景及架构原理
查看>>
HDU_1143_tri tiling
查看>>
codeforces_1075_C. The Tower is Going Home
查看>>
C# 关于XML的简单操作实例
查看>>
ggplot2:画世界地图和中国地图 合并数据 增添信息 标记
查看>>
VertexBuffer渲染次序
查看>>
python中使用 xpath
查看>>
集中管理:领导者,不能不考虑的几件事之—— 拿什么辅助你,我的决策?(一)...
查看>>
关于VirtualBox虚拟机安装GhostXP出现蓝屏proce***.sys 的解决办法
查看>>
JSP如何在servlet将一个数据模型对象传递给jsp页面
查看>>
PHP 实现“贴吧神兽”验证码
查看>>
根据一个表的数据情况显示另一个表的数据
查看>>
TP4056大电流1A使用注意事项
查看>>
Java常考面试题(四)
查看>>
学习Javascript闭包(Closure)
查看>>
你性格那么软,总是经常改变想法
查看>>
NeHe OpenGL教程 第十七课:2D图像文字
查看>>
学习SpringMVC——从HelloWorld开始
查看>>