如果在函数体中出现异常,如何返回一个新的空类型?
如果在反序列化xml时遇到问题,x到新T()的最佳方法是什么?
查看我是如何获得catch块的,以及如何处理它?</ p>
public static T DeserializeXml<T>(this string xml) where T : class
{
XmlDocument doc = new XmlDocument();
MemoryStream ms = new MemoryStream();
StreamReader sr = null;
T x = null;
//
try
{
doc.LoadXml(xml); doc.Save(ms);
ms.Position = 0;
sr = new StreamReader(ms);
XmlSerializer i = new XmlSerializer(typeof(T));
x = (T)i.Deserialize(sr);
}
catch (Exception) {
x = null;
}
finally {
sr.Close(); sr.Dispose(); ms.Close(); ms.Dispose();
}
//
return x as T;
}
答案 0 :(得分:3)
您可以使用default。
return default(T);
答案 1 :(得分:3)
您可以约束T
拥有空构造函数。这就是你问的问题吗?
public static T DeserializeXml<T>(this string xml) where T : class, new()
{
//...
catch
{
x = new T();
}
//...
return x as T;
}
答案 2 :(得分:2)
您真正需要做的就是
catch (Exception) {
x = default(T);
}
或类似的东西。实际上,您可以在return
子句中null
catch
;除非拔出电源插头,否则finally
子句仍可保证运行,where T: class
约束确保默认值(T)始终为空。
考虑使用一些using
块,而不是那些关闭和处置。那么你根本不需要finally
块。
public static T DeserializeXml<T>(this string xml) where T : class
{
XmlDocument doc = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
using (StreamReader sr = new XmlSerializer(typeof(T))
{
T x = null;
try
{
doc.LoadXml(xml); doc.Save(ms);
ms.Position = 0;
sr = new StreamReader(ms);
XmlSerializer i = new XmlSerializer(typeof(T));
x = (T)i.Deserialize(sr);
}
catch (Exception) {
return null;
}
}
}
return x;
}
答案 3 :(得分:2)
您可以返回default(T)
,也可以向通用类型where T : new()
添加约束,在这种情况下,您可以返回new T()
。
基本上,default(T)
适用于您不知道T
是值还是引用类型的情况。它为不同的类型返回不同的东西 - 类为null,数字类型为零,结构为空。有一篇好文章on MSDN。