Разница между автоматическими свойствами и открытым полем в C # 3.0 - PullRequest
17 голосов
/ 01 августа 2009

Мне не удалось понять, почему автоматически реализованная функция языка свойств существует в C # 3.0.

Какая разница, когда вы говорите

public string FirstName;

чем

public string FirstName { get; set; }

Ответы [ 7 ]

20 голосов
/ 01 августа 2009

Потому что они реализованы по-разному в полученном коде IL (и машинном языке). Свойство Automatic по-прежнему отображается как общедоступный метод получения и установки, тогда как открытое поле - это всего лишь одно поле.

Таким образом, реализация свойства auto позволяет вам позднее изменить внутреннее поведение либо метода получения, либо установки (например, добавив валидатор) без перекомпиляции или повторного кодирования любых зависимых классов, которые его используют ...

9 голосов
/ 01 августа 2009

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

public string FirstName { get; private set; }

Пользователь вашего класса видит FirstName как публичную собственность. Однако он / она не может писать в него.

6 голосов
/ 01 августа 2009

Подумайте, что произойдет, если позже вы захотите изменить каждое из них на свойство с пользовательской реализацией. Если это автоматически реализованное свойство, вы просто добавляете поле и изменяете реализацию. Полная исходная и бинарная совместимость.

Если это поле для начала, вы не получаете ни двоичной совместимости с исходным кодом , ни . Вы должны восстановить все, что ссылается на него, и исправить все, что больше не компилируется.

Кроме того, свойства имеют различные преимущества перед полями . Мое главное личное возражение против полей заключается в том, что оно предоставляет решение реализации в API.

2 голосов
/ 01 августа 2009

из-за этого использования:
public string FirstName { get; private set; }
простое свойство, это «кошерный» по правилам ОО

2 голосов
/ 01 августа 2009

Разница в том, что другие сборки, скомпилированные с кодом, который читает свойство, скомпилированы со свойством.

Если позже вы решите, что вам нужно добавить код в метод получения или установки, вы можете сделать это без необходимости перекомпилировать все остальные сборки, связанные с ним.

Не так с полями. Если впоследствии вы измените поле на свойство, чтобы добавить этот код, другие сборки, связанные с вашей, перестанут функционировать должным образом, поскольку они скомпилированы для чтения поля, а не свойства.

Также написано много кода для поиска свойств, а не полей, таких как привязка данных и т. П.

0 голосов
/ 01 августа 2009

Автоматические свойства - это сгенерированные компилятором обычные свойства, они используют вспомогательные поля, как любое обычное свойство, но вам не нужно писать код для этого. Вот очень иллюстративный пример (благодаря Reflector ) кода, сгенерированного компилятором:

[CompilerGenerated]
private string <ContentType>k__BackingField;

public string ContentType
{
    [CompilerGenerated]
    get
    {
        return this.<ContentType>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<ContentType>k__BackingField = value;
    }
}
0 голосов
/ 01 августа 2009

Первое является публичным полем, а второе является публичной собственностью.

Основное различие заключается в том, как они используются. Например, WPF может связывать данные только со свойствами, а не с полями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...