Dela via


obligatorisk modifierare (C#-referens)

required-modifieraren anger att -fältet eller egenskap 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. Den required modifieraren ä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:

  • Den required-modifieraren kan tillämpas på -fält och -egenskaper, som deklarerats i struct, och class-typer, inklusive record- och record struct-typer. Det går inte att använda required-modifieraren för 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 den typ de ingår i. En public-klass kan till exempel inte innehålla ett required fält som är protected. Dessutom måste obligatoriska egenskaper ha setters (set eller init-åtkomster) 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. Att dölja en obligatorisk medlem förhindrar anropare från att använda objektinitierare för den. Dessutom måste härledda typer som åsidosätter en obligatorisk egenskap innehålla required-modifieraren. Den härledda typen kan inte ta bort required tillstånd. Härledda typer kan lägga till required-modifieraren när du åsidosättar en egenskap.
  • En typ med någon required medlemmar 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.
  • Den required modifieraren 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 positionsregister, använder en primär konstruktor för att initiera positionsparametrar. 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 kedjas till en annan konstruktor som annoterats med attributet SetsRequiredMembers, antingen this()eller base(), måste också innehålla attributet SetsRequiredMembers. Det säkerställer att anropare kan använda alla lämpliga konstruktorer korrekt.
  • Kopieringskonstruktorer som genereras för record-typerna har attributet SetsRequiredMembers applicerat 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 egenskaperna FirstName 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 C#11 – Obligatoriska medlemmar funktionsspecifikation.