Есть ли выигрыш в производительности при использовании модификаторов const или readonly полей в C#?

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

например:

public class FooBaar
{
     private string foo = "something";
     private const string baar = "something more"

     public void Baaz()
     {
         //access foo, access baar
     }
}

в приведенном выше примере вы можете видеть, что есть два поля:foo и baar. Оба недоступны вне класса, так как многие люди предпочитают использовать const здесь, а не просто private. Делает const обеспечить любую производительность выгода?


этот вопрос был ранее закрыт сообществом, потому что люди неправильно поняли этот вопрос как " в чем разница между const и readonly С точки зрения производительности?", на который был дан ответ здесь: в чем разница между const и readonly?.
Но на самом деле я имею в виду, "я могу получить любого бенефис с помощью const или readonly более не использовать ни один из них".

2 ответов


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


const будет оптимизирован компилятором для вставки в ваш код, только чтение не может быть встроено. Однако вы не можете сделать константы всех типов - поэтому здесь вы должны сделать их только для чтения.

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

в качестве примера:

public class Example
{
    private const int foo = 5;
    private readonly Dictionary<int, string> bar = new Dictionary<int, string>();

    //.... missing stuff where bar is populated

    public void DoSomething()
    {
       Console.Writeline(bar[foo]);

       // when compiled the above line is replaced with Console.Writeline(bar[5]);
       // because at compile time the compiler can replace foo with 5
       // but it can't do anything inline with bar itself, as it is readonly
       // not a const, so cannot benefit from the optimization
    }
}