【发布时间】:2017-09-23 13:47:06
【问题描述】:
我想问一些关于泛型的问题。
我试图保持代码简单,因此我将创建一个类来处理游戏存档文件的加载/保存。由于游戏的每个部分都有不同的要求,因此我希望尽可能方便地访问:
public void Load<T>(string path, out T obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (FileStream file = File.Open(Application.persistentDataPath + path, FileMode.Open))
{
obj = (T)bf.Deserialize(file);
}
}
现在我可以用一个简单的方法来调用它
TurnData x; s.Load("test.txt", out x);
另一种方法是让 Load 函数返回对象,然后将其转换为 TurnData 类型。
TurnData x = (TurnData)s.Load("test.txt");
我对 C# 了解不多。例如,如果打开文件时出错,我假设using(...) { ... } 中的代码不会被执行?如果有人能证实这一点,那就太好了。我看到的示例代码没有任何错误处理,这对我来说似乎很奇怪,所以我添加了 using?
所以在这个函数返回对象而不是使用 out 参数的次要版本中,需要更复杂的代码来进行错误检查并可能返回 null?好像不太好。
所以真正的问题是......我可以使用我在这里拥有的下一个版本,还是因为使用泛型而我应该担心?
【问题讨论】:
-
using块只是try{} finally{ //will dispose disposable object }的简化版 -
基本上是调用对象的
Dispose()方法,即使块内的代码抛出异常。 -
我不明白你为什么要使用泛型编写代码。为什么
Foo foo; Load<Foo>(path, out foo);在任何方面都比Foo foo = (Foo)Load(path);好?后者对我来说似乎更清楚,更短更简单。你这样做的建议有很大的价值,你应该考虑这样做。无论哪种方式,您都必须编写错误处理。 -
@EricLippert,这不是
out变量的问题吗?我真的不明白为什么给出输出会使它更具可读性?