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

3

有没有一种方法可以让一个函数使用它的可选参数值?例如,假设我有以下代码:

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

我希望能做类似以下这样的事情:

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

if...else 包围调用。 - Daniel A. White
我认为这是不可能的。但是,您可以使用经典的 if (possiblyNull == null) myFunction(true); else myFunction(true, possiblyNull); - Heinzi
听起来像是糟糕的设计。 - Spivonious
4个回答

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)

0

你无法在调用现场获取默认值。你需要在方法调用外进行检查。

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

0

你已经很接近了,但是在将参数传递给方法时,你只需要删除possiblyNull即可, 可以像这样做...

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);
    }
}

0

如果您的关注点是:

  • 您不想仅将null作为默认值,因为这意味着默认值不会出现在Intellisense中,调用者也看不到默认值
  • 您可以将某个值作为默认值,然后检查是否为null,如果为null,则将其替换为默认值,但这意味着在两个位置放置默认值

您可以这样做:

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

现在你可以同时得到两者。默认值会出现在Intellisense中,而且不会重复。

如果只是因为你

  • 可能需要传递一个null值
  • 想要获取默认值
  • 必须经常这样做,以至于很烦人
  • 不能修改原始方法

你可以为包含该方法的类创建一个扩展:

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接