nödvändig modifierare (C#-referens)

Modifieraren required anger att fälteteller egenskapen som den tillämpas på måste initieras av en objektinitierare. Alla uttryck som initierar en ny instans av typen måste initiera alla nödvändiga medlemmar. Modifieraren required är tillgänglig från och med C# 11. Med required modifieraren kan utvecklare skapa typer där egenskaper eller fält måste initieras korrekt, men ändå tillåta initiering med hjälp av objektinitierare. Flera regler säkerställer det här beteendet:

  • Modifieraren required kan tillämpas på fält och egenskaper som deklareras i struct, och class typer, inklusive record och record struct typer. Modifieraren required kan inte tillämpas på medlemmar i en interface.
  • Explicita gränssnittsimplementeringar kan inte markeras som required. De kan inte anges i objektinitierare.
  • Obligatoriska medlemmar måste initieras, men de kan initieras till null. Om typen är en referenstyp som inte kan nulliseras utfärdar kompilatorn en varning om du initierar medlemmen till null. Kompilatorn utfärdar ett fel om medlemmen inte initieras alls.
  • Obligatoriska medlemmar måste vara minst lika synliga som deras innehållande typ. En klass kan till exempel public inte innehålla ett required fält som är protected. Dessutom måste obligatoriska egenskaper ha setters (set eller init accessorer) som är minst lika synliga som deras innehållande typer. Medlemmar som inte är tillgängliga kan inte anges med kod som skapar en instans.
  • Härledda klasser kan inte dölja en required medlem som deklarerats i basklassen. Om du döljer en obligatorisk medlem hindras anropare från att använda objektinitierare för den. Dessutom måste härledda typer som åsidosätter en obligatorisk egenskap inkludera required modifieraren. Den härledda typen kan inte ta bort tillståndet required . Härledda typer kan lägga till required modifieraren när du åsidosättar en egenskap.
  • En typ med medlemmar required får inte användas som ett typargument när typparametern innehåller villkoret new() . Kompilatorn kan inte framtvinga att alla nödvändiga medlemmar initieras i den allmänna koden.
  • Modifieraren required tillåts inte i deklarationen för positionsparametrar i en post. Du kan lägga till en explicit deklaration för en positionsegenskap som innehåller required modifieraren.

Vissa typer, till exempel positionsposter, använder en primär konstruktor för att initiera positionsegenskaper. Om någon av dessa egenskaper innehåller required modifieraren lägger den primära konstruktorn till attributet SetsRequiredMembers . Detta indikerar att den primära konstruktorn initierar alla nödvändiga medlemmar. Du kan skriva en egen konstruktor med attributet System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute . Kompilatorn verifierar dock inte att dessa konstruktorer initierar alla nödvändiga medlemmar. Attributet hävdar i stället för kompilatorn att konstruktorn initierar alla nödvändiga medlemmar. Attributet SetsRequiredMembers lägger till dessa regler till konstruktorer:

  • En konstruktor som kedjar till en annan konstruktor som kommenterats med SetsRequiredMembers attributet, antingen this(), eller base(), måste också innehålla SetsRequiredMembers attributet. Det säkerställer att anropare kan använda alla lämpliga konstruktorer korrekt.
  • Kopieringskonstruktorer som genereras för record typer har SetsRequiredMembers attributet tillämpat om någon av medlemmarna är required.

Varning

SetsRequiredMembers Inaktiverar kompilatorns kontroller att alla required medlemmar initieras när ett objekt skapas. Använd den med försiktighet.

Följande kod visar en klasshierarki som använder required modifieraren för FirstName egenskaperna och LastName :

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName) =>
        (FirstName, LastName) = (firstName, lastName);

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

Mer information om nödvändiga medlemmar finns i funktionsspecifikationen C#11 – Obligatoriska medlemmar .