C# 变量声明后的括号

C# 变量声明后的括号,c#,.net,C#,.net,我不熟悉以下语法,我想知道变量退出大括号后会发生什么情况: 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

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

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;
}
紧跟在
\u service:{/*etc*/}
后面的括号是否表示服务变量仅在
.dosomething()
方法的作用域内,并且之后在执行
result+=
块指示的X操作时,垃圾收集器可以对服务进行取整并对其进行垃圾收集


基本上,我想知道
var result=service.dosomething()
周围的括号告诉编译器如何处理
service
\u service
变量
result
{/code>中是局部变量。因此,您无法在
服务之外访问它

您的代码甚至无法编译,因为您试图为尚未声明的变量赋值

更新

正如我从你的帖子中所了解到的,你可能想使用一个名为“服务”的
using
语句来使用你的一次性物品,而你正在询问引擎盖下发生了什么

最初,您可以按如下方式完成所需的操作:

using(var service = new ...)
{
    result = service.dosomething();
}
中,您将放置服务类的类型

如果这样做,那么C#编译器会将此代码编译为以下代码

try
{
    ServiceType service = new ServiceType;
    result = service.dosomething(); 
}
finally
{
    if (service != null)
    ((IDisposable)service).Dispose();
}
为了编写上述示例,我将名称
ServiceType
命名为
..
。 因此,您应该在那里放置正确的类型

正如您现在看到的,
using
语句是一种语法糖,用于调用一次性对象的
Dispose
方法。正如MSDN中更全面、更正式地说明的那样

通常,当您使用IDisposable对象时,应该声明和 在using语句中实例化它。using语句调用 以正确的方式在对象上处置方法,以及(当您使用它时 如前所示),它还会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配。using语句 确保即使在运行时发生异常,也会调用Dispose 正在对对象调用方法。您可以通过以下方式获得相同的结果: 将对象放入try块中,然后在 最后阻塞;事实上,using语句就是这样翻译的 由编译器完成。前面的代码示例扩展为以下内容 编译时的代码(注意额外的花括号来创建 对象的有限范围)

同:

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;
}
这:


由于
foo
是在父作用域中声明的,因此可以在子作用域中访问它。

每次在{}括号内声明变量时,它都是此括号内唯一可查看和可访问的。 如果你想访问你的var,你必须声明它
var结果并在括号中初始化它
result=service.dosomething()


如果您以这种方式使用它,您将能够访问它。

它对
服务
\u服务
没有影响

我的猜测(基于评论)是这段代码过去看起来像

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;
}
有人发现该对象在使用后通过
\u service
被使用,并通过使用
删除
并添加分号和注释来“修复”该缺陷,说明为什么
service
未在此处处理,将大括号作为旧缺陷版本的无用痕迹



注意:公平地说,可能它最初是
使用(var service=GetService())
,有人决定重用服务实例,将代码转换为上面介绍的错误版本,然后演变为当前版本。

您指的是大括号或花括号。括号是正方形的

大括号建立一个新的局部范围。在此范围内定义的变量是该范围的局部变量

具有析构函数的局部变量将在离开块时执行该析构函数


对于当前编写的代码,这两种情况都不会发生。

括号表示范围。当程序执行通过end}括号时,其中的任何变量都会超出范围

现在,如果该变量是对对象实例的唯一引用,那么是的,它就有资格进行垃圾收集。但是,下一次garbace收集运行的执行时间不确定

在这种情况下,_服务变量仍然保存对实例的引用。所以不会有垃圾被收集


垃圾回收从不调用Dispose。它必须直接从代码调用,或者使用using语句调用。GC将调用终结器(如果存在的话),以关闭任何非托管资源。

它是否编译?查看代码,结果声明超出括号的范围。编辑了原始问题。该代码不应编译<代码>结果
是本地的
{…}
这些注释中的一些在忍者编辑之后(我猜想)已经过时了。它可能是一个使用块。但是在这里,
\u服务
引用的对象超出了本地范围,因此
使用
是不合适的。对吗,但是括号是否向编译器表明,在到达结果+=块时,服务变量可以被释放/垃圾收集?@AlexanderMatusiak否。您需要一个使用
。@AlexanderMatusiak一点也不。如果您尝试它(在修复其他错误后),您会发现这不是真的。变量结果在大括号之前声明并初始化,因此它工作并获得string@Downvoter最初发布的代码发生了变化,现在我正试图了解OP在寻找什么。然而,如果你能看看最初发布的代码y
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;
}