我应该把这个使用声明放在哪里?

时间:2015-05-14 17:02:32

标签: c#

我正在使用System.DirectoryServices,我使用以下方法创建DirectoryEntry

static DirectoryEntry CreateDirectoryEntry(string connectionPath)
{
    DirectoryEntry ldapConnection = null;

    try
    {
        ldapConnection = new DirectoryEntry(AD_DOMAIN_NAME))
        ldapConnection.Path = connectionPath;
        ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
    }

    catch (Exception ex)
    {
        MessageBox.Show("Exception Caught in createDirectoryEntry():\n\n" + ex.ToString());
    }

    return ldapConnection;
} 

以这种方式调用此方法:

DirectoryEntry ldapConnection = CreateDirectoryEntry("LDAP://OU=Example,DC=domain,DC=com");

我读到最佳做法是对实现using的任何内容使用IDisposable语句。我的问题是,我是否需要在using方法中使用CreateDirectoryEntry()语句,还是应该为每次调用执行此操作?

为了说明我的意思,这是否足够?:

static DirectoryEntry CreateDirectoryEntry(string connectionPath)
{
    DirectoryEntry ldapConnection = null;

    try
    {
        using (ldapConnection = new DirectoryEntry(AD_DOMAIN_NAME))
        {
            ldapConnection.Path = connectionPath;
            ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
        }
    }

    catch (Exception ex)
    {
        MessageBox.Show("Exception Caught in createDirectoryEntry():\n\n" + ex.ToString());
    }

    return ldapConnection;
} 

或者我还需要在这样的通话中使用using语句吗?:

using (DirectoryEntry ldapConnection = CreateDirectoryEntry("LDAP://OU=Example,DC=domain,DC=com"))
{
    //Do something with ldapConnection
}

非常感谢任何帮助!

注意:我无法使用System.DirectoryServices.AccountManagement来解决此问题,因此请保留与System.DirectoryServices相关的答案。谢谢!

2 个答案:

答案 0 :(得分:2)

你的最后一个代码片段是要走的路,否则你将向你的来电者返回一个处理掉的ldapConnection - 这不是一件好事。

使用!!使用+1

答案 1 :(得分:0)

你的第一个代码片段会在返回之前处理ldapConnection,因此返回一个你显然不需要的处置对象。

你的功能应该是这样的:

static DirectoryEntry CreateDirectoryEntry(string connectionPath)
{
    DirectoryEntry ldapConnection = null;

    try
    {
        ldapConnection = new DirectoryEntry(AD_DOMAIN_NAME)
        ldapConnection.Path = connectionPath;
        ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
    }

    catch (Exception ex)
    {
        MessageBox.Show("Exception Caught in createDirectoryEntry():\n\n" + ex.ToString());
    }

    return ldapConnection;
} 

虽然第二个代码段正确:要正确处置DirectoryEntry,您应该使用using