如果这些参数是可选的,则C#不传递参数

时间:2016-04-01 00:43:37

标签: c#

我希望这是一个简单的问题,只是我的大脑缺少最后的链接。如果在其他地方还有另一个q& a,请指出我并关闭它...但我无法在任何地方找到它。

这是要点:

我有一个带有可选参数的方法的类,类似于

public class Test
{
    public void Method(string required, string someoptionalparameter="sometext", string anotheroptionalparameter="someothertext")
    {
        // do something here with the parameters
    }
 }

到目前为止,非常好。

现在,我将实例化该类并在我的代码中调用该方法:

 ...
Test.Method("RequiredString");

这将有效。如果我提供可选参数,它仍然有效。

但是我如何处理一个场景,我不知道是否提供了可选值。例如:

...
Test.Method(requiredString,optionalString1,optionalString2);
...

如果知道,如果optionalString1和optionalString2有值,该怎么办?那么我是否需要为每个场景编写一个覆盖,包括...

if (optionalString1.isEmpty() && optionalString2.isEmpty())
{
     Test.Method(requiredString);
}
else if ((!optionalString1.isEmpty() && optionalString2.isEmpty())
{
     Test.Method(requiredString, optionalString1);
}
else if...

必须有另一种方式,我敢打赌它很简单,我只是有一个星期五...有什么类似......

Test.Method(requiredStrinig, if(!optionalString1.isEmpty())... 

3 个答案:

答案 0 :(得分:4)

您应该反转逻辑 - 将这些可选参数设为null,然后在方法中进行检查。所以在你的情况下,方法应该是这样的:

public void Method(string required, string opt1 = null, string opt2 = null)
{
    opt1 = opt1 ?? "some default non-null value if you need it";
    opt2 = opt2 ?? "another default value, this one for opt2";

    // for those not knowing what it does ?? is basically 
    // if (opt1 == null) { opt1 = "value"; }

    //... rest of method
}

然后在外部代码中调用该方法会更容易,并且方法中的逻辑将能够处理null情况。在方法之外,您不必担心这些额外的参数,即您可以按照您想要的方式调用方法,例如:

Test.Method(requiredString);
Test.Method(requiredString, "something");
Test.Method(requiredString, null, "something else");

同样@Setsu在评论中说,你可以这样做,以避免传递null作为第二个参数:

Test.Method("required", opt2: "thanks @Setsu");

答案 1 :(得分:-1)

使用重载,它会为您提供更好的语义,如果您猜测自客户端代码以来的参数,您可以确定要使用的重载,此外,您将所有机器放在一个位置,看看这个技术,希望这有帮助,问候。

课程计划{

<div class="carousel-slide">
    <div class="carousel-slide-content">
        @Html.Sitecore().BeginField(....)
             <div class="background-image">
                  .....
             </div>

             <div class="text-container">
                  ....
             </div>
        @Html.Sitecore().EndField()
    </div>
</div>

}

答案 2 :(得分:-2)

可选参数,是,可选的。它们似乎是一种减少方法重载次数的方法。如果您收到所有三个参数,则必须确定第二个或第三个参数是否为空并且需要设置为&#34;默认&#34;值。

我的建议是用三个字符串调用你的方法,并在方法中决定是否必须更改字符串二和三的值。我可能会使用const或readonly而不是默认值。