【发布时间】:2011-09-07 20:50:24
【问题描述】:
我有一个方法可以从用户提供的文件路径和对象类型中反序列化存储的对象。该方法工作正常,除非用户提供了无效的文件路径。在这种情况下,我希望我的方法返回 null,但是当我尝试返回 null 时,会出现编译错误。我尝试使用可为空的类型,但出现编译错误。相反,我对一个对象进行类型转换并返回它,但这会导致运行时错误。我想知道是否有人知道允许返回 null 的正确方法。代码如下:
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;
}
}
在考虑了 Eric Lippert 的质量指标后,我修改了该方法,使其看起来像您在下面看到的那样。使用 '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;
}
}
【问题讨论】: