Какая разница между readonly, const и свойства без set. Почему const выводится также как и static? (C#)

Рейтинг: 0Ответов: 1Опубликовано: 25.01.2023

Я пишу код на C# и не понимаю разницу между readonly, const и свойства без set. А также не понимаю, почему const выводится так же как и static:

using System;
class HelloWorld {
    readonly public static int num1 = 
     10;
    public static int num2{get;} = 15;
    public const num3 = 20;
  
    static void Main() {
    }
}

Ответы

▲ 3

Разница состоит в том, что константы имеют значения еще на этапе компиляции, так же они являются статичными, точно такие же как и вы руками делаете 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)