Можно ли создать пустой массив без указания размера?
Например, я создал:
String[] a = new String[5];
Можем ли мы создать массив строк без размера?
c#
arrays
initialization
Йогеш
источник
источник
Ответы:
Если вы собираетесь использовать коллекцию, размер которой заранее не известен, есть лучшие варианты, чем массивы.
Используйте
List<string>
вместо этого - это позволит вам добавить столько элементов, сколько вам нужно, и, если вам нужно вернуть массив, вызовитеToArray()
переменную.Если вам нужно создать пустой массив, вы можете сделать это:
источник
string[]
что не имеет элементов. Если вы попытаетесь получить доступemptyStringArray[0]
, вы получитеIndexOutOfRangeException
Попробуй это:
источник
int[] variable = new int[]{}
и использовании, например, в цикле, таком какforeach (var s in variable){ Console.WriteLine(s);}
код, компилируется в:int[] args1 = new int[0];
иforeach (int num in args1){Console.WriteLine(num);}
. Поэтому не должно быть никакой разницы между использованиемnew int[0]
и тем,new int[]{}
что оба компилируются в один и тот же код.var
, хотя только для локальных переменных (не для полей). Однако в C # 2.0 (Visual Studio 2005) и более ранних версиях вам пришлось использовать синтаксис этого ответа (илиstring[] a = new string[0];
).В .NET 4.6 предпочтительным способом является использование нового метода
Array.Empty
:Реализация является лаконичной, используя как статические члены в общих классах ведут себя в .NET :
(код, связанный с контрактом, код удален для ясности)
Смотрите также:
Array.Empty
исходный код на источник ссылкиArray.Empty<T>()
источник
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
это не создает массив. Возвращает ссылку на предварительно выделенный массив.Вы можете инициализировать его с размером 0, но вам придется повторно инициализировать его, когда вы знаете, каков его размер, поскольку вы не можете добавить его в массив.
источник
Нет особого смысла объявлять массив без размера. Массив имеет размер . Когда вы объявляете массив определенного размера, вы указываете фиксированное количество слотов, доступных в коллекции, которая может содержать объекты, и, соответственно, выделяется память. Чтобы что-то добавить к нему, вам все равно нужно будет повторно инициализировать существующий массив (даже если вы изменяете размер массива, см. Эту ветку ). Одним из редких случаев, когда вы хотите инициализировать пустой массив, является передача массива в качестве аргумента.
Если вы хотите определить коллекцию, когда вы не знаете, какого размера она может быть, массив - это не ваш выбор, а что-то вроде a
List<T>
или подобное.Тем не менее, единственный способ объявить массив без указания размера - это иметь пустой массив размером 0 . Хемант и Алекс Дн предоставляют два пути. Другая более простая альтернатива - просто :
[ Элементы внутри скобки должны быть неявно преобразованы в тип, определенный, например,
string[] a = { "a", "b" };
]Или еще один:
Вот более декларативный способ :
Теперь вы можете позвонить:
источник
Просто и элегантно!
источник
array
на простоa
, какarray
это ключевое слово, когда оно пишется с большой буквы. Просто плохая практика использовать ключевое слово в качестве имени переменной - даже если дело обстоит иначе. И в основном такой же, как мой ответ, кроме меняString.Empty
там.a
это плохо?string[] a = new string[0];
или краткая запись:
string[] a = { };
Предпочтительный способ сейчас:
var a = Array.Empty<string>();
Я написал короткое регулярное выражение, которое можно использовать в Visual Studio, если вы хотите заменить выделения нулевой длины, например
new string[0]
. Используйте Find (поиск) в Visual Studio с включенной опцией Regular Expression:new[ ][a-zA-Z0-9]+\[0\]
Теперь Find All или F3 (Find Next) и замените все на Array.Empty <…> ()!
источник
Вы можете определить размер массива во время выполнения .
Это позволит вам делать что угодно для динамического вычисления размера массива. Но, однажды определенный размер неизменен.
источник
int i = 5; string[] a = new string[i];
Я пытался:
Но я мог вставить в него только одну строку, а затем я получил ошибку исключения OutOfBound, поэтому я просто добавил для него размер, например
Или другой способ, который работает для меня:
Назначение значения для списка:
источник
Как я знаю, вы не можете сделать массив без размера, но вы можете использовать
а потом
l.ToArray()
.источник
Объединение предложений @nawfal и @Kobi:
Пример использования:
ОБНОВЛЕНИЕ 2019-05-14
(кредиты @Jaider ty)
Лучше использовать .Net API:
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Относится к:
.NET Core: 3.0 Preview 5 2.2 2.1 2.0 1.1 1.0
.NET Framework: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET Standard: 2.1 Preview 2.0 1.6 1.5 1.4 1.3
...
НТН
источник
arr = Array.Empty<string>();
Ты можешь сделать:
Примечание: OP означает, что нет необходимости указывать размер, а не делать массив без размера
источник
specify
размера, а не создание массиваsizeless
.Вот пример из реального мира. При этом необходимо инициализировать массив
foundFiles
сначала нулевой длиной.(Как подчеркивалось в других ответах: это инициализирует не элемент и особенно не элемент с нулевым индексом, потому что это будет означать, что массив имеет длину 1. Массив имеет нулевую длину после этой строки!).
Если часть
= string[0]
не указана, возникает ошибка компилятора!Это из-за блока захвата без повторного выброса. Компилятор C # распознает путь к коду, что функция
Directory.GetFiles()
может выдать исключение, чтобы массив мог быть неинициализирован.Прежде чем кто-то скажет, не выбрасывать исключение было бы плохой обработкой ошибок: это не так. Обработка ошибок должна соответствовать требованиям.
В этом случае предполагается, что программа должна продолжаться в случае каталога, который не может быть прочитан и не прерван - лучшим примером является функция, проходящая через структуру каталога. Здесь обработка ошибок просто регистрирует это. Конечно, это можно сделать лучше, например, собрать все каталоги с ошибочными
GetFiles(Dir)
вызовами в списке, но это приведет к этому слишком далеко.Достаточно сказать, что избегание
throw
является допустимым сценарием, и поэтому массив должен быть инициализирован до нулевой длины. Этого было бы достаточно, чтобы сделать это в блоке catch, но это был бы плохой стиль.Вызов
GetFiles(Dir)
изменяет размер массива.источник