В чем разница между const и readonly? - PullRequest
1178 голосов
/ 11 сентября 2008

В чем разница между const и readonly и вы используете один над другим?

Ответы [ 32 ]

2 голосов
/ 04 августа 2015

Constant

Нам нужно предоставить значение в поле const, когда оно определено. Затем компилятор сохраняет значение константы в метаданных сборки. Это означает, что константа может быть определена только для типа примитива, такого как логическое значение, символ, байт и так далее. Константы всегда считаются статическими членами, а не членами экземпляра.

Readonly

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

Подробнее об обоих объясняется здесь в этой статье

1 голос
/ 10 апреля 2015

Постоянные переменные объявляются и инициализируются во время компиляции. Значение не может быть изменено после опеки. Переменные только для чтения будут инициализированы только из статического конструктора класса. Только чтение используется только тогда, когда мы хотим присвоить значение во время выполнения.

1 голос
/ 05 апреля 2014

Разница в том, что значение статического поля только для чтения задается во время выполнения, поэтому оно может иметь различное значение для разных исполнений программы. Тем не менее, значение поля const устанавливается на постоянную времени компиляции.

Помните: Для ссылочных типов в обоих случаях (статических и экземпляровых) модификатор readonly только запрещает вам назначать новую ссылку на поле. В частности, он не делает неизменным объект, на который указывает ссылка.

Подробнее см. В разделе Часто задаваемые вопросы по C # по этой теме: http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx

1 голос
/ 24 января 2014

ReadOnly: значение будет инициализировано только один раз из конструктора класса.
const: может быть инициализирован в любой функции, но только один раз

1 голос
/ 28 сентября 2013

Const и readonly похожи, но они не совсем одинаковы. Константное поле - это константа времени компиляции, что означает, что это значение может быть вычислено во время компиляции. Поле «только для чтения» включает дополнительные сценарии, в которых некоторый код должен выполняться во время конструирования типа. После создания поле только для чтения не может быть изменено.

Например, константные члены могут использоваться для определения таких членов, как:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

, поскольку такие значения, как 3.14 и 0, являются константами времени компиляции. Тем не менее, рассмотрим случай, когда вы определяете тип и хотите предоставить некоторые заранее созданные экземпляры этого типа. Например, вы можете определить класс Color и предоставить «константы» для общих цветов, таких как черный, белый и т. Д. Это невозможно сделать с помощью константных членов, поскольку правые части не являются константами времени компиляции. Это можно сделать с помощью обычных статических элементов:

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

но тогда ничто не может помешать клиенту Color с ним взломать, возможно, путем обмена значениями Black и White. Излишне говорить, что это вызвало бы смятение у других клиентов класса Color. Функция «только для чтения» предназначена для этого сценария. Просто вводя ключевое слово readonly в объявлениях, мы сохраняем гибкую инициализацию, предотвращая приглушение кода клиента.

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

Интересно отметить, что константные члены всегда являются статическими, тогда как член только для чтения может быть статическим или нет, как обычное поле.

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

public class A
{
    public static const C = 0;
}

и другой разработчик написал код, основанный на A:

public class B
{
    static void Main() {
        Console.WriteLine(A.C);
    }
}

Теперь, может ли генерируемый код основываться на том факте, что A.C является константой времени компиляции? Т.е. можно ли просто использовать A.C значением 0? Если вы скажете «да» на это, то это означает, что разработчик A не может изменить способ инициализации A.C - это связывает руки разработчика A без разрешения. Если вы ответите «нет» на этот вопрос, то пропустите важную оптимизацию. Возможно, автор A уверен, что A.C всегда будет нулевым. Использование как const, так и readonly позволяет разработчику A указать намерение. Это улучшает поведение при управлении версиями и повышает производительность.

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

A const должно быть жестко задано , где readonly может быть установлено в конструкторе класса.

1 голос
/ 08 сентября 2009

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

0 голосов
/ 04 июня 2019
  • когда использовать const или readonly

    • const

      • время компиляции константа: абсолют константа, значение устанавливается во время объявления, находится в самом коде IL
    • readonly

      • время выполнения константа: может быть задано в конструкторе / init через файл конфигурации, т.е. App.config, но после инициализации его нельзя изменить
0 голосов
/ 29 апреля 2019

Const : Абсолютное постоянное значение в течение срока службы приложения.

Только чтение : Может быть изменено во время работы.

0 голосов
/ 15 сентября 2008

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

Но с помощью const он будет свернут в код вызывающей стороны при компиляции вызывающей стороны.

Если вы достигли этого уровня владения C #, вы готовы к книге Билла Вагнера «Эффективное C #: 50 конкретных способов улучшить ваш C #». Который подробно отвечает на этот вопрос (и 49 других вещей).

...