Предупреждение : Я полагаю, вы уже знаете об объектно-ориентированном программировании .
Какие являются свойствами?
Свойства - это языковые элементы, которые позволяют вам избегать повторяющихся методов доступа getXYZ()
и setXYZ()
методов мутации, встречающихся в других языках, таких как Java.
Почему они существуют?
Они направлены на решение следующих проблем:
Сказать get
и set
в начале каждого доступа или изменения значения раздражает и отвлекает.
В Java вы часто говорите:
class person
{
private int _age;
public void setAge(int value) { /*check value first, then set _age*/ }
public int getAge() { return this._age; }
}
и затем последовательно сказать:
if (person.getAge() > blah || person.getAge() < 10)
{
person.setAge(5);
}
Через некоторое время get
и set
становятся довольно раздражающими.
Предоставление прямого доступа к фактической переменной разрывает инкапсуляцию, так что это не вариант.
Как они используются?
Они используются как переменные . Вы читаете / пишете им как переменные.
Как они созданы?
Они созданы как методы . Вы определяете пару методов, которые:
Возвращает текущее значение свойства. Часто это не что иное, как что-то вроде следующего:
class Person
{
private int _age; //Declare the backing field
public int Age
{
get { return this._age; }
set { ... }
}
}
Установить значение свойства:
class Person
{
public int Age
{
get { ... }
set
{
if (value < 0) //'value' is what the user provided
{ throw new ArgumentOutOfRangeException(); } //Check validity
this._age = value;
}
}
}
Другие примечания:
Автоматически реализованные свойства
В C # 3.0 введены автоматически реализованные свойства:
public int Age { get; set; }
Это эквивалентно:
private int _age; //The name is auto-generated
public int Age { get { return this._age; } set { this._age = value; } }
Почему он существует?
Это помогает вам избегать критических изменений в исполняемых файлах клиента .
Допустим, вы ленивы и не хотите печатать все целиком, и решили публично представить переменную. Затем вы создаете исполняемый файл, который читает или пишет в это поле. Затем вы передумаете и решите, что вам действительно нужна собственность, поэтому вы измените ее на одну.
Что происходит?
Отключается исполняемый файл, потому что код больше не действителен.
Автоматически реализованные свойства помогут вам избежать этого без дополнительной избыточности в исходном коде.
Индексаторы
Индексаторы расширяют синтаксис свойства, позволяя вам индексировать объекты (сюрприз!), Как массивы.
Для пользователей C ++: это похоже на перегрузку operator []
.
Пример:
private int[] _elements;
public int this[int index] //Indexed property
{
get { return this._elements[index]; }
set
{
//Do any checks on the index and value
this._elements[index] = value;
}
}
Затем вы используете их как obj[5] = 10;
, что эквивалентно вызову set
метода индексатора obj
.
Фактически, System.Collections.Generic.List<T>
индексируется:
var list = new List<int>();
list.Add(10);
list[0] = 5; //You're indexing list, as though it were an array!
Разве это не аккуратно? :)
Что-нибудь еще?
В свойствах есть еще много функций, не все из которых доступны в C #:
- Параметризованные свойства, из которых индексаторы являются особым видом
- Модификаторы доступа для получения / установки (в C #)
- Несколько геттеров или сеттеров (не в C #)
- и так далее