起初我有一些这样的代码:
WindowsIdentity otherIdentity = // got that from somewhere else
WindowsImpersonationContext context = otherIdentity.Impersonate();
Ldap.DoStuff();
context.Undo();
context.Dispose();
知道WindowsImpersonationContext
实施IDisposable
和Dispose()
也会调用Undo()
,我认为我应该使用using
代替:
using (var context = otherIdentity.Impersonate())
{
// Run as other user
Ldap.DoStuff();
}
现在,ReSharper正确地注意到我没有使用context
并建议删除作业。这也有用吗?它在编译时扩展到什么代码?
using (otherIdentity.Impersonate())
{
Ldap.DoStuff();
}
答案 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
本身将用作ResourceType
。resource
变量在嵌入语句中不可访问且不可见。