我有以下代码块;
using (var msResp = new MemoryStream(Resp))
{
try
{
Response resp = new Response(msResp);
SetClientIdentityResponseValue sirv = new SetClientIdentityResponseValue(resp, (int)Response.Properties.Value);
if (!sirv.IsCredentialsValid)
{
throw new Exception("Authentication failed.");
}
if (sirv.IsSubscriptionExpired)
{
throw new Exception("Subscription expired.");
}
}
finally
{
msResp.Close();
}
}
我在某处读过一个using语句会自动处理该对象。
问题:
当我已经使用using语句时,使用Try / Finally组合冗余吗?
答案 0 :(得分:4)
是的,这是多余的。
using语句确保即使调用Dispose也会调用 在对象上调用方法时发生异常。您可以 通过将对象放在try块中来实现相同的结果 然后在finally块中调用Dispose;其实这是怎么回事 using语句由编译器翻译。
答案 1 :(得分:1)
你不需要终于。实际上,using块是使用try ... finally实现的。
using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。
答案 2 :(得分:1)
它多余。但请记住,如果你想捕获异常,那么你需要一个try-catch。 using语句不会捕获任何异常。它只是关闭并处理对象。
答案 3 :(得分:0)
由于您正在调用Close
而不是Dispose
,代码是多余的并不明显。
MemoryStream.Dispose
的{{3}}表示在调用Dispose
时该流已关闭:
此方法通过将任何更改写入后备存储并关闭流来释放资源来处理流。
哪个推断被调用Close
。但是,当您完成流时,显式关闭流时会有无害。
底线:这是多余的吗?大概。它伤害了对抗吗?绝对不。我宁愿养成在自己身后清理的习惯,即使看门人进来后也无事可做(或再次清理)。