Можно ли создать пустой массив без указания размера?
Например, я создал:
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[]
что не имеет элементов. Если вы попытаетесь получить доступ emptyStringArray[0]
, вы получитеIndexOutOfRangeException
Попробуй это:
string[] a = new string[] { };
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
:
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>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
это не создает массив. Возвращает ссылку на предварительно выделенный массив.
Нет особого смысла объявлять массив без размера. Массив имеет размер . Когда вы объявляете массив определенного размера, вы указываете фиксированное количество слотов, доступных в коллекции, которая может содержать объекты, и, соответственно, выделяется память. Чтобы что-то добавить к нему, вам все равно нужно будет повторно инициализировать существующий массив (даже если вы изменяете размер массива, см. Эту ветку ). Одним из редких случаев, когда вы хотите инициализировать пустой массив, является передача массива в качестве аргумента.
Если вы хотите определить коллекцию, когда вы не знаете, какого размера она может быть, массив - это не ваш выбор, а что-то вроде a List<T>
или подобное.
Тем не менее, единственный способ объявить массив без указания размера - это иметь пустой массив размером 0 . Хемант и Алекс Дн предоставляют два пути. Другая более простая альтернатива - просто :
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[] array = {}
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 <…> ()!
Вы можете определить размер массива во время выполнения .
Это позволит вам делать что угодно для динамического вычисления размера массива. Но, однажды определенный размер неизменен.
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
Я пытался:
string[] sample = new string[0];
Но я мог вставить в него только одну строку, а затем я получил ошибку исключения OutOfBound, поэтому я просто добавил для него размер, например
string[] sample = new string[100];
Или другой способ, который работает для меня:
List<string> sample = new List<string>();
Назначение значения для списка:
sample.Add(your input);
Объединение предложений @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
ОБНОВЛЕНИЕ 2019-05-14
(кредиты @Jaider ty)
Лучше использовать .Net API:
public static T[] Empty<T> ();
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>();
Ты можешь сделать:
string[] a = { String.Empty };
Примечание: OP означает, что нет необходимости указывать размер, а не делать массив без размера
specify
размера, а не создание массива sizeless
.
Вот пример из реального мира. При этом необходимо инициализировать массив foundFiles
сначала нулевой длиной.
(Как подчеркивалось в других ответах: это инициализирует не элемент и особенно не элемент с нулевым индексом, потому что это будет означать, что массив имеет длину 1. Массив имеет нулевую длину после этой строки!).
Если часть = string[0]
не указана, возникает ошибка компилятора!
Это из-за блока захвата без повторного выброса. Компилятор C # распознает путь к коду, что функция Directory.GetFiles()
может выдать исключение, чтобы массив мог быть неинициализирован.
Прежде чем кто-то скажет, не выбрасывать исключение было бы плохой обработкой ошибок: это не так. Обработка ошибок должна соответствовать требованиям.
В этом случае предполагается, что программа должна продолжаться в случае каталога, который не может быть прочитан и не прерван - лучшим примером является функция, проходящая через структуру каталога. Здесь обработка ошибок просто регистрирует это. Конечно, это можно сделать лучше, например, собрать все каталоги с ошибочными 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);