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