深入浅析c#中的字段

  介绍

本篇文章给大家分享的是有关深入浅析c#中的字段,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强> 1,不要为抽象类提供公开的构造方法

抽象类可以有构造方法,但是抽象类不能实例化。如果编程人员没有制定构造方法,编译器会自动生成一个默认的保护构造方法。下面是一个标准的简单抽象类:

 MyAbstractClass抽象类
  {
  保护MyAbstractClass () {}
  }

抽象类的构造方法不应该是公开或内部的。抽象类设计的本意是只能让子类继承,而不是用于生成实例对象。如果抽象类是公共或者内部的,它对于其他类型来说就是可见的,而这是不必要的,多余的。抽象类只需对子类可见即可。

<强> 2,可见字段应该重构为属性

字段与属性有本质的区别,属性是方法。如下面类的人型:

类人
  {
  公共字符串名称{;设置;}
  }

编译器针对属性名字编译后,会生成一个字段和两个方法。

属性相对于字段有如下优势:

1)可以为属性添加代码。属性是方法,所以可以在方法内对设置或获取属性的过程进行编写代码控制。如事件支持等。

2)可以让属性支持线程安全。要让属性变成线程安全的,可以让类型自身去实现。如果让字段支持线程安全,就只有依靠调用者本身实现。

3)属性得到VS编译器支持,能实现自动属性的功能。自动属性的特点在LINQ中应用十分广泛,在匿名类型中,它只能实现只读的自动属性,但字段不支持。

4)从设计的角度(面向对象),公开的字段也应该使用属性。改变字段的状态,类型不会被通知到;而改变属性的值,类型支持则会被通知。

综上,如果一个类型存在一个可见字段,那么它应该被重构为属性。如果某个属性只对内部可见,但不涉及上面4点,则建议使用字段。

<强> 3区别对待覆盖和新

覆盖和新使类型体系因为继承而呈现出多态性。多态是“面向对象语言”的三个重要特性之一。多态要求子类具有与基类方法同名的方法,而覆盖和新的的有如下作用:

1)如果子类中的方法前面带有新关键字,则该方法被定义为独立于基类的方法。

2)如果子类中的方法前面带有覆盖关键字,则子类的对象将调用该方法,而不是调用基类的方法。

如果,对于父类的方法在子类中使用了新关键字,则两个方法相互独立。此时,使用子类类型的对象调用方法时,程序执行的将是子类类型新的方法代码;而如果将子类类型转换为父类类型后,对象调用方法时将执行的是父类的方法代码。

如果使用了覆盖关键字重写方法,那么不论子类类型的对象是否转换为父类类型,调用方法时都将执行的是子类的代码。

如果对于子类中,声明与父类相同函数名称的方法,但并不使用关键字新和覆盖。编译器在编译后会提出警告,但不影响程序运行。此时,编译器会默认为是新的的效果,所以输出和显示设置与新的效果一样。

<强> 4,避免在构造方法中调用虚成员

在构造方法中调用虚成员会出现意想不到的错误。

类项目
  {
  静态void Main (string [] args)
  {
  中国中国=new ();
  }
  }
  
  类人
  {
  公众人物()
  {
  InitSkin ();
  }
  
  保护虚拟空间InitSkin ()
  {//省略
  }
  }
  
  类中:人
  {
  经济衰退;
  
  中国():公共基础()
  {
  衰退=new衰退(){Name=罢悦?};
  }
  
  保护覆盖空白InitSkin ()
  {
  Console.WriteLine (Rece.Name);
  }
  }
  
  类衰退
  {
  公共字符串名称{;设置;}
  }

运行该示例,会出现得到NullReferenceException:未将对象引用设置到对象的实例。

在调用代码中,需要创建一个中国的实例对象中国人。由中国于类型有基类的人,所以运行时首先调用基类的构造方法。在基类的构造方法中,构造函数会调用InitSkin虚方法。在程序运行时,调用的是子类的InitSkin方法。在子类的InitSkin方法中又在使用子类的衰退变量。但这个时候,子类的构造函数还没调用,因此衰退变量未实例化,但是InitSkin方法又在使用衰退变量,导致错误。

<强> 5,成员应优先考虑公开的基类型或接口

类型成员在优先考虑公开基类型或接口,会使得类型支持更多的应用场合。

深入浅析c#中的字段