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();
}
}
}
この例を実行すると、次の出力が生成されます。