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

С# getter vs readonly

Есть ли разница между следующими?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Существуют два основных отличия:

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

Во-вторых, более интересно, что поля readonly CAN могут быть изменены, а объект строится. Возьмите следующий код:

public class MyTestClass
{
    public readonly int MyInt = 1;

    public MyTestClass()
    {
        MyInt = 2;
    }
}

Если вызывающий абонент

new MyTestClass().MyInt

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

Ответ 4

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

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

Ответ 5

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

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

readonly

const

Приветствия

Ответ 6

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

Ответ 7

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

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

Ответ 8

Свойство - это просто синтаксический сахар вокруг поля, свойство без установщика просто объявляется как поле только для чтения, поэтому компилятор позволит вам установить его в время выполнения в конструкторе, потому что компилятор, на который вы ссылаетесь в поле только для чтения. Существует более широкое обсуждение того, что использовать поле или свойство, что не входит в сферу вопроса. И да, это тот синтаксический сахар, который вы должны выполнить перекомпиляцию, на которую ссылается @SOreadytohelp. Просто чтобы прояснить, что свойство - это поле с методом get и set, созданным для него, С# позволит вам ссылаться на него как на поле, а не делать раздражающий вызов метода получения или установки каждый раз.