使用函数的可选参数的默认值

时间:2019-04-16 19:01:27

标签: c#

是否有一种方法可以使函数使用其可选参数的值?例如,说我有

public void myFunction(bool required, string optional = "This is optional") {...}

我想做这样的事情,

string possiblyNull = null; // the result of another function
myFunction(true, possiblyNull ?? possiblyNull : optional)

4 个答案:

答案 0 :(得分:1)

C#编译器嵌入参数的默认值,在调用站点上遗漏任何参数时。在您的情况下,您想使用该参数调用您的方法。因此,这是不可能的,因此您必须在方法的外部或内部使用该检查。如果您确实想防止在调用方法时使用if子句,则可以更改方法的签名,如下:

public void myFunction(bool required, string optional) 
{
    optional = optional ?? "This is optional";
    ...
}

然后这样称呼:

string possiblyNull = null; // the result of another function
myFunction(true, possiblyNull)

答案 1 :(得分:0)

您无法在呼叫站点获得默认值。您需要在方法调用之外进行检查。

string possiblyNull = null;
// ...
if (possiblyNull == null)
    myFunction(true);
else
    myFunction(true, possiblyNull);

答案 2 :(得分:0)

您已经在那儿了,但是您只需要删除可能性为null:将参数传递给方法时, 你可以这样...

public partial class MainWindow : Window
{
    private string optional = "Test";
    string possiblyNull = null;

    public MainWindow()
    {
        InitializeComponent();

       // here you can check null 
        myFunction(true, possiblyNull ?? optional);
       // Or 
        myFunction(true);

    }

    public  void myFunction(bool required, string optional = "This is optional")
    {
       MessageBox.Show(optional);
    }
}

答案 3 :(得分:0)

如果您担心的是

  • 您不想只将null设置为默认值,因为这将意味着默认值将不会出现在Intellisense中,而呼叫者也不会看到默认值
  • 您可以将某个值设为默认值,然后检查null,如果为空,则将其替换为默认值,但这意味着将默认值放在两个位置

您可以这样做:

private const string OptionalValue = "This is optional!";
public void myFunction(bool required, string optional = OptionalValue)
{
    optional = optional ?? OptionalValue;
}

现在你们两者都得到了。默认值显示在Intellisense中,不再重复。

如果只是你

  • 可能需要传递一个空值
  • 想要获取默认值
  • 必须经常这样做以至于令人讨厌
  • 无法修改原始方法

您可以为包含方法的类创建扩展:

public static class Extension
{
    // I can't think of how this function name would not be awkward.
    public static void MyFunctionThatReplacesNullWithDefault(
        this ClassWithOptionalMethod target, bool required, string optional = null)
    {
        if(optional == null)
            target.myFunction(required);
        else
            target.myFunction(required, optional);
    }
}