Как инициализировать пустой массив в С#?

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

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

String[] a = new String[5];

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

Ответ 1

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

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

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

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

string[] emptyStringArray = new string[0]; 

Ответ 2

Попробуйте следующее:

string[] a= new string[] { };

Ответ 3

В .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];
}

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

См. также:

Ответ 4

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

string[] a = new string[0];

Ответ 5

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

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

Тем не менее, единственный способ объявить массив без указания размера - иметь пустой массив размер 0. гемант и 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);

Ответ 6

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

string[] a = { String.Empty };

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

Ответ 7

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

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

Array a = Array.CreateInstance(typeof(string), 5);

Ответ 8

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

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

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

Ответ 9

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

string[] array = {}

Ответ 10

Объединение предложений @nawfal и @Kobi:

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

Пример использования:

Array<string>.Empty

НТН

Ответ 11

Вот пример реального мира. В этом случае сначала необходимо инициализировать массив foundFiles до нулевой длины.

(Как подчеркивалось в других ответах: Это не инициализирует элемент, а не элемент с нулевым индексом, потому что это означает, что массив имел длину 1. После этой строки массив имеет нулевую длину!).

Если часть = string[0] опущена, возникает ошибка компилятора!

Это происходит из-за блока catch без повторного броска. Компилятор С# распознает путь кода, что функция Directory.GetFiles() может вызывать исключение, так что массив может быть неинициализирован.

Прежде чем кто-нибудь скажет, что повторное исключение было бы неправильной обработкой ошибок: это неверно. Обработка ошибок должна соответствовать требованиям.

В этом случае предполагается, что программа должна продолжаться в случае каталога, который не может быть прочитан, а не break. Лучшим примером является функция, проходящая через структуру каталогов. Здесь обработка ошибок только регистрирует его. Конечно, это можно сделать лучше, например. собирая все каталоги с неудачными вызовами GetFiles(Dir) в списке, но это приведет слишком далеко здесь.

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

Вызов GetFiles(Dir) изменяет размер массива.

string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
    foundFiles = Directory.GetFiles(dir);  // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
  Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
  // throw; // This would throw Exception to caller and avoid compiler error
}

foreach (string filename in foundFiles)
    Console.WriteLine("Filename: " + filename);

Ответ 12

Я пробовал:

string[] sample = new string[0];

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

string[] sample = new string[100];

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

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

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

sample.Add(your input);