Share via


CA2214:不要在构造函数中调用可重写的方法

类型名

DoNotCallOverridableMethodsInConstructors

CheckId

CA2214

类别

Microsoft.Usage

是否重大更改

原因

非密封类型的构造函数调用其类中定义的虚方法。

规则说明

调用虚方法时,直到运行时之前都不会选择执行该方法的实际类型。 构造函数调用虚方法时,可能尚未执行调用该方法的实例的构造函数。

如何解决冲突

要修复与该规则的冲突,请不要从某类型的构造函数中调用该类型的虚方法。

何时禁止显示警告

不要禁止显示此规则发出的警告。 应重新设计该构造函数,以取消对虚方法的调用。

示例

下面的示例演示与该规则冲突产生的影响。 测试应用程序创建 DerivedType 的实例,使其基类 (BadlyConstructedType) 构造函数开始执行。 BadlyConstructedType 的构造函数错误地调用虚方法 DoSomething。 如输出所示,DerivedType.DoSomething() 将执行,并且是在 DerivedType 的构造函数执行前开始执行。


Imports System

Namespace UsageLibrary

Public Class BadlyConstructedType
    Protected initialized As String = "No"


    Public Sub New()
        Console.WriteLine("Calling base ctor.")
        ' Violates rule: DoNotCallOverridableMethodsInConstructors.
        DoSomething()
    End Sub 'New

    ' This will be overridden in the derived type.
    Public Overridable Sub DoSomething()
        Console.WriteLine("Base DoSomething")
    End Sub 'DoSomething
End Class 'BadlyConstructedType


Public Class DerivedType
    Inherits BadlyConstructedType

    Public Sub New()
        Console.WriteLine("Calling derived ctor.")
        initialized = "Yes"
    End Sub 'New

    Public Overrides Sub DoSomething()
        Console.WriteLine("Derived DoSomething is called - initialized ? {0}", initialized)
    End Sub 'DoSomething
End Class 'DerivedType


Public Class TestBadlyConstructedType

    Public Shared Sub Main()
        Dim derivedInstance As New DerivedType()
    End Sub 'Main
End Class 
End Namespace
using System;

namespace UsageLibrary
{
    public class BadlyConstructedType
    {
        protected  string initialized = "No";

        public BadlyConstructedType()
        {
            Console.WriteLine("Calling base ctor.");
            // Violates rule: DoNotCallOverridableMethodsInConstructors.
            DoSomething();
        }
        // This will be overridden in the derived type.
        public virtual void DoSomething()
        {
            Console.WriteLine ("Base DoSomething");
        }
    }

    public class DerivedType : BadlyConstructedType
    {
        public DerivedType ()
        {
            Console.WriteLine("Calling derived ctor.");
            initialized = "Yes";
        }
        public override void DoSomething()
        {
            Console.WriteLine("Derived DoSomething is called - initialized ? {0}", initialized);
        }
    }

    public class TestBadlyConstructedType
    {
        public static void Main()
        {
            DerivedType derivedInstance = new DerivedType();
        }
    }
}

该示例产生下面的输出。