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)
再说一次,我仍然不确定我不喜欢原版......这实际上取决于你需要这种模式的频率.
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)
如果您在许多方法中重复此模式,您可以打破模式
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)
| 归档时间: |
|
| 查看次数: |
10204 次 |
| 最近记录: |