Подтвердить что ты не робот

Вопрос о конференции: когда вы используете функцию Getter/Setter, а не используете свойство

Мне кажется, что свойства в С# должны использоваться при попытке манипулировать полем в классе. Но когда есть сложные вычисления или база данных, мы должны использовать геттер/сеттер.

Правильно ли это?

Когда вы используете свойства s/getter над?

4b9b3361

Ответ 1

Рекомендации по разработке .NET содержат некоторые ответы на этот вопрос в разделе Свойства против методов.

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

При принятии решения о том, следует ли использовать свойство или метод, это помогает, если я думаю об этом как поле. Я думаю о поведении свойства и спрашиваю себя: "Если бы это было поле в классе, я был бы удивлен, если бы он вел себя так, как он?" Рассмотрим, например, метод TcpClient.GetStream. Он может генерировать несколько исключений, основанных на соединении, и важно, чтобы TcpClient был настроен до того, как вы попытаетесь получить поток. Из-за этого это метод Get, а не свойство.

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

Ответ 2

Если ваш язык поддерживает свойства, просто используйте свойства.

Ответ 3

Используйте свойства. Одна из примечательных замечаний из руководства по разработке дизайна MS Framework заключается в том, что если у вас есть свойство и вам нужно добавить дополнительные методы для более сложного set/get, тогда вы должны устранить свойство и использовать только методы get/set.

Ответ 4

Это все личные предпочтения. Когда он скомпилируется, он оказывается как функции getter/setter в любом случае.

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

Ответ 5

Я бы сказал, всегда спрашивайте себя, что имеет больше смысла. Методы, как правило, понимаются как действия для выполнения и обычно формулируются как таковые. open(), flush(), parse(). Свойства, как правило, понимаются как более благоприятные поля/переменные; DisplayName, AutoSize, DataSource.

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

Ответ 6

Я имею тенденцию использовать сеттеры, когда значение является только для записи или есть несколько значений, которые необходимо установить сразу (очевидно). Также мой инстинкт, как и ваш, заключается в том, чтобы использовать геттеры и сеттеры в качестве сигнала о том, что процесс может быть длительным, создавать потоки или выполнять какую-то другую нетривиальную работу. Кроме того, если у сеттера есть неочевидные предпосылки в классе, я мог бы использовать геттер или сеттер вместо этого, так как люди редко читают документацию по свойствам, и ожидается, что свойства будут доступны в любое время. Но даже в этих обстоятельствах я мог бы использовать свойство, если оно потенциально сделает код вызова лучше.

Ответ 7

Забудьте методы Getter и Setter. Просто используйте Свойства.

Интересно отметить, что свойства заканчиваются как Setter и/или метод Getter в сборке. Setter и/или Getter становятся собственностью всего лишь несколькими метаданными. На самом деле, свойства = методы setter/getter.

Ответ 8

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

И они должны иметь никаких побочных эффектов.

Ответ 9

Ответ Microsoft хорош, но я бы добавил еще несколько правил для свойств чтения и записи (которые иногда нарушают Microsoft, кстати, вызывают много путаницы): (1) Установщик свойств обычно не влияет на наблюдаемые свойства объектов которые не считаются частью объекта, свойство которого устанавливается; (2) Установка свойства на одно значение, а затем другое должно оставить любые затронутые объекты в том же (наблюдаемом) состоянии, что просто установите его на второе значение; (3) Установка свойства на значение, возвращаемое его получателем, не должно иметь наблюдаемого эффекта; (4) Как правило, установка свойства не должна приводить к изменению каких-либо других свойств чтения и записи, хотя это может изменить другие свойства только для чтения (обратите внимание, что большинство нарушений этого правила будут нарушать # 2 и/или # 3, но даже если эти правила не будут нарушены, такие проекты все еще кажутся сомнительными). Создание объекта, используемого в конструкторе, может потребовать предоставления ему некоторых свойств, которые не соответствуют этим правилам, но изменения времени выполнения, которые не будут следовать такой семантике, должны выполняться методами setter.

Во многих случаях может быть целесообразным иметь свойство только для чтения и отдельный метод "Установить" (это было бы моим предпочтением, например, для свойства "Родительский элемент управления" ). В других случаях может быть полезно иметь несколько связанных свойств ReadOnly, на которые влияет одно свойство чтения/записи (например, может быть полезно иметь свойство только для чтения, которое указывает, видимо ли элемент управления и все его родители, но такие функциональность не должна включаться в свойство Visible чтения-записи).