C#条件使用和默认参数

Jak*_*icz 6 c#

假设我们有一个基于某些文件,连接或其他资源的操作。

我们需要一种可以与提供的资源一起运行的方法,或者-如果未提供,则创建自己的方法:

string Foo(Resource parameter = null)
{
    if (parameter == null)
    {
        using (var res = new Resource)
        {
            res.Something();
               /*......*/
               /*......*/
               /*......*/
            return /*..........*/
        }
    }
    else 
    {
            parameter.Something();
               /*......*/
               /*......*/
               /*......*/
            return /*..........*/
    }
 }
Run Code Online (Sandbox Code Playgroud)

}

它有效,但这对我来说真的很丑。是否可以用更紧凑,更“漂亮”的方式编写它?

我不能使用:

string Foo(Resource parameter = null)
{
    using (var res = parameter ?? new Resource())
    {
        res.Something();
           /*......*/
           /*......*/
           /*......*/
        return /*..........*/
    }
}
Run Code Online (Sandbox Code Playgroud)

因为如果作为参数传递它会处理我的原始资源。

PS。这个问题的正确标签是什么?#coding-style标记为“请勿使用”。

Jon*_*eet 9

一种简单的方法是仅返回parameternull:

string Foo(Resource parameter = null)
{
    if (parameter == null)
    {
        using (var res = new Resource())
        {
            return Foo(res);   
        }
    }
    else 
    {
        parameter.Something();
        ...
        return ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

您只需要递归一次,因此您不必担心无界堆栈等问题。

  • 伟大的!事实上,您甚至不需要“else”或任何大括号! (2认同)
  • @JakubSzułakiewicz:很多时候并不需要*,但是无论如何,它们几乎总是一个好主意。(是否使用“ else”取决于个人喜好。) (2认同)

Ren*_*iuz 5

我会采用两种不同的方法。它将包含所有逻辑 - 它将清晰且易于维护。

string Foo(Resource parameter)
{
     parameter.Something();
     /...../
     return /...../;
}

string Foo()
{
     using (var res = new Resource)
     {
         return Foo(res);
     }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想将注入参数用于测试目的,这种情况也很有用。寻找无参数方法的用法将导致实际实现,另一种将直接引导您到测试用例。