CA2214: Jangan panggil metode yang dapat diganti dalam konstruktor
Properti | Nilai |
---|---|
ID Aturan | CA2214 |
Judul | Jangan panggil metode yang dapat diganti dalam konstruktor |
Golongan | Penggunaan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 8 | Tidak |
Penyebab
Konstruktor jenis yang tidak disegel memanggil metode virtual yang ditentukan di kelasnya.
Deskripsi aturan
Ketika metode virtual dipanggil, jenis aktual yang menjalankan metode tidak dipilih sampai durasi. Ketika konstruktor memanggil metode virtual, ada kemungkinan bahwa konstruktor untuk instans yang memanggil metode belum dijalankan. Ini dapat menyebabkan kesalahan atau perilaku tak terduga, jika metode virtual yang ditimpa bergantung pada inisialisasi dan konfigurasi lain di konstruktor.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, jangan panggil metode virtual jenis dari dalam konstruktor jenis.
Kapan harus menekan peringatan
Jangan menyembunyikan peringatan dari aturan ini. Konstruktor harus dirancang ulang untuk menghilangkan panggilan ke metode virtual.
Contoh
Contoh berikut menunjukkan efek melanggar aturan ini. Aplikasi pengujian membuat instans DerivedType
, yang menyebabkan konstruktor kelas dasarnya (BadlyConstructedType
) dijalankan. BadlyConstructedType
Konstruktor salah memanggil metode DoSomething
virtual . Seperti yang ditunjukkan oleh output, DerivedType.DoSomething()
dijalankan sebelum DerivedType
konstruktor dijalankan.
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 Main2214()
{
DerivedType derivedInstance = new DerivedType();
}
}
Imports System
Namespace ca2214
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 Main2214()
Dim derivedInstance As New DerivedType()
End Sub 'Main
End Class
End Namespace
Contoh ini menghasilkan output berikut:
Calling base ctor.
Derived DoSomething is called - initialized ? No
Calling derived ctor.