变量声明后面的括号
本文关键字:声明 变量 | 更新日期: 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();
如果你以这种方式使用它,你将能够使用它。
您指的是大括号或大括号。括号是方形的东西。
牙套建立新的局部范围。在此作用域内定义的变量是作用域的局部变量。
具有析构函数的局部变量将在离开块时执行该析构函数。
使用当前编写的代码,这些事情都不会发生。