▷ 4 maneiras diferentes de criar um Array em C# | 4Devs
Neste artigo vou mostrar 4 maneiras diferentes para criar um array em C# e como essas maneiras se diferem uma das outras
Utilizando "new"
A primeira é bem óbvia, nós usamos o operador new para criar um novo array:
var meuArray = new  int[100];
Nós criamos um array com 100 elementos. O importante aqui é que "nós" tivemos que fazer o trabalho difícil de criar o array, mas por outro lado, nós não somos responsáveis por liberar a memória. O querido Garbage Collector (GC) faz isso por nós.
Você pode imaginar um ArrayPool como uma carona de carro. Você vai compartilhar o array com outros. Quando você precisar de um array, você pode "aluga-lo" temporariamente para utilização, mas você tem que devolve-lo após o trabalho. Essa é a grande diferença entre criar um novo array com new. A responsabilidade de limpar essa memória recai sobre você.
var meuArray = ArrayPool<int>.Shared.Rent(100);
// Faça seu trabalho
ArrayPool<int>.Shared.Return(meuArray);
Mas tenha certeza que você vai devolver o array, senão o ArrayPool pode ficar totalmente ocupado, e por não ter mais recursos para emprestar ele terá que criar novos elementos no seu estoque, o que pode degradar sua performance. Outra coisa especial aqui é, que nós usamos a instância Shared do ArrayPool e o método Rent. Seu único parâmetro é chamado minimumLenght, que significa que seu array terá garantidamente o tamanho mínimo, mas pode também ser maior que o solicitado. Se você quiser saber mais sobre isso, leia este artigo.
GC.AllocateArray é outra maneira de criar um array. Isto tem dois parâmetros: O Primeiro é o lenght mais um booleano para indicar se o array deve ser pinned. Arrays marcados como Pinned significam que o GC não deve mover pela memória os blocos associados com o array. Isto é muito útil se você trabalha com recursos não gerenciados, de outra forma, não existem muitas razões para utiliza-lo. De qualquer forma, você pode chegar ao mesmo resultado utilizando arrays "normais" com o termo fixed. Aqui está como você poderia utilizar o GC.AllocateArray:
var meuArray = GC.AllocateArray<int>(100);
Esta maneira de criar um array através do AllocateUninitializedArray faz praticamente a mesma coisa que o GC.AllocateArray<int> com um pequeno toque. Normalmente no .NET os arrays são inicializados com o valor padrão, então, se você tem algo como: var meuArray = new int[2]; Então meuArray[0] == 0; e meuArray[1] == 0. Em termos de performance isso pode ser um pouco mais rápido do que a versão inicializada. De qualquer forma, você pode chegar ao mesmo resultado utilizando SkipLocalsInitAttribute. Aqui está como você poderia utilizar o GC.AllocateUninitializedArray:
Vamos verificar como estas diferentes maneiras de criar array se comportam com tamanhos diferentes.
Aviso: Utilize new[] na maioria dos casos. As outras opções são designadas para otimizações profundas e não para uso geral. Então teste seu caso de uso e decida mais tarde.
public class ArrayBenchmark
|              Metodo | ArraySize |             Mean |          Error |         StdDev |           Median | Ratio | RatioSD |    Gen 0 |    Gen 1 |    Gen 2 |   Allocated |
Como você pode ver, o ArrayPool usa um pouco mais de espaço do que o solicitado. Também para pequenos arrays, não há razão real para aplicar as alternativas abordadas. Novamente, por favor teste seu caso de uso primeiro e tenha cuidado com as consequências e as "novas" responsabilidades.