变量声明后面的括号

本文关键字:声明 变量 | 更新日期: 2023-09-27 18:26:41

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

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

紧随其后的括号是否_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;
}

有人发现该对象在使用后通过_service处理它而被使用,并通过删除using并添加分号和注释来"修复"错误,说明为什么service没有在这里处理,留下大括号作为旧错误版本的无用痕迹。


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

变量result{ }中是局部的。所以你不能在service之外访问它。

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

更新

正如我从您的帖子中了解到的那样,您可能希望使用一个using声明来使用名为service的一次性物品,并且您正在询问引擎盖下会发生什么。

最初,您可以按如下方式完成:

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 语句调用 以正确的方式在对象上释放方法,并且(当您使用它时( 如前所示(它还会导致对象本身超出范围 一旦调用"处置"。在 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;
}
这将

打印"barbaz":

public static void Main()
{
    string foo = "bar";
    // new scope
    {
        foo += "baz";
    }
    Console.WriteLine(foo);
}

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

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

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

在这种情况下,_service变量仍包含对实例的引用。所以什么都不会被垃圾收集。

垃圾回收永远不会调用"处置"。它必须直接从代码调用或使用 using 语句调用。GC 将调用终结器(如果存在(以关闭任何非托管资源。

每次在 {} 括号内声明变量时,它只能在此括号内查看和访问。如果你想访问你的var,你必须在你的方法中var result;声明它,并在括号中初始化它result = service.dosomething();

如果你以这种方式使用它,你将能够使用它。

您指的是大括号或大括号。括号是方形的东西。

牙套建立新的局部范围。在此作用域内定义的变量是作用域的局部变量。

具有析构函数的

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

使用当前编写的代码,这些事情都不会发生。