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 istruct
, ochclass
typer, inklusiverecord
ochrecord struct
typer. Modifierarenrequired
kan inte tillämpas på 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 deras innehållande typ. En klass kan till exempel
public
inte innehålla ettrequired
fält som ärprotected
. Dessutom måste obligatoriska egenskaper ha setters (set
ellerinit
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 inkluderarequired
modifieraren. Den härledda typen kan inte ta bort tillståndetrequired
. Härledda typer kan lägga tillrequired
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 villkoretnew()
. 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ållerrequired
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, antingenthis()
, ellerbase()
, måste också innehållaSetsRequiredMembers
attributet. Det säkerställer att anropare kan använda alla lämpliga konstruktorer korrekt. - Kopieringskonstruktorer som genereras för
record
typer harSetsRequiredMembers
attributet tillämpat 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 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 .