Разница состоит в том, что константы имеют значения еще на этапе компиляции, так же они являются статичными, точно такие же как и вы руками делаете static
, буквально ничем не отличается. Readonly
полям можно установить значение лишь единожды - в конструкторе.
Если посмотрим на IL кода ниже:
public class MyClass
{
public const string MyConst = "myConst";
private readonly string _myReadonly;
public MyClass(string myReadonly)
{
_myReadonly = myReadonly;
}
}
То получим как раз таки то, о чём я и говорю выше. Значение у константы известно + статично, а поля readonly
просто объявлены как "только для инициализации в конструкторе":
.field public static literal string MyConst = "1234"
.field private initonly string _myReadonly
Ну а get-only
свойства компилируются только лишь в 1 метод get_BackingField
, в то время как get-set
свойства компилируются в 2 метода: get_BackingField
и set_BackingField
.
Про то, во что компилируются свойства можно почитать вот тут, хоть в ссылке вопрос о другом, но я там наглядно показываю что такое свойство в C#.
И, если не ошибаюсь, то константы определяются в заголовках PE файлов (exe или dll)