FxCop 的 ConstructorsShouldNotCallBaseClassVirtualMethods 规范

FxCop 中有一个rule ConstructorsShouldNotCallBaseClassVirtualMethods
那如果在构造函数中调用Virtual方法可能会产生什么样的不良后果呢?
看如下代码:

public class BaseClass {
   public int intCount=0;
   public BaseClass() {
    Increate();
   }

   public virtual  void Increate(){
    intCount++;
   }

  }

  public class SubClass: BaseClass {

   public int subCount=0;
  
   public SubClass() {
    
     Increate();

   }
   public override void Increate() {
    subCount++;
   }

  }
private void button1_Click(object sender, System.EventArgs e)
  {
   SubClass xx=new SubClass();
   MessageBox.Show(xx.intCount.ToString() +"---"+xx.subCount.ToString()  );
  }
显示的结果是 xx.intCount 是 0;xx.subCount 是 2 ;

原因是 SubClass
Increate() SubClass() 被调用之前调用了。

以上代码编译后用FxCop分析,会报如下错误提示:
CriticalWarning, Certainty 95, for "ConstructorsShouldNotCallBaseClassVirtualMethods"
{
    Target     : ".ctor()"  (IntrospectionTargetConstructor)
    Location   : "file:c:/documents and settings/administrator.hrms-xam/my documents/visual studio projects/windowsapplication1/form1.cs(30)"  (String)
    Resolution : "'BaseClass..ctor()' contains a call chain that results
                 in a call to a virtual method defined by the class.
                 Review the following call stack for unintended consequences:
                 BaseClass..ctor()BaseClass.Increate(
                 )"
... ...
.ctor() 为构造函数。

FxCop 代码警察 对于dotNet开发者是非常有用的工具,至少它可以帮助你提高你的代码质量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值