2014-09-27 3 views
28

Есть ли разница между следующим?C# getter vs readonly

class C 
{ 
    // One: 
    public static readonly int ValueAsAMember = 42; 

    // Two: 
    public static int ValueAsAProperty { get { return 42; } } 
} 

Я привык к написанию констант первого пути (если они не частные/внутренние, в этом случае я использую константное ключевое слово), но в последнее время я увидел вторую форму.

Есть ли какие-либо преимущества в отношении друг друга с точки зрения удобочитаемости, согласия, производительности или чего-либо еще?

+6

Это, вероятно, не очень хороший вопрос для SO. Но я все равно дам ответ: используйте 'const', который более или менее эквивалентен вашей первой строке. Во второй строке вводится вызов метода, который, вероятно, будет встроен, но в чем смысл? – siride

+3

Почему вы не используете «const»? – Crasher

+1

Единственное использование, которое я использую «readonly», - это когда я устанавливаю их в конструкторах, обычно это интерфейсы для TDD и designmode (WPF & SL). Использовать 'const' в этом примере и стандарте именования C#, а не c/C++ hehe;) –

ответ

11

Да, есть преимущество:

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

Если вам нужно заменить поле readonly свойством, вам придется перекомпилировать любые другие сборки, которые используют ваш класс.

+3

, но, пожалуйста, помните, что поле 'readonly' может быть изменено только в' constructor' 'class' – harry180

+0

@ harry180: Конечно, не требовалось бы иначе. Вот почему я упомянул, что поле «readonly» должно быть заменено свойством в описанном случае. –

+1

Отличная точка; Я об этом не думал. Я ценю тщательность ответа Песколино, а также ответ Дэниела Манна на других относительно ключевого слова const. Я намеренно не спрашивал об этом по этой причине, потому что это не было частью обсуждения. Спасибо всем за их ответы! – jia103

1

Главное преимущество для меня - readonly, вам разрешено объявлять его в любом месте вашего кода. Но у вас будет возможность установить его только один раз. С установщиком вы объявляете и устанавливаете одним махом.

2

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

В вашем примере const является лучшим, это константа в конце концов.

readonly

const

Приветствия

3

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

Важная вещь, чтобы отметить о const декларации (я не считаю, что это верно для readonly) является то, что изменение значения поля представляет собой изменение API, даже если вы просто изменить значение от 42 до 41. Причина в том, что для consts значение определяется во время компиляции, а это значит, что если я скомпилирую модуль, который использует вашу константу, и вы позже измените его, я все равно буду использовать старое значение, пока не перекомпилирую мой модуль с вашим новым версия.

1

Я думаю, что первая строка делает что-то постоянное или, скорее, readonly, используя ключевое слово readonly.

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

24

У вас есть три варианта:

  • public static readonly int Value = 42;
  • public static Value { get { return 42; } }
  • public const Value = 42;

Выбрать static readonly если значение не изменится во время выполнения, но может измениться в будущих версиях кода.

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

Выберите const, если значение действительно является константой, которая даже не изменится в будущих версиях (что-то вроде Math.PI или int.MinValue). И, конечно, использование const ограничено типом значения.

Разница между const и static readonly заключается в том, что значение const будет заменено на сайте вызова. Если вы измените значение const в будущей версии, тогда все сборки, которые полагаются на ваш класс, должны быть перекомпилированы с использованием нового значения.

Для свойства требуется вызов метода (вызов метода getter - это вызов метода). Поэтому, если значение является постоянным во время выполнения, в этом нет необходимости.

+1

", что означает: не выбирайте его для постоянного значения" Er, почему бы и нет? –

+0

@BenAaronson: В основном потому, что я думал, что для вызова метода возникнут некоторые накладные расходы. Но, переосмыслив это, я понял, что звонок будет включен. Я удалил этот сомнительный совет. Спасибо за указание. – pescolino

+0

+1 для части «не изменится в будущих версиях». Слишком много программистов забывают об этом состоянии. -1 для части «свойство требует вызова метода», поскольку компилятор может оптимизировать это. – CodesInChaos

6

Есть два основных отличия:

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

Второй, более интересный, то, что поля readonly МОЖЕТ быть изменен, пока объект строится. Возьмем следующий код:

public class MyTestClass 
{ 
    public readonly int MyInt = 1; 

    public MyTestClass() 
    { 
     MyInt = 2; 
    } 
} 

Если абонент делает

new MyTestClass().MyInt 

они получат 2. То же самое для статических конструкторов для статического readonly поля.

+0

+1 для упоминания интерфейсов. Полезно для развязывания реализаций. – Alejandro