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