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 eller init -accessorn tilldelar.
  • Egenskaper kan vara skrivskyddade (de har både en get och en set accessor), skrivskyddade (de har en get accessor men ingen set accessor) eller skrivskyddade (de har en set accessor, men ingen get 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 SaleItemmå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}");

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