变量声明后的括号

Ale*_*iak 2 .net c#

我不熟悉以下语法,我想知道变量退出大括号后会发生什么变化:

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.

Ben*_*igt 7

它没有效果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())有人决定重用服务实例,将代码转换为上面提到的错误版本,然后演变成当前版本.


Chr*_*tos 6

变量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语句.前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围)

  • 如果您尝试它(在修复其他错误之后),您会发现这不是真的.变量结果在大括号之前被声明和初始化,因此它可以工作并获取字符串 (2认同)