与C#'混淆;使用';

与C#'混淆;使用';,c#,active-directory,using,userprincipal,C#,Active Directory,Using,Userprincipal,我已经看到了一些使用AD的代码 我对using语句感到困惑。我以为它只是用于一些你担心会成为内存泄漏的东西,比如WebClient,或者类似的东西 无论如何: using (var context = new PrincipalContext( ContextType.Domain )) { using (var user = UserPrincipal.FindByIdentity( context, "username" )) { var gr

我已经看到了一些使用AD的代码

我对using语句感到困惑。我以为它只是用于一些你担心会成为内存泄漏的东西,比如WebClient,或者类似的东西

无论如何:

using (var context = new PrincipalContext( ContextType.Domain )) 
 {
      using (var user = UserPrincipal.FindByIdentity( context, "username" ))
      {
          var groups = user.GetAuthorizationGroups();
          ...
      }
 }
当我到达行
var groups=user.GetAuthorizationGroups()
-user为null时,该行失败,引用为null。当我将鼠标移到它上面调试时,它会显示null,然后显示静态成员,并具有所有值

如果我从using语句中去掉这一行,只需按要求填充
var user=UserPrincipal.FindByIdentity(上下文,“用户名”)
user

发生了什么事

编辑:我塞满了,发送了一个伪造的用户名。奇怪的是,当我在调试过程中检查变量时,如果我发送了伪造的userid,您会期望user完全为null,但它显示在user下:null,static members,并且有我当前登录的值,因此我认为这可能与using语句有关。
干杯

你所描述的不可能发生。直到块完成,当对象被释放时,
using
语句的特殊性才会发生。因此,在该块中,
user
变量是相同的,无论它是否在
using
语句中。

C#“using”语句提供了一种方便的语法,确保正确使用IDisposable对象。检查PrincipalContext是否具有一次性方法或实现IDisposable。如果不是,则不应使用“使用”。有关更多详细信息,请参阅。

对实现IDisposable的对象使用try/finally和Dispose自动调用只是语法上的糖分

using
适用于实现
IDisposable
的任何东西。更一般地说,您应该考虑使用
using
语句(从而
IDisposable
)来防止资源泄漏。这些资源最终是“内存”,但不需要更抽象的意义(如文件句柄、数据库连接等)。“使用”语句只影响使用范围末尾的变量,此时它会处理该变量。您确定传入的不是无效用户吗?(正如UserPrincipal.FindByIdentity在未找到时返回null)如果代码与您描述的完全相同,那么无论using语句是否存在,它的工作方式都应该相同(除非如果省略using语句,它可能会泄漏资源)。还有别的事你没告诉我们!事实上,只要试一下/最后一次-没有问题。(或者是“做或不做,没有尝试”)?@Joe Enos,你完全正确。这只是最后一次尝试。谢谢你指出这一点。