CA2214: Geen overschrijfbare methoden in constructors aanroepen
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2214 |
Titel | Overschrijfbare methoden in constructors niet aanroepen |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
De constructor van een niet-verzegeld type roept een virtuele methode aan die is gedefinieerd in de klasse.
Beschrijving van regel
Wanneer een virtuele methode wordt aangeroepen, wordt het werkelijke type dat de methode uitvoert pas geselecteerd als de uitvoeringstijd is uitgevoerd. Wanneer een constructor een virtuele methode aanroept, is het mogelijk dat de constructor voor het exemplaar dat de methode aanroept, niet is uitgevoerd. Dit kan leiden tot fouten of onverwacht gedrag, als een overschreven virtuele methode afhankelijk is van initialisatie en andere configuratie in de constructor.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, roept u de virtuele methoden van een type niet aan vanuit de constructors van het type.
Wanneer waarschuwingen onderdrukken
Een waarschuwing van deze regel niet onderdrukken. De constructor moet opnieuw worden ontworpen om de aanroep naar de virtuele methode te elimineren.
Opmerking
In het volgende voorbeeld ziet u het effect van het schenden van deze regel. De testtoepassing maakt een exemplaar van DerivedType
, waardoor de basisklasseconstructor (BadlyConstructedType
) wordt uitgevoerd. BadlyConstructedType
De constructor roept de virtuele methode DoSomething
onjuist aan. Zoals in de uitvoer wordt weergegeven, DerivedType.DoSomething()
wordt uitgevoerd voordat DerivedType
de constructor wordt uitgevoerd.
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
In dit voorbeeld wordt de volgende uitvoer gegenereerd:
Calling base ctor.
Derived DoSomething is called - initialized ? No
Calling derived ctor.