Vlastnosti (Průvodce programováním v C#)Properties (C# Programming Guide)

Vlastnost je člen, který poskytuje flexibilní mechanismus pro čtení, zápis nebo vypočítat hodnotu soukromé pole.A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Vlastnosti lze použít jako v případě, že jsou veřejné datové členy, ale jsou ve skutečnosti speciální volání metody přistupující objekty.Properties can be used as if they are public data members, but they are actually special methods called accessors. Díky tomu dat snadno přístupná a přesto pomáhá zvýšit úroveň zabezpečení a flexibilita z metod.This enables data to be accessed easily and still helps promote the safety and flexibility of methods.

Přehled vlastnostíProperties overview

  • Vlastnosti umožňují třídám vystavit veřejný způsob získání a nastavení hodnoty, při skrytí implementace nebo ověřovací kód.Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.

  • A získat přistupující objekt vlastnosti se používá k vrácení hodnoty vlastnosti a nastavit přistupující objekt vlastnosti slouží k přiřazení nové hodnoty.A get property accessor is used to return the property value, and a set property accessor is used to assign a new value. Tyto přístupové objekty může mít různé úrovně přístupu.These accessors can have different access levels. Další informace najdete v tématu omezení přístupnosti přístupového objektu.For more information, see Restricting Accessor Accessibility.

  • Hodnotu – klíčové slovo se používá k definování přiřazené podle hodnoty set přistupujícího objektu.The value keyword is used to define the value being assigned by the set accessor.

  • Vlastnosti mohou být čtení a zápis (mají obě get a set přístupového objektu), jen pro čtení (mají get přístupový objekt, ale ne set přístupového objektu), nebo jen pro zápis (mají set přístupový objekt, ale ne get přistupující objekt).Properties can be read-write (they have both a get and a set accessor), read-only (they have a get accessor but no set accessor), or write-only (they have a set accessor, but no get accessor). Vlastnosti jen pro zápis se vyskytují jen vzácně a jsou obvykle používány k omezení přístupu k citlivým datům.Write-only properties are rare and are most commonly used to restrict access to sensitive data.

  • Jednoduché vlastnosti, které vyžadují žádný kód vlastního přistupujícího objektu dá implementovat buď jako definice těla výrazu, nebo jako automaticky implementované vlastnosti.Simple properties that require no custom accessor code can be implemented either as expression body definitions or as auto-implemented properties.

Vlastnosti s pomocná poleProperties with backing fields

Jeden základní vzor pro implementování vlastnost zahrnuje použití privátní pomocné pole pro nastavení nebo načtení hodnoty vlastnosti.One basic pattern for implementing a property involves using a private backing field for setting and retrieving the property value. get Přistupující objekt vrací hodnotu soukromé pole a set přistupující objekt může provádět některé ověřování dat před přiřazením hodnoty na soukromé pole.The get accessor returns the value of the private field, and the set accessor may perform some data validation before assigning a value to the private field. Oba přístupové objekty mohou také provádět některé převodu nebo výpočet data předtím, než je uložen nebo vrácena.Both accessors may also perform some conversion or computation on the data before it is stored or returned.

Následující příklad ukazuje tento model.The following example illustrates this pattern. V tomto příkladu TimePeriod třída představuje časový interval.In this example, the TimePeriod class represents an interval of time. Interně třídy ukládá časový interval v sekundách v soukromé pole s názvem _seconds.Internally, the class stores the time interval in seconds in a private field named _seconds. Čtení a zápis vlastnost s názvem Hours umožňuje zákazníkům určit časový interval v hodinách.A read-write property named Hours allows the customer to specify the time interval in hours. Jak get a set přistupující objekty provést nezbytné převod mezi hodiny a sekundy.Both the get and the set accessors perform the necessary conversion between hours and seconds. Kromě toho set přistupující k ověření dat a vyvolá ArgumentOutOfRangeException Pokud počet hodin je neplatný.In addition, the set accessor validates the data and throws an ArgumentOutOfRangeException if the number of hours is invalid.

using System;

class TimePeriod
{
   private double _seconds;

   public double Hours
   {
       get { return _seconds / 3600; }
       set { 
          if (value < 0 || value > 24)
             throw new ArgumentOutOfRangeException(
                   $"{nameof(value)} must be between 0 and 24.");

          _seconds = value * 3600; 
       }
   }
}

class Program
{
   static void Main()
   {
       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

Definice textu výrazuExpression body definitions

Přistupující objekty vlastnosti se často skládají jedním řádkem příkazů, které právě přiřadit nebo vrátí výsledek výrazu.Property accessors often consist of single-line statements that just assign or return the result of an expression. Tyto vlastnosti můžete implementovat jako členy s výrazem v těle.You can implement these properties as expression-bodied members. Definice těla výrazu se skládají z => symbol následovaný výraz, který má přiřadit nebo načíst z vlastnosti.Expression body definitions consist of the => symbol followed by the expression to assign to or retrieve from the property.

Od verze C# 6, může implementovat vlastnosti jen pro čtení get přístupového objektu jako člena s výrazem v těle.Starting with C# 6, read-only properties can implement the get accessor as an expression-bodied member. V tomto případě, ani get – klíčové slovo přistupující objekt ani return – klíčové slovo se používá.In this case, neither the get accessor keyword nor the return keyword is used. Následující příklad implementuje jen pro čtení Name vlastnost jako člena s výrazem v těle.The following example implements the read-only Name property as an expression-bodied member.

using System;

public class Person
{
   private string _firstName;
   private string _lastName;
   
   public Person(string first, string last)
   {
      _firstName = first;
      _lastName = last;
   }

   public string Name => $"{_firstName} {_lastName}";   
}

public class Example
{
   public static void Main()
   {
      var person = new Person("Isabelle", "Butts");
      Console.WriteLine(person.Name);
   }
}
// The example displays the following output:
//      Isabelle Butts

Od verze C# 7.0, jak get a set přístupový objekt je možné implementovat jako členy s výrazem v těle.Starting with C# 7.0, both the get and the set accessor can be implemented as expression-bodied members. V takovém případě get a set klíčová slova musí být k dispozici.In this case, the get and set keywords must be present. Následující příklad ukazuje použití definice těla výrazu pro oba přistupující objekty.The following example illustrates the use of expression body definitions for both accessors. Všimněte si, že return – klíčové slovo se nepoužívá get přistupujícího objektu.Note that the return keyword is not used with the get accessor.

using System;

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; 
   }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem("Shoes", 19.95m);
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



Automaticky implementované vlastnostiAuto-implemented properties

V některých případech vlastnost get a set přistupující objekty pouze přiřadit hodnotu nebo načíst hodnotu z pole zálohování bez jakékoli další logiky.In some cases, property get and set accessors just assign a value to or retrieve a value from a backing field without including any additional logic. Pomocí automaticky implementovaných vlastností můžete zjednodušit kód přitom má kompilátor jazyka C# transparentně poskytují pole zálohování za vás.By using auto-implemented properties, you can simplify your code while having the C# compiler transparently provide the backing field for you.

Pokud je vlastnost i get a set přístupový objekt, musí být automaticky implementované.If a property has both a get and a set accessor, both must be auto-implemented. Můžete definovat automaticky implementovanou vlastnost s použitím get a set klíčových slov bez zadání žádnou implementaci.You define an auto-implemented property by using the get and set keywords without providing any implementation. V následujícím příkladu se opakuje předchozímu, s výjimkou, že Name a Price jsou automaticky implementované vlastnosti.The following example repeats the previous one, except that Name and Price are auto-implemented properties. Všimněte si, že v příkladu také odebere Parametrizovaný konstruktor, tak, aby SaleItem objekty se teď inicializují voláním konstruktoru bez parametrů a objektu inicializátoru.Note that the example also removes the parameterized constructor, so that SaleItem objects are now initialized with a call to the parameterless constructor and an object initializer.

using System;

public class SaleItem
{
   public string Name 
   { get; set; }

   public decimal Price
   { get; set; }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



Specifikace jazyka C#C# Language Specification

Další informace najdete v tématu vlastnosti v C# specifikace jazyka.For more information, see Properties in the C# Language Specification. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.The language specification is the definitive source for C# syntax and usage.

Viz také:See also