C# 将可选参数传递给方法

C# 将可选参数传递给方法,c#,C#,我试图将可选参数传递给方法,但很难理解为什么它不起作用。这里最流行的答案是public void SomeMethodint a,int b=0。所以我在下面也尝试了同样的方法 我能把这里的其他语句处理掉吗?我的意思是,我可以使用另一个参数=如果不是另一个参数=可选的吗?如果它存在,方法将获取它,如果不存在,则跳过它 下面是使用else语句的代码: 上面的代码是我需要的,它工作得很好。我的问题更像是有没有更好的办法 以下是我的想法,但它不起作用: using System; public cl

我试图将可选参数传递给方法,但很难理解为什么它不起作用。这里最流行的答案是public void SomeMethodint a,int b=0。所以我在下面也尝试了同样的方法

我能把这里的其他语句处理掉吗?我的意思是,我可以使用另一个参数=如果不是另一个参数=可选的吗?如果它存在,方法将获取它,如果不存在,则跳过它

下面是使用else语句的代码:

上面的代码是我需要的,它工作得很好。我的问题更像是有没有更好的办法

以下是我的想法,但它不起作用:

using System;

public class Program
{
    public static void Main()
    {

        int MyNumber = 6;
        string StringOne;
        string StringTwo;

        if (MyNumber != 5)
        {
            StringOne = "Number is not 5";
            StringTwo = "True that!";
        }
        CheckNumber(StringOne, StringTwo);
    }

    public static void CheckNumber(string StringOne = "", string StringTwo = "")
    {
        Console.WriteLine(StringOne + "\n" + StringTwo);
    }
}
未在中分配变量:CheckNumberStringGone、StringTwo


我在想,我可以使用string StringOne=使参数可选,但这似乎不是解决方案?

在您的特定情况下,您不需要使方法的参数可选,只需要将变量初始化为您想要使用的默认值:

    int MyNumber = 6;
    string StringOne = "";  // <--
    string StringTwo = "";  // <--

    if (MyNumber != 5)
    {
        StringOne = "Number is not 5";
        StringTwo = "True that!";
    }
    CheckNumber(StringOne, StringTwo);

警告一句:请不要将此视为邀请您继续并显式初始化所有变量。只有在有充分理由这样做的情况下才应该这样做,因为这会增加我忘记将此变量设置为错误的正确值类型的可能性,否则C编译器的赋值检查会捕获这些错误。

在您的特定情况下,您不需要将方法的参数设置为可选,您只需将变量初始化为要使用的默认值:

    int MyNumber = 6;
    string StringOne = "";  // <--
    string StringTwo = "";  // <--

    if (MyNumber != 5)
    {
        StringOne = "Number is not 5";
        StringTwo = "True that!";
    }
    CheckNumber(StringOne, StringTwo);
警告一句:请不要将此视为邀请您继续并显式初始化所有变量。只有在有充分理由这样做的情况下才应该这样做,因为这会增加我忘记将此变量设置为错误的正确值类型的可能性,否则C编译器的赋值检查会捕获错误的值类型。

字符串是引用类型,所有引用类型的默认值都为null

尝试将StringOne和StringTwo初始化为String。empty

该字符串是引用类型,所有引用类型的默认值均为null


尝试将StringOne和StringTwo初始化为String.empty

初始化项对的另一种方法是使用C8元组语法,例如:

int MyNumber = 6;

(string StringOne, string StringTwo) = 
    MyNumber != 5 ? ("Number is not 5", "True that!")
                  : ("",                ""          );

CheckNumber(StringOne, StringTwo);

初始化项目对的另一种方法是使用C8元组语法,例如:

int MyNumber = 6;

(string StringOne, string StringTwo) = 
    MyNumber != 5 ? ("Number is not 5", "True that!")
                  : ("",                ""          );

CheckNumber(StringOne, StringTwo);

调用CheckNumber以使用optional。您拥有的很好。optional意味着您可以在方法调用中省略参数,而不是在您提供emptyCall CheckNumber以使用optional时它将使用该默认值。您拥有的很好。optional意味着您可以在方法调用中省略参数,并不是说当你提供空的东西时它会使用默认值,但显然它的效率比使用if/else要低一些,因为如果MyNumber不是5,字符串首先被初始化为其他字符串,然后再被重新分配给其他字符串。我建议OP保持代码的原样。@MatthewWatson:这取决于OP的用例。在许多情况下,可读性和代码简单性比微小的性能微优化更重要。我同意代码清晰性很重要,这就是为什么我个人在这种情况下更喜欢显式if/else。YMMV.@MatthewWatson:我同意变量初始化应该谨慎使用,以查看我当前对答案的编辑。这是可行的,但显然比使用if/else效率低一些,因为如果MyNumber不是5,字符串首先被初始化为其他字符串,然后再重新分配给其他字符串。我建议OP保持代码的原样。@MatthewWatson:这取决于OP的用例。在许多情况下,可读性和代码简单性比微小的性能微优化更重要。我同意代码清晰性很重要,这就是为什么我个人在这种情况下更喜欢显式if/else。“YMMV.@MatthewWatson:我同意变量初始化应该谨慎使用,以查看我当前对答案的编辑。”。