É possível criar uma matriz vazia sem especificar o tamanho?
Por exemplo, eu criei:
String[] a = new String[5];
Podemos criar a matriz de strings acima sem o tamanho?
c#
arrays
initialization
yogesh
fonte
fonte
Respostas:
Se você vai usar uma coleção que você não conhece antecipadamente o tamanho, há opções melhores do que matrizes.
Use um
List<string>
- em vez disso, você poderá adicionar quantos itens precisar e, se precisar retornar uma matriz, chameToArray()
a variável.Se você deve criar uma matriz vazia, você pode fazer isso:
fonte
string[]
que não possui elementos. Se você tentar acessaremptyStringArray[0]
, você terá uma #IndexOutOfRangeException
Tente o seguinte:
fonte
int[] variable = new int[]{}
e usá-lo, por exemplo, em um loop, comoforeach (var s in variable){ Console.WriteLine(s);}
o código, é compilado para:int[] args1 = new int[0];
eforeach (int num in args1){Console.WriteLine(num);}
. Portanto, não deve haver diferença entre usarnew int[0]
enew int[]{}
como os dois são compilados no mesmo código.var
, embora apenas para variáveis locais (não para campos). No entanto, no C # 2.0 (Visual Studio 2005) e versões anteriores, era necessário usar a sintaxe desta resposta (oustring[] a = new string[0];
).No .NET 4.6, a maneira preferida é usar um novo método
Array.Empty
:A implementação é sucinta, usando como os membros estáticos em classes genéricas se comportam em .Net :
(código relacionado ao contrato de código removido para maior clareza)
Veja também:
Array.Empty
código fonte na fonte de referênciaArray.Empty<T>()
fonte
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
se não criar uma matriz. Retorna uma referência a uma matriz pré-alocada.Você pode inicializá-lo com um tamanho de 0, mas precisará reinicializá-lo quando souber qual é o tamanho, pois não poderá anexá-lo à matriz.
fonte
Não há muito sentido em declarar uma matriz sem tamanho. Uma matriz é sobre o tamanho . Ao declarar uma matriz de tamanho específico, você especifica o número fixo de slots disponíveis em uma coleção que pode conter itens e, portanto, a memória é alocada. Para adicionar algo a ele, você precisará reinicializar de qualquer maneira a matriz existente (mesmo que você esteja redimensionando a matriz, consulte este tópico ). Um dos raros casos em que você desejaria inicializar uma matriz vazia seria passar a matriz como argumento.
Se você deseja definir uma coleção quando não sabe qual o tamanho possível, a matriz não é sua escolha, mas algo como um
List<T>
ou semelhante.Dito isto, a única maneira de declarar uma matriz sem especificar o tamanho é ter uma matriz vazia do tamanho 0 . hemant e Alex Dn fornecem duas maneiras. Outra alternativa mais simples é apenas :
[ Os elementos dentro do colchete devem ser implicitamente conversíveis no tipo definido, por exemplo,
string[] a = { "a", "b" };
]Ou ainda outro:
Aqui está uma maneira mais declarativa :
Agora você pode ligar para:
fonte
Simples e elegante!
fonte
array
para apenasa
, comoarray
é uma palavra-chave quando capitalizada. É uma prática ruim usar um nome de palavra-chave como nome de variável - mesmo que o caso seja diferente. E basicamente o mesmo que a minha resposta, exceto que eu tinhaString.Empty
lá.a
é ruim?string[] a = new string[0];
ou notação curta:
string[] a = { };
A maneira preferida agora é:
var a = Array.Empty<string>();
Eu escrevi uma expressão regular curta que você pode usar no Visual Studio se quiser substituir alocações de tamanho zero, por exemplo
new string[0]
. Use a opção Localizar (pesquisa) no Visual Studio com a Expressão regular ativada:new[ ][a-zA-Z0-9]+\[0\]
Agora Encontre Tudo ou F3 (Localizar Próximo) e substitua tudo por Array.Empty <…> ()!
fonte
Você pode definir o tamanho da matriz em tempo de execução .
Isso permitirá que você faça o que for necessário para calcular dinamicamente o tamanho da matriz. Mas, uma vez definido, o tamanho é imutável.
fonte
int i = 5; string[] a = new string[i];
Eu tentei:
Mas eu só consegui inserir uma string e, em seguida, recebi um erro exceptionOutOfBound, então simplesmente coloquei um tamanho para ela, como
Ou de outra maneira que funcione para mim:
Atribuindo valor à lista:
fonte
Como eu sei, você não pode fazer array sem tamanho, mas pode usar
e depois
l.ToArray()
.fonte
Combinando as sugestões @nawfal e @Kobi:
Exemplo de uso:
ATUALIZAÇÃO 14-05-2019
(créditos para @Jaider ty)
Melhor uso da API .Net:
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Aplica-se a:
.NET Core: 3.0 Pré-visualização 5 2.2 2.1 2.0 1.1 1.0
.NET Framework: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET Standard: 2.1 Visualização 2.0 1.6 1.5 1.4 1.3
...
HTH
fonte
arr = Array.Empty<string>();
Você pode fazer:
Nota: OP significava não ter que especificar um tamanho, não tornar uma matriz sem tamanho
fonte
specify
um tamanho, não criar uma matrizsizeless
.Aqui está um exemplo do mundo real. Nesse sentido, é necessário inicializar a matriz
foundFiles
primeiro com comprimento zero.(Como enfatizado em outras respostas: Isso inicializa não um elemento e, especialmente, um elemento com índice zero, porque isso significaria que a matriz tinha comprimento 1. A matriz tem comprimento zero após esta linha!).
Se a peça
= string[0]
for omitida, há um erro do compilador!Isso ocorre por causa do bloco de captura sem religação. O compilador C # reconhece o caminho do código, que a função
Directory.GetFiles()
pode lançar uma exceção, para que a matriz possa ser não inicializada.Antes que alguém diga, não reler a exceção seria um tratamento incorreto de erros: isso não é verdade. O tratamento de erros deve atender aos requisitos.
Nesse caso, supõe-se que o programa continue no caso de um diretório que não possa ser lido e não quebre - o melhor exemplo é uma função que atravessa uma estrutura de diretórios. Aqui, a manipulação de erros está apenas registrando-a. É claro que isso poderia ser feito melhor, por exemplo, coletando todos os diretórios com
GetFiles(Dir)
chamadas com falha em uma lista, mas isso levará muito longe aqui.É suficiente afirmar que evitar
throw
é um cenário válido e, portanto, a matriz deve ser inicializada com o comprimento zero. Seria o suficiente para fazer isso no bloco catch, mas seria um estilo ruim.A chamada para
GetFiles(Dir)
redimensionar a matriz.fonte