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

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

13 ответов


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

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 

массив создание синтаксиса в 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 "выражения создания массива".


непустых массивов

  • 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 = { } не компилируется. Использовать .

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

только выражения, которые могут быть назначены с 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({}) не компилируется

Enumerable.Repeat(String.Empty, count).ToArray()

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


var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};

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

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

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


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

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

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"
    }
};

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)"

повторить без LINQ:

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);

For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };

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

Console.Write("Enter size of array");
int n = Convert.ToInt16(Console.ReadLine());

int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n
Console.WriteLine("Input Elements");
for(int i=0;i<n;i++)
{
     dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine());
}

Console.WriteLine("Elements of array are :");
foreach (int i in dynamicSizedArray)
{
    Console.WriteLine(i);
}
Console.ReadKey();

тривиальное решение с помощью выражений. Обратите внимание, что с NewArrayInit вы можете создать только одномерный массив.

NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) });
int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback

другой способ создания и инициализации массива объектов. Это похоже на пример, который @Amol опубликовал выше, кроме этого используются конструкторы. Капелька полиморфизма, я не смогла удержаться.

IUser[] userArray = new IUser[]
{
    new DummyUser("abc@cde.edu", "Gibberish"),
    new SmartyUser("pga@lna.it", "Italian", "Engineer")
};

классы для контекста:

interface IUser
{
    string EMail { get; }       // immutable, so get only an no set
    string Language { get; }
}

public class DummyUser : IUser
{
    public DummyUser(string email, string language)
    {
        m_email = email;
        m_language = language;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }
}

public class SmartyUser : IUser
{
    public SmartyUser(string email, string language, string occupation)
    {
        m_email = email;
        m_language = language;
        m_occupation = occupation;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }

    private string m_occupation;
}