Egenskaper (C#-programmeringsguide)
En egenskap är en medlem som tillhandahåller en flexibel mekanism för att läsa, skriva eller beräkna värdet för ett privat fält. Egenskaper kan användas som om de är medlemmar i offentliga data, men de är särskilda metoder som kallas accessorer. Den här funktionen gör att data enkelt kan nås och bidrar fortfarande till att främja säkerhet och flexibilitet för metoder.
Översikt över egenskaper
- Med egenskaper kan en klass exponera ett offentligt sätt att hämta och ange värden, samtidigt som implementerings- eller verifieringskoden döljs.
- En get-egenskapsåtkomstor används för att returnera egenskapsvärdet och en uppsättning egenskapsåtkomst används för att tilldela ett nytt värde. En init-egenskapsåtkomstor används endast för att tilldela ett nytt värde under objektkonstruktionen. Dessa accessorer kan ha olika åtkomstnivåer. Mer information finns i Begränsa hjälpmedel för accessorer.
- Nyckelordet värde används för att definiera det värde
set
som ellerinit
-accessorn tilldelar. - Egenskaper kan vara skrivskyddade (de har både en
get
och enset
accessor), skrivskyddade (de har enget
accessor men ingenset
accessor) eller skrivskyddade (de har enset
accessor, men ingenget
accessor). Skrivskyddade egenskaper är sällsynta och används oftast för att begränsa åtkomsten till känsliga data. - Enkla egenskaper som inte kräver någon anpassad åtkomstkod kan implementeras antingen som uttryckstextdefinitioner eller som automatiskt implementerade egenskaper.
Egenskaper med bakgrundsfält
Ett grundläggande mönster för att implementera en egenskap är att använda ett privat bakgrundsfält för att ange och hämta egenskapsvärdet. Accessorn get
returnerar värdet för det privata fältet och set
accessorn kan utföra viss dataverifiering innan ett värde tilldelas till det privata fältet. Båda åtkomstgivarna kan också utföra viss konvertering eller beräkning av data innan de lagras eller returneras.
I följande exempel visas det här mönstret. I det här exemplet TimePeriod
representerar klassen ett tidsintervall. Internt lagrar klassen tidsintervallet i sekunder i ett privat fält med namnet _seconds
. Med en skrivskyddad egenskap med namnet Hours
kan kunden ange tidsintervallet i timmar. get
Både och -åtkomstarna utför den nödvändiga konverteringen set
mellan timmar och sekunder. Dessutom set
validerar accessorn data och genererar en ArgumentOutOfRangeException om antalet timmar är ogiltigt.
public class TimePeriod
{
private double _seconds;
public double Hours
{
get { return _seconds / 3600; }
set
{
if (value < 0 || value > 24)
throw new ArgumentOutOfRangeException(nameof(value),
"The valid range is between 0 and 24.");
_seconds = value * 3600;
}
}
}
Du kan komma åt egenskaper för att hämta och ange värdet enligt följande exempel:
TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;
// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
// Time in hours: 24
Uttryckstextdefinitioner
Egenskapsåtkomster består ofta av enradsinstruktioner som bara tilldelar eller returnerar resultatet av ett uttryck. Du kan implementera dessa egenskaper som uttrycksbaserade medlemmar. Uttryckstextdefinitioner består av symbolen =>
följt av uttrycket som ska tilldelas till eller hämtas från egenskapen.
Skrivskyddade egenskaper kan implementera get
accessorn som en uttrycksbaserad medlem. I det här fallet används varken nyckelordet get
för accessorn eller nyckelordet return
. I följande exempel implementeras den skrivskyddade Name
egenskapen som en uttrycksbaserad medlem.
public class Person
{
private string _firstName;
private string _lastName;
public Person(string first, string last)
{
_firstName = first;
_lastName = last;
}
public string Name => $"{_firstName} {_lastName}";
}
get
Både åtkomstgivaren och set
kan implementeras som uttrycksbaserade medlemmar. I det här fallet måste nyckelorden get
och set
finnas. I följande exempel visas användningen av uttryckstextdefinitioner för båda åtkomstgivarna. Nyckelordet return
används inte med get
accessorn.
public class SaleItem
{
string _name;
decimal _cost;
public SaleItem(string name, decimal cost)
{
_name = name;
_cost = cost;
}
public string Name
{
get => _name;
set => _name = value;
}
public decimal Price
{
get => _cost;
set => _cost = value;
}
}
Auto-implementerade egenskaper
I vissa fall tilldelar egenskapen get
och set
åtkomstarna bara ett värde till eller hämtar ett värde från ett bakgrundsfält utan att inkludera någon extra logik. Genom att använda automatiskt implementerade egenskaper kan du förenkla koden samtidigt som C#-kompilatorn transparent tillhandahåller bakgrundsfältet åt dig.
Om en egenskap har både en get
och en set
(eller en get
och en init
) -accessor måste båda implementeras automatiskt. Du definierar en automatiskt implementerad egenskap med nyckelorden get
och set
utan att tillhandahålla någon implementering. I följande exempel upprepas det föregående, förutom det Name
och Price
är automatiskt implementerade egenskaper. Exemplet tar också bort den parametriserade konstruktorn, så att SaleItem
objekt nu initieras med ett anrop till den parameterlösa konstruktorn och en objektinitierare.
public class SaleItem
{
public string Name
{ get; set; }
public decimal Price
{ get; set; }
}
Automatiskt implementerade egenskaper kan deklarera olika åtkomstmöjligheter för get
och set
-åtkomsten. Du deklarerar ofta en offentlig get
accessor och en privat set
accessor. Du kan läsa mer i artikeln om hur du begränsar hjälpmedel för åtkomst till användare.
Nödvändiga egenskaper
Från och med C# 11 kan du lägga till required
medlemmen för att tvinga klientkoden att initiera alla egenskaper eller fält:
public class SaleItem
{
public required string Name
{ get; set; }
public required decimal Price
{ get; set; }
}
Om du vill skapa en SaleItem
måste du ange både Name
egenskaperna och Price
med hjälp av objektinitierare, enligt följande kod:
var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
Relaterade avsnitt
- Använda egenskaper
- Gränssnittsegenskaper
- Jämförelse mellan egenskaper och indexerare
- Begränsa hjälpmedel för accessor
- Egenskaper som implementeras automatiskt
Språkspecifikation för C#
Mer information finns i Egenskaper i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.
Se även
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för