Должны ли свойства get возвращать значения, отличные от значения частного члена? - PullRequest
0 голосов
/ 17 февраля 2011
private int _myField;
public int MyField
{
  get {
   return _myField * 99;
}
set {
   _myField * value;
}
}

Я видел, как разработчики добавляли более сложный код в Getter, устанавливая другие члены, свойства и т. Д. Для меня возвращение значения, отличного от связанной переменной-члена, вызывает путаницу при отладке.

Это лучше?

private int _myField;
public int MyField
{
  get {
   return _myField = _myField * 99;
}
set {
   _myField * value;
}
}

или это?

private int _myField;
public int MyField
{
  get {
   return _myField;
}
set {
   _myField = value * 99;
}
}

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

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

Однако обычно не хорошая идея написать свойство, чтобы получение значения, которое вы только что установили, дало радикально другой ответ,В частности,

foo.SomeProperty = foo.SomeProperty;

должен почти никогда не делать ничего значительного (тогда как в вашем примере это изменило бы значение).

(Сказав это, ваш установочный код)для первых двух примеров не работает.)

1 голос
/ 17 февраля 2011

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

1 голос
/ 17 февраля 2011

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

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

...