Все возможные синтаксисы инициализации массива - PullRequest
626 голосов
/ 15 апреля 2011

Каковы все синтаксисы инициализации массива, которые возможны в C #?

Ответы [ 13 ]

660 голосов
/ 15 апреля 2011

Это текущие методы объявления и инициализации для простого массива.

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

Обратите внимание, что существуют другие методы получения массивов, такие как расширения Linq ToArray() для IEnumerable<T>.

Также обратите внимание, что в приведенных выше объявлениях первые два могут заменить string[] слева на var (C # 3+), так как информации справа достаточно, чтобы вывести правильный тип.Третья строка должна быть записана так, как показано, поскольку одного синтаксиса инициализации массива недостаточно для удовлетворения требований компилятора.Четвертый может также использовать умозаключение.Так что, если вам нравится вся эта краткость, вышеприведенное можно записать как

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 
416 голосов
/ 15 апреля 2011

Синтаксис создания массива в C #, представляющий собой выражения :

new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }

В первом случае размер может быть любым неотрицательным целочисленным значением, и элементы массива инициализируютсяк значениям по умолчанию.

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

В третьем элемент должен быть неявно преобразован в тип элемента, а размер определяется из числа заданных элементов..

В четвертом тип элемента массива определяется путем вычисления наилучшего типа, если он есть, из всех заданных элементов, имеющих типы.Все элементы должны быть неявно конвертируемыми в этот тип.Размер определяется по количеству приведенных элементов.Этот синтаксис был введен в C # 3.0.

Существует также синтаксис, который может использоваться только в объявлении:

int[] x = { 10, 20, 30 };

Элементы должны быть неявно преобразованы в тип элемента.Размер определяется по количеству заданных элементов.

Руководства "все в одном" не существует

Я отсылаю вас к спецификации C # 4.0, раздел 7.6.10.4 «Выражения создания массива».

100 голосов
/ 14 августа 2014

Непустые массивы

  • 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 } не компилируется. Вместо этого используйте int[] data5 = { 1, 2, 3 }.

Пустые массивы

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } и int[] data9 = new [] { } не компилируются.

  • var data10 = { } не компилируется. Вместо этого используйте int[] data11 = { }.

В качестве аргумента метода

В качестве аргументов могут передаваться только выражения, которые могут быть назначены с ключевым словом var.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) не компилируется
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) не компилируется
46 голосов
/ 06 мая 2014
Enumerable.Repeat(String.Empty, count).ToArray()

Создает массив пустых строк, повторяемых 'count' раз. В случае, если вы хотите инициализировать массив с тем же, но специальным значением элемента по умолчанию. Осторожно со ссылочными типами, все элементы будут ссылаться на один и тот же объект.

17 голосов
/ 29 августа 2015
var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};
15 голосов
/ 20 декабря 2015

Если вы хотите инициализировать фиксированный массив предварительно инициализированных равных (не null или иных, чем default) элементов, используйте это:

var array = Enumerable.Repeat(string.Empty, 37).ToArray();

Также, пожалуйста, примите участие в этом обсуждении.

12 голосов
/ 02 сентября 2016

Пример создания массива пользовательского класса

Ниже приведено определение класса.

public class DummyUser
{
    public string email { get; set; }
    public string language { get; set; }
}

Вот как вы можете инициализировать массив:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "abc.xyz@email.com",
       language = "English"
    },
    new DummyUser{
       email = "def@email.com",
       language = "Spanish"
    }
};
7 голосов
/ 08 марта 2016

Повтор без LINQ :

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
6 голосов
/ 24 июля 2013
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

или

string[] week = new string[] {"Sunday","Monday","Tuesday"};

или

string[] array = { "Sunday" , "Monday" };

и в многомерном массиве

    Dim i, j As Integer
    Dim strArr(1, 2) As String

    strArr(0, 0) = "First (0,0)"
    strArr(0, 1) = "Second (0,1)"

    strArr(1, 0) = "Third (1,0)"
    strArr(1, 1) = "Fourth (1,1)"
3 голосов
/ 07 марта 2018
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
...