Книга: C# для профессионалов. Том II

Свойства и индексаторы

Свойства и индексаторы

Раньше методы get() и set() использовались для доступа к внутренним атрибутам объекта. Сегодня C# вводит концепцию аксессоров (accessor), которые предоставляют безопасный и гибкий способ получения внутри лих полей, Существует два типа аксессоров. Аксессор get разрешает чтение внутренних полей объекта, а аксессор set позволяет изменять значение внутреннего поля. Ключевое слово value представляет новое значение справа от знака равенства во время присваивания. Отсутствие соответствующего аксессора в объявлении свойства приведет к тому, что свойство будет предназначаться либо только для чтения (нет set), либо только для записи (нет get):

namespace Samples {
 using System;
 public class Properties {
  private int age;
  private string name;
  public Properties(string name) {
   this.name = name;
  }
  public int Age {
   get {
    return age;
   }
   set {
    age = value;
   }
  }
  public string Name {
   get {
    return name;
   }
  }
 }
}

В указанном примере свойство Age имеет аксессоры get и set, поэтому можно читать или записывать в это свойство. Свойство Name, однако, создается один раз, когда создается новый экземпляр объекта свойств, после чего можно только прочитать значение Name. Свойства доступны, как если бы они были открытыми полями:

Properties props = new Properties("john");
props.Age = 21;
Console.WriteLine("My name is {0}, and I am {1} years old.", props.Name, props.Age);

Результатом этого кода является:

My name is john, and I am 21 years old.

Примечание. Имена свойств должны быть уникальными.

Как предполагает название, индексаторы позволяют легко индексировать атрибуты объектов. Предположим, что нам необходимо предоставить аналогичную функциональность, не создавая двух отдельных свойств. Можно проиндексировать имеющиеся поля, чтобы они были доступны с помощью некоторого ключа (ключ является значением, используемым для доступа к индексу, для массивов ключ является целым значением), или извлечь объявления двух свойств в примере выше и заменить их следующим:

public string this[string a] {
 get {
  if (a.Equals("Age")) return int.ToString(age);
  else if (a.Equals("Name")) return name;
  else {
throw new Exception("can only accept 'name' or 'age' key");
  }
 }
 set {
  if (a.Equals("Age")) age = int.Parse(value);
  else {
throw new Exception(a + " is read only or does not exist");
  }
 }
}

Затем можно обратиться к атрибутам свойств следующим образом:

Properties props = new Properties("john");
props["Age"] = "21";
Console.WriteLine("my name is {0}, I am {1} years old.", props["Name"], props["Age"]);

В результате мы получим:

My name is john, I am 21 years old.

Оглавление книги


Генерация: 1.534. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз