返回与一次性对象链接的对象

时间:2014-02-24 15:17:27

标签: c# disposable

在下面的代码中,处理principalCtx会影响userPrin吗?

principalCtx仅用于查找用户,还是以某种方式与userPrin对象保持关联?

    UserPrincipal userPrin= null;
    using(PrincipalContext principalCtx as new PrincipalContext(ContextType.Domain)){ 
        userPrin= UserPrincipal.FindByIdentity(principalCtx, IdentityType.SamAccountName, "first.last");
    }
    return userPrin;

2 个答案:

答案 0 :(得分:1)

UserPrincipalPrincipalContext都是一次性类,这表明它们的处置有些独立。 我在实践中发现,处理PrincipalContext显然确实会对UserPrincipal产生一些影响。虽然我可以在UserPrincipal处置后仍然能够访问PrincipalContext属性,但如果我尝试调用方法,请{{1}在放置GetGroups()之后的UserPrincipal上,我收到有关尝试访问已处置对象的错误。

但请记住,仅仅因为它有效果并不意味着你在使用它时也不应该单独处理PrincipalContext对象。没有人知道可能需要独立于UserPrincipal清理哪些单独的资源UserPrincipal

对代码的建议摘要:

  1. PrincipalContext被处置后尝试访问userPrin,或者如果您这样做,请确保您只访问不会给您错误的属性,因为我已经验证了在处理完上下文后访问方法可能会出错。
  2. 还会处置principalCtx或将其包含在userPrin块中。

答案 1 :(得分:0)

由于UserPrincipal需要PrincipalContext的实例,我不会这样做。将您的代码与此进行比较:

StreamReader reader;
using (Stream input = File.OpenRead(@"c:\test.txt"))
{
    reader = new BinaryReader(input);
}

reader.Read();

虽然我们在这个问题中谈论的是PrincipalContext,而不是文件,但设计是一样的 - 你永远不知道底层的内容是什么。

附注:BinaryReader实际上有an overload,可让您指定是要清理还是让BinaryReader为您执行此操作。