gpt4 book ai didi

.net - 返回一个实现 IDisposable 的对象是个好主意吗?

转载 作者:行者123 更新时间:2023-12-02 15:10:42 26 4
gpt4 key购买 nike

我的场景是这样的。

我正在使用 System.DirectoryServices.AccountManagement 来处理 AD 用户和组。我的 Main 方法(目前这是一个控制台应用程序)调用一个返回 PrincipalSearchResult<Principal> 的方法。 。这两个对象都实现了 IDisposable。

如果我退回这个,我如何确保我可以处理所有这些一次性元素?

class Searcher
{
private PrincipalSearchResult<Principal> SearchForObjects(string searchString)
{
PrincipalContext ctx = null;
PrincipalSearcher principalSearcher = null;
Principal principal = null;

ctx = new PrincipalContext(ContextType.Domain, "blah", "dc=blah,dc=com");

principal = new GroupPrincipal(ctx) { Name = searchString };
principalSearcher = new PrincipalSearcher { QueryFilter = principal };

return principalSearcher.FindAll();
}
}

static void Main(string[] args)
{
Searchers searchers = new Searchers();

PrincipalSearchResult<Principal> theGroups = searchers.SearchForGroupsMatching("some*");

foreach (GroupPrincipal group in theGroups)
{
Console.WriteLine(group.DisplayName);
// do stuff...
}
}

正在传回PrincipalSearchResult<Principal>由于与未受管理的对象处置相关的原因,这是一个非常糟糕的主意吗?

我最好创建一个托管代理对象吗?

我想,如果我只关心读取属性的子集,那么创建仅包含这些属性的自定义对象可能会“更好”。当写回(在本例中为 AD 组)时,我真正需要传递到方法中的是更改后的属性和 key 。这将使我能够将非托管对象的创建限制在一个范围内。或者这一切都是不必要的,而且麻烦多于其值(value)?我对半分散的意识流表示歉意......

最佳答案

不,这不是一个坏主意。 .NET 框架中有很多执行此操作的示例,例如SqlClient.ExecuteReader

但是,您需要记录用户在使用完该对象后需要立即处理该对象。

你会这样做:

using(PrincipalSearchResult<Principal> theGroups = 
searchers.SearchForGroupsMatching("some*"))
{
foreach (GroupPrincipal group in theGroups)
{
Console.WriteLine(group.DisplayName);
// do stuff...
}
}

关于.net - 返回一个实现 IDisposable 的对象是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com