У меня есть метод, который в общем случае десериализует хранимый объект из предоставленного пользователями пути к файлу и типа объекта. Метод работает нормально, за исключением случаев, когда пользователь указывает неверный путь к файлу. Я хотел бы, чтобы мой метод возвращал ноль в этом случае, но когда я пытаюсь вернуть ноль, я получаю ошибку компиляции. Я пытался использовать обнуляемый тип, но получил ошибку компиляции. Вместо этого я печатаю объект и возвращаю его, но это вызывает ошибку во время выполнения. Я хотел бы знать, если кто-нибудь знает правильный способ разрешить возвращать нуль. Код выглядит следующим образом:
public static T RestoreObj<T>(string datafile)
{
try
{
var fs = File.OpenRead(datafile);
var bf = new BinaryFormatter();
var obj = (T) bf.Deserialize(fs);
fs.Close();
return obj;
}
catch (Exception e)
{
MessageBox.Show("Could not load. Accepts valid *.dom files only. " + e);
// TODO: how to do this? this will throw a runtime error, and if null returned, a compilation error
var o = new object();
return (T) o;
}
}
После рассмотрения качественных комментариев Эрика Липперта я пересмотрел метод, чтобы он выглядел так, как показано ниже. Преимущество использования 'using' состоит в том, что он автоматически генерирует блок try..finally, который будет вызывать метод dispose (FileStream реализует IDisposable, если это не так, это будет ошибкой компиляции). Еще одна приятная вещь заключается в том, что выбрасываемое исключение относится к тому, что на самом деле происходит, а не к тому, что я описал выше.
public static T RestoreObj<T>(string datafile)
{
using (var fs = File.OpenRead(datafile))
{
var bf = new BinaryFormatter();
var obj = (T)bf.Deserialize(fs);
return obj;
}
}