Например, есть метод, который на вход принимает массив значений.
Этот метод всегда вызывается с одними и теми же значениями и в одном месте программы и поэтому я не парясь делаю так:
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Что я должен написать в ShopCost[index] и в ShopBonus[index]? Как нужно обявить масивы ShopCost[index] и ShopBonus[index]Ну я имею виду я обявляю масивы так
Есть метод в контроллере который возвращает IEnumerable, в процессе конвейера LINQ происходит Exception и фильтр эксепшенов не перехватывает этот эксепшен...
На сайте есть два поля-календаря, которыми задается интервал дат, за который необходимо получить информацию из БДНикак не могу понять, каким...
Проектирую MySQL базу данных для хранения анкет и ответов пользователей на вопросы этих анкетНа основе данных из базы формируется JSON