Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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();         }     } 
like image 983
superlogical Avatar asked Dec 08 '10 16:12

superlogical


1 Answers

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.

like image 178
Jon Skeet Avatar answered Oct 15 '22 05:10

Jon Skeet