Стиль кодирования и производительность свойств - PullRequest
2 голосов
/ 12 января 2011

Если у меня есть свойство в классе, определенном следующим образом:

private int mSomeNumber;
public int SomeNumber
{
   get
   {
      return mSomeNumber;
   }
}

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

public void DoSomething()
{
   if(mSomeNumber == 0)  // This way?
   //if(SomeNumber == 0) // Or this way?
   {
      // Do something
   }
}

Я думаю, что прямое использование переменной-члена может сохранить вызов, но мне интересно, будет ли свойство скомпилировано для той же вещи. Кто-нибудь знает, если это так или может быть "стандарт"?

Ответы [ 5 ]

4 голосов
/ 12 января 2011

Вам следует использовать это свойство, если только у вас нет особых требований к обходному пути (например, согласно ответу Хенка ).

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

4 голосов
/ 12 января 2011

В наши дни мы просто делаем:

public int SomeNumber
{
   get;
   private set;
}

Так что нам не нужно объявлять частное поле участника.

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

1 голос
/ 12 января 2011

Разница, если таковая имеется, будет очень маленькой.Так что подходить к этому с точки зрения «производительности» - это неправильно.Если вы использовали этот элемент настолько, что это могло иметь значение, вы, вероятно, должны написать его совершенно по-другому.

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

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

И так как это редко, это означает, что мы обычно вообще обходимся без вспомогательного поля, как в ответе @ Frederic.

0 голосов
/ 12 января 2011

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

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

Прочтите другие ответы на вопрос о преимуществах свойств.

0 голосов
/ 12 января 2011

Использование свойств считается лучшей практикой и является стандартным для мира .net и C # в целом. Это имеет те же преимущества, что и использование свойств вместо полей в публичных контрактах.

Какие преимущества вы получаете, описано Джоном Скитом в его статье: Почему важны свойства .

...