Есть ли выигрыш в производительности при использовании модификаторов 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
}
}