次の方法で共有


CA2214: コンストラクターのオーバーライド可能なメソッドを呼び出しません

TypeName

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();
        }
    }
}

この例を実行すると、次の出力が生成されます。