C # 3.0 Автозапчасти - в чем разница? - PullRequest
0 голосов
/ 17 марта 2009

0 В чем разница между следующим?

public class MyClass
{
    public bool MyProperty;
}

public class MyClass
{
    public bool MyProperty { get; set; }
}

Это просто семантика?

Ответы [ 6 ]

5 голосов
/ 17 марта 2009

Поля и свойства имеют много различий, кроме семантических.

  1. Свойства могут быть переопределены для обеспечения различных реализаций в потомках.
  2. Свойства могут помочь облегчить проблемы с версиями. То есть Изменение поля на свойство в библиотеке требует перекомпиляции всего, что зависит от этой библиотеки.
  3. Свойства могут иметь различный доступ для геттера и сеттера.
3 голосов
/ 17 марта 2009

«Просто семантика» всегда кажется мне противоречием. Да, это меняет смысл кода. Нет, это не то, что я использовал бы в слове "просто".

Первый класс имеет открытое поле. Второй класс имеет публичную собственность, поддерживаемую частным полем. Они не одно и то же:

  • Если вы позже измените реализацию свойства, вы сохраните двоичную совместимость. Если вы измените поле на свойство, вы потеряете совместимость с двоичным кодом и .
  • Поля не видны при привязке данных; свойства
  • Доступ к полю не может быть остановлен в управляемом коде (AFAIK)
  • Экспонирование поля раскрывает реализацию вашего типа - предоставление свойства просто говорит о контракте вашего типа.

См. мою статью о совершенстве свойств , чтобы немного подробнее рассказать об этом.

2 голосов
/ 17 марта 2009

В таком случае, да, это в основном семантика. Это имеет значение для размышлений и так далее.

Однако, если вы хотите внести изменение, чтобы при установке MyProperty вы запускали, например, событие, вы могли легко изменить последнее, чтобы сделать это. Первый вы не можете. Вы также можете указать последний в интерфейсе.

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

0 голосов
/ 17 марта 2009

Я предполагаю, что вы не пишете код, который будет вызываться сторонними разработчиками, которые не могут перекомпилировать свой код при изменении кода. (Например, вы не работаете в Microsoft, пишущей .Net Framework сам по себе, или DevExpress пишет набор инструментов управления). Помните, что стандарт кодирования платформы Microsoft .NET предназначен для людей, пишущих среду, и старается избежать множества проблем, которые даже не возникают, если вы не пишете среду для использования сторонними разработчиками.

Во 2-м случае определена правильность, единственное истинное преимущество в том, что привязка данных не работает с полями. Однако использование преимуществ является большим политическим преимуществом: вы получаете намного меньше недействительных жалоб от других разработчиков, которые смотрят на ваш код.

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

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

0 голосов
/ 17 марта 2009

Самое большое отличие состоит в том, что вы можете добавить модификаторы доступа к свойствам, например, так:

public class MyClass
{
    public bool MyProperty { get; protected set; }
}

Для доступа к CLR поля и свойства тоже разные. Поэтому, если у вас есть поле и вы хотите изменить его на свойство позже (например, когда вы хотите добавить код в установщик), интерфейс изменится, вам нужно будет перекомпилировать весь код, обращающийся к этому полю. С Autoproperty у вас нет этой проблемы.

0 голосов
/ 17 марта 2009

Первое - просто открытое поле, второе - так называемое автоматическое свойство. Автоматические свойства изменяются на обычные свойства с вспомогательным полем компилятором C #.

Публичные поля и свойства в синтаксисе C # одинаковы, но в IL они различны (недавно читайте об этом на немецком форуме, источник не может дать, извините).

Matthias

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