Можно ли создать пустой массив без указания размера?
Например, я создал:
String[] a = new String[5];
Можно ли создать массив строк без размера?
Можно ли создать пустой массив без указания размера?
Например, я создал:
String[] a = new String[5];
Можно ли создать массив строк без размера?
Если вы собираетесь использовать коллекцию, которой вы не знаете размер заранее, есть лучшие варианты, чем массивы.
Вместо этого используйте List<string>
- он позволит вам добавить столько элементов, сколько вам нужно, и если вам нужно вернуть массив, вызовите ToArray()
для переменной.
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
Если вы должны создать пустой массив, вы можете сделать это:
string[] emptyStringArray = new string[0];
Попробуйте следующее:
string[] a= new string[] { };
В .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];
}
(код, связанный с кодом, удаленный для ясности)
См. также:
Array.Empty
исходный код в исходном источникеArray.Empty<T>()
Вы можете инициализировать его с размером 0, но вам придется повторно инициализировать его, когда вы знаете, что такое размер, поскольку вы не можете добавить его в массив.
string[] a = new string[0];
В объявлении массива без размера не так много смысла. Массив имеет размер. Когда вы объявляете массив определенного размера, вы указываете фиксированное количество слотов, доступных в коллекции, которые могут содержать вещи, и, соответственно, выделяется память. Чтобы добавить что-то к этому, вам придется в любом случае повторно инициализировать существующий массив (даже если вы изменяете размер массива, см. Этот поток). Один из редких случаев, когда вы хотите инициализировать пустой массив, - это передать массив в качестве аргумента.
Если вы хотите определить коллекцию, когда вы не знаете, какой размер это может быть возможно, массив не ваш выбор, а что-то вроде 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);
Вы можете сделать:
string[] a = { String.Empty };
Примечание: OP означало, что не нужно указывать размер, а не сделать массив без изменений
Вы можете определить размер массива во время выполнения.
Это позволит вам делать все возможное, чтобы динамически вычислять размер массива. Но, как только определенный размер является неизменным.
Array a = Array.CreateInstance(typeof(string), 5);
Как я знаю, вы не можете создавать массив без размера, но можете использовать
List<string> l = new List<string>()
а затем l.ToArray()
.
Простой и элегантный!
string[] array = {}
Объединение предложений @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
НТН
Вот пример реального мира. В этом случае сначала необходимо инициализировать массив 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);
Я пробовал:
string[] sample = new string[0];
Но я мог только вставить в него одну строку, а затем получил ошибку exceptionOutOfBound, поэтому просто добавлю для нее размер, например
string[] sample = new string[100];
Или другой способ, который работает для меня:
List<string> sample = new List<string>();
Назначение значения для списка:
sample.Add(your input);