используя goto кажется естественным здесь.Могу ли я заменить эту инструкцию GOTO на C#
Проект должен читать pdf-файл, файл pdf может быть одним из следующих.
- Не Protected
- Protected с password1
- Protected с password2
- Protected с password3
Файл можно получить доступ только с правильным паролем, нет никакого способа узнать, какой пароль файл нужен заранее. мы должны попробовать все случаи (без пароля). если ни один из вышеперечисленных паролей не работает, выполните исключение.
PdfReader GetPdfReader(string filePath)
{
PdfReader r = null;
int Retries = 0;
start: try
{
switch (Retries)
{
case 0: r = new PdfReader(filePath); break;
case 1: r = new PdfReader(filePath, password1); break;
case 2: r = new PdfReader(filePath, password2); break;
case 3: r = new PdfReader(filePath, password3); break;
}
}
catch (BadPasswordException ex)
{
if (Retries == 3) throw ex;
Retries++;
goto start;
}
return r;
}
Вставить попытку/уловку работать, но выглядит уродливым, используя goto seem natural.
Два вопроса:
- Должен ли я заменить этот Гото?
- Есть ли элегантный способ заменить этот goto?
Благодаря
Да, вы должны. Почему в мире вы бы не использовали цикл? Вы эмулируете один с 'goto' ... в C# –
Никогда не используйте' throw ex' для восстановления исключения, вместо этого просто используйте 'throw'. 'throw ex' не будет сохранять исходную стеклу, как это делает throw. Это будет очень полезно для дедуплирования. –
Простой 'while (Retries <= 3)' достаточно для замены 'goto' здесь. 'Switch()' также не является высотой элегантности. –