Свойства ЯВЛЯЮТСЯ функциями.
Поля - это "переменные, по крайней мере, с видимостью класса".
Итак, если у вас есть частная собственность против частного поля:
Отличие от точки производительности:
нет разницы, если вы используете оптимизацию и нет трассировки (свойства обрабатываются как встроенные).
Разница в семантике:
1) Формально никакой разницы.
2) Более глубоко, разница ЕСТЬ. Поскольку свойства - это функции, вы МОЖЕТЕ получить делегата от получателя и установщика. И МОЖЕТ использовать делегата как ... делегата, например, поместить этого делегата в список с другими делегатами (Создать делегат из метода получения или установки свойства)
Отличие от дизайнерского взгляда:
Но свойства - это функции, похожие на переменные. Зачем нужны функции, похожие на переменные?
Допустим, у вас есть класс Hand и эта рука имеет переменную fingerNumber.
class Hand
{
public int fingersNumber;
}
Тогда у вас может быть много кода вроде
if(he is BadPerson) leftHand.fingersNumber--
if(doctor.Heal()) leftHand.fingersNumber++
Но в какой-то момент вы можете захотеть добавить в Hand другую переменную. Допустим, это ringNumber. И вы знаете, что нельзя иметь больше 10 колец на каждом пальце.
class Hand
{
public int fingersNumber;
public int ringsNumber;
}
теперь вы не можете просто сделать
leftHand.fingersNumber--
потому что вы должны контролировать ringNumber на зависимости fingerNumber.
Поэтому вам нужно создать несколько функций, которые будут проверять эту зависимость. Также вы должны скрыть fingerNumber и RingNumber от пользователей, чтобы они не могли изменить эти поля без проверки.
class Hand
{
private int fingersNumber;
private int ringsNumber;
public int GetFingersNumber(){...check logic...}
public void SetFingersNumber(int value){...check logic...}
public int GetRingsNumber(){...check logic...}
public void SetRingsNumber(int value){...check logic...}
}
И используйте эти функции как
if(he is BadPerson) leftHand.SetFingersNumber(leftHand.GetFingersNumber()-1)
Проблема здесь в том, что старый код leftHand.fingersNumber-- сейчас не работает. И с самого начала вы не знали, что в будущем будут добавлять кольца. Для решения проблем стало парадигмой установить поля как частные и использовать функции Set и Get для получения и изменения переменных, и УБЕДИТЕСЬ, что в будущем можно будет добавить туда любую логику и код будет работать!
Сеттеры и геттеры - текущая ситуация в C ++, Java и многих языках. Но создатели C # пошли дальше и украсили такие функции геттеров и сеттеров «свойствами».
class Hand
{
private int fingersNumber;
public int FingersNumber
{
get{return fingersNumber;}
set{fingersNumber=value;}
}
...
}
...
if(he is BadPerson) leftHand.FingersNumber--;
Но в большинстве случаев люди создают такое простое свойство, и, как вы видите в примере, это 5 строк обычного кода. Так что в какой-то версии C # были добавлены автосвойства, чтобы упростить жизнь программистам. Итак, ваш класс, вероятно, выглядит как
class Hand
{
public int FingersNumber{get;set;}
}
но в любое время вы можете расширить это поведение get set:
class Hand
{
private int fingersNumber;
public int FingersNumber
{
get{...check logic...}
set{...check logic...}
}
...
}
И он НЕ ТОРМОЗИТ НИКАКОЙ КОД. Нравится
if(he is BadPerson) leftHand.FingersNumber--;
Вот каковы свойства, почему они используются и в чем разница с полями.
Также, как я отмечал ранее, простые свойства и автосвойства имеют ту же производительность, что и переменные, если вы используете оптимизацию. Се разборку или просто погуглить по этому поводу.
person
MajesticRa
schedule
27.05.2011