【发布时间】:2013-03-20 14:12:07
【问题描述】:
我与一位同事就 using 语句的适当范围发生了争执。这是有问题的方法。
public Guid IsServerReachable()
{
try
{
WhoAmIResponse whoAmI;
using (OrganizationServiceProxy service = GetService())
whoAmI = service.Execute(new WhoAmIRequest()) as WhoAmIResponse;
return whoAmI.UserId;
}
catch { return Guid.Empty; }
}
我们中的一个声称 using 语句应该包含 whyAmI 的声明,而另一个则认为只有 service 实例需要使用化。我没有说哪个是我的理论,但一个显然是错误的。哪个?
【问题讨论】:
-
OrganizationService 将被释放(如果它实现 IDisposed),但它 WhoAmI 引用了 OrganizationService。因此,您将不会得到任何东西,因为它已经被处理掉了!您需要在 using 语句中返回。
-
如果变量 whoAmI 的整个范围都是 using 块(缺少括号在这里有点混淆),那么在执行
return whoAmI时它甚至不会存在。 -
如果你包含所有三行(声明、赋值和返回),我看不出它在这里有什么意义
-
@KonradViltersten 抱歉,这是对 Dave 的回应,暗示
whoAmI对象是被处置的对象(他的评论已被删除)。我会删除我的评论(不再有它的意义!) -
@PieterGeerkens 正是在我决定再刷新一次之前我要输入的内容 ;) 但是,如果
WhoAmIResponse实现了IDisposable并且应该被处理掉,那么UserId的值应复制到其类型的变量并用作返回值,WhoAmI应在另一个using块中的自己的using语句中声明。
标签: c# scope using-statement