Search code examples
c#idisposableusing-statement

C# conditional using block statement


I have the follow code but it is awkward. How could I better structure it? Do I have to make my consuming class implement IDisposable and conditionally construct the network access class and dispose it when I am done?

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

Solution

  • One option, which is somewhat nasty but would work, based on the fact that the C# compiler calls Dispose only if the resource is non-null:

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

    Another alternative would be to write a static method which returned either null or a NetworkAccess:

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

    Then:

    protected void ValidateExportDirectoryExists()
    {
        using (CreateNetworkAccessIfNecessary())
        {
            CheckExportDirectoryExists();
        }
    }
    

    Again, I'm still not sure I don't prefer the original... it really depends on how often you need this pattern.