我不熟悉以下语法,并且想知道变量退出括号后会发生什么情况:
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
and的处理_service
。
该变量在中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
Disposable对象的方法的语法糖。正如在MSDN中更全面和正式地陈述的那样
通常,使用IDisposable对象时,应在using语句中声明并实例化它。using语句以正确的方式调用对象上的Dispose方法,并且(如前所述,当您使用它时)它还会导致对象本身在调用Dispose时就超出范围。在using块中,该对象是只读的,无法修改或重新分配。using语句确保 即使 在调用对象的方法时发生异常,也将调用Dispose。通过将对象放在try块中,然后在finally块中调用Dispose,可以达到相同的结果。实际上,这就是 编译器如何翻译using语句。前面的代码示例在编译时扩展为以下代码(请注意,额外的花括号可创建对象的有限作用域)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句