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

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

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

String[] a = new String[5];

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

Ответы [ 12 ]

0 голосов
/ 27 января 2017

Вот пример из реального мира.В этом случае необходимо инициализировать массив 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);
0 голосов
/ 21 апреля 2016

Объединение предложений @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

...

НТН

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