Кеширует ли .NET коллекцию?

91
19 мая 2021, 05:40

Например, есть метод, который на вход принимает массив значений.

Этот метод всегда вызывается с одними и теми же значениями и в одном месте программы и поэтому я не парясь делаю так:

SomeMethod(new[] {1,2,3,4})

Вопрос в том:

Додумается компилятор или среда где-то закешировать это или каждый раз будет создавать новый массив и в этом случае массив лучше хранить в поле класса?

Answer 1

Код

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.

Да, лучше хранить в константе класса.

Answer 2

Для строк работает интернирование. Такой трюк имеет смысл потому, что они иммутабельны, чем не могут похвастать массивы, поэтому для них кэширование нужно делать руками.

массив лучше хранить в поле класса?

В статическом поле.

private static readonly int[] myValues = new {1, 2, 3};
// .NET Core
private static readonly ImmutableArray<int> myValues = ImmutableArray.Create(1, 2, 3);
READ ALSO
Не понимаю как работает такой массив

Не понимаю как работает такой массив

Что я должен написать в ShopCost[index] и в ShopBonus[index]? Как нужно обявить масивы ShopCost[index] и ShopBonus[index]Ну я имею виду я обявляю масивы так

98
При возвращении IEnumerable из контроллера не перехватывается Exception

При возвращении IEnumerable из контроллера не перехватывается Exception

Есть метод в контроллере который возвращает IEnumerable, в процессе конвейера LINQ происходит Exception и фильтр эксепшенов не перехватывает этот эксепшен...

131
Как заполнить поля на сайте для POST запроса

Как заполнить поля на сайте для POST запроса

На сайте есть два поля-календаря, которыми задается интервал дат, за который необходимо получить информацию из БДНикак не могу понять, каким...

77
Как сохранять ответы пользователей на открытые вопросы анкеты (заранее не подготовленные)?

Как сохранять ответы пользователей на открытые вопросы анкеты (заранее не подготовленные)?

Проектирую MySQL базу данных для хранения анкет и ответов пользователей на вопросы этих анкетНа основе данных из базы формируется JSON

92