我不熟悉以下语法,我想知道变量退出大括号后会发生什么变化:
public string method(int projectid)
{
string result = string.empty;
var service = _service;
{
result = service.dosomething(); //_service implements it's own Dispose
}
result += "we are going to do some further operations like sum a large list that"
result += "might take a non-trivial amount of time."
return result;
}
Run Code Online (Sandbox Code Playgroud)
紧随其后的括号是否_service: { /* etc */ }表示服务变量仅在该.dosomething()方法的范围内,之后在执行由result +=块指示的X操作时- 垃圾收集器可以对服务进行舍入并且垃圾收集它?
基本上,我想知道周围的括号var result = service.dosomething()是什么告诉编译器关于service和_service.
它没有效果service或_service.
我的猜测(根据评论)是这个代码看起来像
public string method(int projectid)
{
string result = string.empty;
using (var service = _service)
{
result = service.dosomething();
}
result += "we are going to do some further operations like sum a large list that"
result += "might take a non-trivial amount of time."
return result;
}
Run Code Online (Sandbox Code Playgroud)
并且有人发现该对象在使用_service之后被使用了处理它,并通过删除using并添加分号和评论来"修复"该错误,说明为什么service不在这里处置,留下大括号作为旧的无用遗迹越野车版.
注意:为了公平对待编码器,也许它最初是using (var service = GetService())有人决定重用服务实例,将代码转换为上面提到的错误版本,然后演变成当前版本.
变量result是本地的{ }.所以你不能在外面访问它service.
您的代码甚至不会编译,因为您尝试将值分配给尚未声明的变量.
更新
正如我可以通过你的帖子理解的那样你可能想要使用一个using声明来使用你所说的一次性物体,service而你正在询问引擎盖下会发生什么.
最初,您想要的可以像下面这样完成:
using(var service = new ...)
{
result = service.dosomething();
}
Run Code Online (Sandbox Code Playgroud)
在...您将放置您的服务类的类型.
如果这样做,那么这个代码将由C#编译器编译为以下代码
try
{
ServiceType service = new ServiceType;
result = service.dosomething();
}
finally
{
if (service != null)
((IDisposable)service).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我给的名字ServiceType来...为了写上面的示例.因此,您应该在那里放置正确的类型.
正如您现在看到的,using语句是用于调用Dispose您的Disposable对象的方法的语法糖.正如在MSDN中更全面,更正式地说明的那样
通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它.using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)一旦调用Dispose ,它也会导致对象本身超出范围.在using块中,该对象是只读的,不能修改或重新分配.using语句 确保 即使 在对象上调用方法时发生异常,也会调用Dispose.您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是 编译器如何翻译using语句.前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围)
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |