假设我们有一个基于文件、连接或其他资源的操作。
我们需要一个方法,它可以使用提供的资源运行,或者-如果没有提供-创建自己的:
string Foo(Resource parameter = null)
{
if (parameter == null)
{
using (var res = new Resource)
{
res.Something();
/*......*/
/*......*/
/*......*/
return /*..........*/
}
}
else
{
parameter.Something();
/*......*/
/*......*/
/*......*/
return /*..........*/
}
}}
它是有效的,但这对我来说真的很难看。这是一种以更紧凑和更“好”的方式编写它的方式吗?
我不能使用:
string Foo(Resource parameter = null)
{
using (var res = parameter ?? new Resource())
{
res.Something();
/*......*/
/*......*/
/*......*/
return /*..........*/
}
}因为如果作为参数传递,它将处置我的原始资源。
PS。这个问题的正确标签是什么?#coding-style被标记为“请勿使用”。
发布于 2019-10-02 16:12:06
我会用两种不同的方法。其中一个将包含所有的逻辑-它将是清晰和易于维护的。
string Foo(Resource parameter)
{
parameter.Something();
/...../
return /...../;
}
string Foo()
{
using (var res = new Resource)
{
return Foo(res);
}
}如果您只想将注入参数用于测试目的,这种情况也很有用。查找无参数方法的用法将导致实际的实现,另一种方法将直接指向测试用例。
发布于 2019-10-02 16:08:47
我会去当地的功能:
string Foo(Resource parameter = null)
{
if (parameter != null)
{
return DoSomething(parameter);
}
using (var resource = new Resource())
{
return DoSomething(resource);
}
string DoSomething(Resource res)
{
res.Something();
/...../
return /...../
}
}(在 C# 8 中,您可以将其设为static本地函数)。
如果parameter只能在未提供时为nul(即有人永远不会调用 Foo(null)),那么您可以使用良好的旧方法重载:
string Foo(Resource resource)
{
resource.Something();
/...../
return /...../
}
string Foo()
{
using (var res = new Resource())
{
return Foo(res);
}
}发布于 2019-10-02 16:08:47
我会选择一个本地函数:
string Foo(Resource parameter = null)
{
if (parameter != null)
{
return DoSomething(parameter);
}
using (var resource = new Resource())
{
return DoSomething(resource);
}
string DoSomething(Resource res)
{
res.Something();
/...../
return /...../
}
}(在C# 8中,您可以将其设置为static本地函数)。
如果parameter只能在未提供时为null (即有人永远不会调用Foo(null)),那么您可以使用好的旧方法重载:
string Foo(Resource resource)
{
resource.Something();
/...../
return /...../
}
string Foo()
{
using (var res = new Resource())
{
return Foo(res);
}
}https://stackoverflow.com/questions/58197512
复制相似问题