Например, есть метод, который на вход принимает массив значений.
Этот метод всегда вызывается с одними и теми же значениями и в одном месте программы и поэтому я не парясь делаю так:
SomeMethod(new[] {1,2,3,4})
Вопрос в том:
Додумается компилятор или среда где-то закешировать это или каждый раз будет создавать новый массив и в этом случае массив лучше хранить в поле класса?
Код
static void Main() {
SomeMethod(new[] {1,2,3,4});
}
Преобразуется в
IL_0001: ldc.i4.4
IL_0002: newarr [mscorlib]System.Int32
IL_0007: dup
IL_0008: ldtoken field valuetype nnn
IL_000d: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array,
valuetype [mscorlib]System.RuntimeFieldHandle)
IL_0012: call void Demo::SomeMethod(int32[])
newarr - резервирует память, а с токена посредством InitializeArray загружаются (копируются) данные об 1,2,3.
Да, лучше хранить в константе класса.
Для строк работает интернирование. Такой трюк имеет смысл потому, что они иммутабельны, чем не могут похвастать массивы, поэтому для них кэширование нужно делать руками.
массив лучше хранить в поле класса?
В статическом поле.
private static readonly int[] myValues = new {1, 2, 3};
// .NET Core
private static readonly ImmutableArray<int> myValues = ImmutableArray.Create(1, 2, 3);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей