C#条件使用块语句

sup*_*cal 30 c# idisposable using-statement

我有以下代码,但它很尴尬.我怎么能更好地构建它?我是否必须使我的消费类实现IDisposable并有条件地构建网络访问类并在我完成后处理它?

    protected void ValidateExportDirectoryExists()
    {
        if (useNetworkAccess)
        {
            using (new Core.NetworkAccess(username, password, domain))
            {
                CheckExportDirectoryExists();
            }
        }
        else
        {
            CheckExportDirectoryExists();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 61

一个选项,虽然C#编译器Dispose 仅在资源为非null时调用,但它有点令人讨厌但会起作用:

protected void ValidateExportDirectoryExists()
{
    using (useNetworkAccess 
               ? new Core.NetworkAccess(username, password, domain)
               : null)
    {
        CheckExportDirectoryExists();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是编写一个返回null或NetworkAccess的静态方法:

private Core.NetworkAccess CreateNetworkAccessIfNecessary()
{
    return useNetworkAccess
        ? new Core.NetworkAccess(username, password, domain)) : null;
}
Run Code Online (Sandbox Code Playgroud)

然后:

protected void ValidateExportDirectoryExists()
{
    using (CreateNetworkAccessIfNecessary())
    {
        CheckExportDirectoryExists();
    }
}
Run Code Online (Sandbox Code Playgroud)

再说一次,我仍然不确定我不喜欢原版......这实际上取决于你需要这种模式的频率.

  • 我不知道在 using 语句中使用 null 。 (2认同)

Dmi*_* S. 12

using 语句是避免“finally”块的快捷方式,仅应在它使代码更易于遵循时使用。在您的情况下,我会编写以下代码。它可能不像其他一些版本那样简短,但更直接。

protected void ValidateExportDirectoryExists()
{
    Core.NetworkAccess access = useNetworkAccess ? new Core.NetworkAccess(username, password, domain) : null;    

    try
    {
        CheckExportDirectoryExists()
    }
    finally
    {
       if (access != null)
       {
           access.Dispose();
       }
    }
}
Run Code Online (Sandbox Code Playgroud)


Alb*_*nbo 7

如果您在许多方法中重复此模式,您可以打破模式

protected void OptionalNetworkCall(Action action)
{
    if (useNetworkAccess)
    {
        using (new Core.NetworkAccess(username, password, domain))
        {
            action();
        }
    }
    else
    {
        action();
    }
}

protected void ValidateExportDirectoryExists()
{
    OptionalNetworkCall(CheckExportDirectoryExists);
}
Run Code Online (Sandbox Code Playgroud)