Estes são os métodos atuais de declaração e inicialização para uma matriz simples.
string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2
Observe que existem outras técnicas para obter matrizes, como as ToArray()
extensões Linq ativadas IEnumerable<T>
.
Observe também que nas declarações acima, as duas primeiras podem substituir a string[]
da esquerda por var
(C # 3+), pois as informações à direita são suficientes para inferir o tipo apropriado. A terceira linha deve ser escrita como exibida, pois a sintaxe de inicialização do array por si só não é suficiente para satisfazer as demandas do compilador. O quarto também pode usar inferência. Portanto, se você gosta de toda a brevidade, o acima pode ser escrito como
var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2
var
variável?var x = {}
não funcionasse se o inicializador de matriz pudesse produzir algo além de matrizes, mas eu não saberia o que é isso. Então eu acho que o inicializador de array é um recurso de linguagem. Se você usá-lo comnew List<string> {"A", "B"}
isso, também produz algo diferente.As sintaxes de criação da matriz em C # que são expressões são:
No primeiro, o tamanho pode ser qualquer valor integral não negativo e os elementos da matriz são inicializados com os valores padrão.
No segundo, o tamanho deve ser uma constante e o número de elementos fornecidos deve corresponder. Deve haver uma conversão implícita dos elementos fornecidos para o tipo de elemento da matriz especificado.
No terceiro, os elementos devem ser implicitamente conversíveis no tipo de elemento, e o tamanho é determinado a partir do número de elementos fornecido.
No quarto, o tipo do elemento da matriz é inferido calculando o melhor tipo, se houver um, de todos os elementos fornecidos que possuem tipos. Todos os elementos devem ser implicitamente conversíveis nesse tipo. O tamanho é determinado a partir do número de elementos fornecidos. Essa sintaxe foi introduzida no C # 3.0.
Há também uma sintaxe que pode ser usada apenas em uma declaração:
Os elementos devem ser implicitamente conversíveis no tipo de elemento. O tamanho é determinado a partir do número de elementos fornecidos.
Eu o refiro à especificação do C # 4.0, seção 7.6.10.4 "Expressões de criação de matrizes".
fonte
Array.CreateInstance(typeof(int), 3)
!"1,2,3,4".split(',')
,.new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
, e assim por diante paraint[,,]
,int[,,,]
...Matrizes não vazias
var data0 = new int[3]
var data1 = new int[3] { 1, 2, 3 }
var data2 = new int[] { 1, 2, 3 }
var data3 = new[] { 1, 2, 3 }
var data4 = { 1, 2, 3 }
não é compilável. Use emint[] data5 = { 1, 2, 3 }
vez disso.Matrizes vazias
var data6 = new int[0]
var data7 = new int[] { }
var data8 = new [] { }
eint[] data9 = new [] { }
não são compiláveis.var data10 = { }
não é compilável. Use emint[] data11 = { }
vez disso.Como argumento de um método
Somente expressões que podem ser atribuídas com a
var
palavra - chave podem ser passadas como argumentos.Foo(new int[2])
Foo(new int[2] { 1, 2 })
Foo(new int[] { 1, 2 })
Foo(new[] { 1, 2 })
Foo({ 1, 2 })
não é compilávelFoo(new int[0])
Foo(new int[] { })
Foo({})
não é compilávelfonte
Criará uma matriz de cadeias vazias repetidas vezes 'count'. Caso você queira inicializar a matriz com o mesmo valor de elemento padrão ainda especial. Cuidado com os tipos de referência, todos os elementos referenciarão o mesmo objeto.
fonte
var arr1 = Enumerable.Repeat(new object(), 10).ToArray();
você recebe 10 referências para o mesmo objeto. Para criar 10 objetos distintos, você pode usarvar arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();
ou semelhante.fonte
Caso deseje inicializar uma matriz fixa de elementos iguais pré-inicializados (
null
diferentes ou nãodefault
), use o seguinte:Também participe desta discussão.
fonte
Exemplo para criar uma matriz de uma classe personalizada
Abaixo está a definição de classe.
É assim que você pode inicializar a matriz:
fonte
Repita sem LINQ :
fonte
ou
ou
e em matriz multidimensional
fonte
fonte
Outra maneira de criar e inicializar uma matriz de objetos. Isso é semelhante ao exemplo que o @Amol postou acima , exceto que este usa construtores. Uma pitada de polimorfismo se espalhou, eu não pude resistir.
Classes para o contexto:
fonte
Para a turma abaixo:
você pode inicializar a matriz do objeto acima como abaixo.
Espero que isto ajude.
fonte
Você também pode criar matrizes dinâmicas, ou seja, pode primeiro solicitar o tamanho da matriz ao usuário antes de criá-la.
fonte
Solução trivial com expressões. Observe que com NewArrayInit você pode criar apenas uma matriz unidimensional.
fonte
Apenas uma nota
As seguintes matrizes:
Será compilado para:
fonte