c#using语句是否需要赋值?

时间:2017-01-19 16:37:29

标签: c# using-statement

起初我有一些这样的代码:

WindowsIdentity otherIdentity = // got that from somewhere else
WindowsImpersonationContext context = otherIdentity.Impersonate();
Ldap.DoStuff();
context.Undo();
context.Dispose();

知道WindowsImpersonationContext实施IDisposableDispose()也会调用Undo(),我认为我应该使用using代替:

using (var context = otherIdentity.Impersonate())
{
    // Run as other user
    Ldap.DoStuff();
}

现在,ReSharper正确地注意到我没有使用context并建议删除作业。这也有用吗?它在编译时扩展到什么代码?

using (otherIdentity.Impersonate())
{
    Ldap.DoStuff();
}

1 个答案:

答案 0 :(得分:0)

是的,您可以省略using语句中的变量,编译器会自动引入隐藏变量,就好像您已编写

一样
using (var temp = otherIdentity.Impersonate())
{
    Ldap.DoStuff();
}

,但您无法访问temp声明正文中的using

奇怪的是,MSDN Library似乎没有记录这种语法。相反,请参阅C#规范:

  

表格的使用声明

using (ResourceType resource = expression) statement
     

对应三种可能的扩展中的一种。

     

[...]

     

表单的using声明

using (expression) statement
     

具有相同的三种可能的扩展。在这种情况下,ResourceType隐含地是expression的编译时类型(如果有的话)。否则,接口IDisposable本身将用作ResourceTyperesource变量在嵌入语句中不可访问且不可见。