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 istruct
, ochclass
-typer, inklusiverecord
- ochrecord struct
-typer. Det går inte att användarequired
-modifieraren för medlemmar i eninterface
. - 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 tillnull
. 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 ettrequired
fält som ärprotected
. Dessutom måste obligatoriska egenskaper ha setters (set
ellerinit
-å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ållarequired
-modifieraren. Den härledda typen kan inte ta bortrequired
tillstånd. Härledda typer kan lägga tillrequired
-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 villkoretnew()
. 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ållerrequired
-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
, antingenthis()
ellerbase()
, måste också innehålla attributetSetsRequiredMembers
. Det säkerställer att anropare kan använda alla lämpliga konstruktorer korrekt. - Kopieringskonstruktorer som genereras för
record
-typerna har attributetSetsRequiredMembers
applicerat om någon av medlemmarna ärrequired
.
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.