Как инициализировать пустой массив в C #? - PullRequest
271 голосов
/ 04 января 2012

Можно ли создать пустой массив без указания размера?

Например, я создал:

String[] a = new String[5];

Можем ли мы создать приведенный выше массив строк без размера?

Ответы [ 12 ]

373 голосов
/ 04 января 2012

Если вы собираетесь использовать коллекцию, размер которой заранее не известен, есть лучшие варианты, чем массивы.

Вместо этого используйте List<string> - это позволит вам добавить столько элементов, сколько вам нужно, и, если вам нужно вернуть массив, вызвать ToArray() для переменной.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

Если вы должны создать пустой массив, вы можете сделать это:

string[] emptyStringArray = new string[0]; 
164 голосов
/ 04 января 2012

Попробуйте это:

string[] a= new string[] { };
84 голосов
/ 04 ноября 2015

В .Net 4.6 предпочтительным способом является использование нового метода, Array.Empty:

String[] a = Array.Empty<string>();

Реализация является краткой, используя как ведут себя статические члены в универсальных классах в .Net :

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(код, связанный с контрактом, для ясности удален)

См. также:

30 голосов
/ 04 января 2012

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

string[] a = new string[0];
7 голосов
/ 03 сентября 2013

Нет смысла объявлять массив без размера. Массив имеет размер . Когда вы объявляете массив определенного размера, вы указываете фиксированное количество слотов, доступных в коллекции, которая может содержать объекты, и, соответственно, выделяется память. Чтобы что-то добавить к нему, вам в любом случае потребуется повторно инициализировать существующий массив (даже если вы изменяете размер массива, см. Этот поток ). Одним из редких случаев, когда вы хотите инициализировать пустой массив, является передача массива в качестве аргумента.

Если вы хотите определить коллекцию, когда вы не знаете, какого размера она может быть, массив - это не ваш выбор, а что-то вроде List<T> или аналогичное.

Тем не менее, единственный способ объявить массив без указания размера - это иметь пустой массив size 0 . hemant и Alex Dn предоставляет два способа. Другая более простая альтернатива - просто :

string[] a = { };

[ Элементы в скобках должны быть неявно преобразованы в определенный тип, например, string[] a = { "a", "b" };]

Или еще один:

var a = Enumerable.Empty<string>().ToArray();

Вот более декларативный способ :

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

Теперь вы можете позвонить:

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);
4 голосов
/ 08 мая 2015

Вы можете сделать:

string[] a = { String.Empty };

Примечание: OP означает, что нет необходимости указывать размер, а не создавать массив без размера

3 голосов
/ 25 декабря 2016

Просто и элегантно!

string[] array = {}
2 голосов
/ 18 апреля 2017

Я пытался:

string[] sample = new string[0];

Но я мог вставить в нее только одну строку, и тогда я получил ошибку исключения OutOfBound, поэтому я просто добавил для него размер, например

string[] sample = new string[100];

Или другой способ, который мне подходит:

List<string> sample = new List<string>();

Назначение значения для списка:

sample.Add(your input);
2 голосов
/ 04 января 2012

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

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

Array a = Array.CreateInstance(typeof(string), 5);
1 голос
/ 04 января 2012

Как я знаю, вы не можете создать массив без размера, но вы можете использовать

List<string> l = new List<string>() 

, а затем l.ToArray().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...