2011-08-05 60 views
5

我已经看到了与AD in this stackoverflow question困惑与C#“使用”

我越来越感到困惑using语句工作的一些代码。我认为它只是用来事情,你担心可能成为内存泄漏,就像一个Web客户端,或类似的...

总之:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 

当我到达行var groups = user.GetAuthorizationGroups() - 用户为空,因此该行失败并带有NullReference。当我将鼠标移到它上面时,调试它显示为空,然后显示静态成员,并具有所有值。

如果我从使用声明中删除该行,并且只是根据需要填充了var user = UserPrincipal.FindByIdentity(context, "username")用户。

所以发生了什么?

编辑:我塞满了,并发送了一个假的用户名。奇怪的是,当我在调试过程中检查变量时,如果我发送虚假用户标识,但是它显示在用户下:null,静态成员,并且那里有我当前登录的值,所以我认为这是与潜在的使用陈述有关。 干杯!

+0

'using'用于实现'IDisposable'的任何事物。 –

+0

更笼统地说,您应该考虑使用'using'语句(并因此使用'IDisposable')来防止*资源泄漏*。这些资源最终是“内存”,但不一定要处于更抽象的意义上(如文件句柄,数据库连接等)。 –

+1

“使用”语句仅影响使用范围末尾的变量,此时它将处理该变量。你确定它不是无效的用户吗? (因为UserPrincipal.FindByIdentity如果未找到,则返回null) – Will

回答

3

您所描述的内容不会发生。在块完成时,对象被丢弃时,using语句的特殊性不会发生。因此,在该块内,user变量是相同的,无论它是否在using声明中。

1

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。将对象放在try块中,然后在finally块中调用Dispose,可以获得相同的结果;实际上,这是编译器如何翻译using语句。

1

C#“using”语句提供了一种方便的语法,可以确保正确使用IDisposable对象。检查PrincipalContext是否具有一次性方法或实现IDisposable。如果没有,那么你不应该使用“使用”。有关更多详情,请参阅MSDN documentation

2

使用只是try/finally的语法糖,并自动调用Dispose实现IDisposable的对象。

+0

其实,只是尝试/终于 - 没有赶上。 (或者是“是或否,没有尝试”)? –

+0

@Joe Enos,你是对的。这只是尝试/最后。谢谢你指出。 – Icarus