Разница в том, что значение статического поля только для чтения устанавливается во время выполнения и, таким образом, может быть изменено содержащим классом, тогда как значение константного поля устанавливается в постоянную времени компиляции.
В случае статического чтения только содержащему классу разрешено изменять только его
в объявлении переменной (через инициализатор переменной)
в статическом конструкторе (конструкторы экземпляров, если он не статический)
static readonly обычно используется, если тип поля не разрешен в объявлении const или когда значение неизвестно во время компиляции.
Поля экземпляра только для чтения также допускаются.
Помните, что для ссылочных типов в обоих случаях (статических и экземпляровых) модификатор readonly только запрещает вам назначать новую ссылку на поле. В частности, он не делает неизменным объект, на который указывает ссылка.
class Program
{
public static readonly Test test = new Test();
static void Main(string[] args)
{
test.Name = "Program";
test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)
}
}
class Test
{
public string Name;
}
Различие состоит в том, что статический доступный только для чтения может быть изменен содержащим классом, но const никогда не может быть изменен и должен быть инициализирован как постоянная времени компиляции. Чтобы немного расширить статический случай только для чтения, содержащий его класс может только изменить его:
- в объявлении переменной (через инициализатор переменной).
- в статическом конструкторе (конструкторы экземпляров, если он не является статическим).
Const Keyword в C # .NET
Пример: public const string abc = “xyz”;
Инициализируется только при объявлении.
Значение оценивается во время компиляции и не может быть изменено во время выполнения.
Попытка изменить его приведет к ошибке компиляции.
Const уже отчасти статичен.
Так как классы и структуры инициализируются во время выполнения с новым ключевым словом, вы не можете установить константу для класса или структуры. Но это должен быть один из целочисленных типов.
Ключевое слово только для чтения в C # .NET
Пример: public readonly string abc;
Может быть инициализирован в коде объявления или в коде константора.
Значение оценивается во время выполнения.
Может быть объявлен как статический атрибут или атрибут уровня экземпляра.
Поле только для чтения может содержать сложный объект, используя ключевое слово new во время выполнения.