@stalerum

Как вернуть из функции ответ return разного типа?

Написал для удобство код открытия файла в новую функцию.
Как мне теперь реализовать ответ из функции чтобы:
1. при удачном открытии получить List
2. при фейле получить, например, bool параметр или string переменную с текстом ошибки

private void btn_StartRegMail_Click(object sender, EventArgs e)
{
    var names = new List<string>();
    //Открываем файл с именами
    names = OpenFile(tB_names.Text);
}
// Открытие файла
private static List<string> OpenFile(string file)
{
    if (File.Exists(file) == true)
    {
        var list = new List<string>();
        FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
        using (StreamReader sr = new StreamReader(fs, Encoding.Default))
        {
            string temp = string.Empty;
            list.Add(temp);
        }
        fs.Close();
        return list;
    }
    else
    {
        MessageBox.Show("Указанный файл не найден!");
        //return "error";
    }
}
  • Вопрос задан
  • 378 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Так не делают, но если хочется:
private static object OpenFile(string file)
{
...
}

И затем
var res = OpenFile(file);
if (res.GetType() == typeof(string))
{
   var error = (string)res;
}


UPD:
Как делается:
1. Определяете свой класс, для примера
class ErrorStatus
{
   public bool Status { get; private set; }
   public string ErrorMessage { get; private set; }

  public ErrorStatus(bool status, string errormessage)
  {
     Status = status;
     ErrorMessage = errormessage;
  }
}

2. И возращаете уже
private static ErrorStatus OpenFile(string file, out List<string> data)
{
...
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Если генерируете некий List, то при не критической ошибке (файл пуст), стоит возвращать пустой List. Если ошибка критическая (файл не найден, невозможно открыть файл на чтение, невалидный аргумент, нулевой аргумент), то нужно бросать исключение.

private static List<SomeType> ReadFromFile(string path) {
    if (path == null) {
        throw new ArgumentNullException("path");
    }
    if (File.Exists(path)) {
        string file = File.ReadAllText(path);
        ...
    } else {
        throw new FileNotFoundException(path);
    }
}


Тогда в вызывающем коде можно делать проверки:

private void  doTheBestBtn_Click(object sender, EventArgs e)
{
    try {
        var myList = ReadFromFile(txtInput.Text);
        ...
    }
    catch(ArgumentNullException ex) {
        MessageBox.Show("Необходимо указать путь к файлу!");
    }
    catch(FileNotFoundException ex) {
        MessageBox.Show("Указанный файл не найден!");
    }
}


PS File.ReadAllText сам бросает некоторые исключения, но допустим, что это самопальный тип.
Ответ написан
Комментировать
EreminD
@EreminD
Кое-что умею
По правильному, нужно формировать Exception, если что-то идет не по плану и в обработчике предусматривать альтернативную логику
Подробнее
Ответ написан
Комментировать
@Alexander1705
При ошибке выбрасывайте исключение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы