我可以在C#中创建一个可选参数的函数,还是需要重载它?

时间:2012-07-07 09:15:01

标签: c#

我在界面中有以下内容:

string GetTopic(string rk);

和这个功能:

public string GetTopic(string rk)
{
    return string.Format("{0}.{1}.{2}",
        rk.Substring(0, 2).TrimStart('0'),
        rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
        rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'));
}

我想添加一个可选的第二个参数,可以像这样调用函数:

var a = GetTopic("010101") 

var b = GetTopic("010101","test")

在第一种情况下,我希望得到输出“1.1.1”,在第二种情况下,输出“1.1.1 - test”。

这是可能的还是我需要制作两个功能并且一个重载另一个?如何在界面中指定可选的第二个参数?

6 个答案:

答案 0 :(得分:3)

您可以设置默认值:

public string GetTopic(string rk, string anotherParam = "")
{
    String append = (String.IsNullOrEmpty(anotherParam)) ? "" : " - " + anotherParam;
    return string.Format("{0}.{1}.{2}{3}",
        rk.Substring(0, 2).TrimStart('0'),
        rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
        rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'),
        append);
}

如果你打电话,那么“anotherParam”会被测试:

var a = GetTopic("010101");

对于你的interace-definition:

public interface IUtilityService 
{ 
    string GetTopic(string rk, string suffix = ""); 
} 

MSDN:http://msdn.microsoft.com/de-de/library/dd264739.aspx

答案 1 :(得分:2)

在C#4.0中,您可以为参数提供默认值,因此将其设为可选:

public string GetTopic(string rk, string param2 = "5")
{
    return string.Format("{0}.{1}.{2}",
        rk.Substring(0, 2).TrimStart('0'),
        rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
        rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'));
}

答案 2 :(得分:0)

您可以使用params关键字:

public string GetTopic(string rk, params options)
{
    return string.Format("{0}.{1}.{2}",
        rk.Substring(0, 2).TrimStart('0'),
        rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
        rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'));
}

这为您提供了一系列可选参数。这是一个参考link

答案 3 :(得分:0)

有可能:

public string GetTopic(string rk,string lk = null)
{
    if (lk!=null)
    { //with param logic

    }
    else
    { //without param logic

    }
    return string.Format("{0}.{1}.{2}",
        rk.Substring(0, 2).TrimStart('0'),
        rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
        rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'));
}

答案 4 :(得分:0)

您需要更改界面以使第二个参数可选:

public interface YourInterface
{
    string GetTopic(String rk, String suffix = "");
}

然后,实现您的界面,再次指定可选参数:

public class YourClass : YourInterface
{
    public string GetTopic(String rk, String suffix = "")
    {
        return string.Format("{0}.{1}.{2}{3}{4}",
            rk.Substring(0, 2).TrimStart('0'),
            rk.Substring(2, 2).TrimStart('0').PadLeft(1, '0'),
            rk.Substring(4, 2).TrimStart('0').PadLeft(1, '0'),
            string.IsNullOrWhiteSpace(suffix) ? "" : " - ",
            suffix);
    }    
}    

关于在以下情况下使用可选参数的提示: 请注意您指定的默认值,因为根据方法的调用方式,将使用接口中定义的值或实现中定义的值。

例如,如果接口要定义suffix = "",并且实现是否要定义suffix = null

  • YourInterface.GetTopic("010101")将传递并清空字符串作为第二个参数,但
  • YourClass.GetTopic("010101")会通过null

可以找到in this blog post的可能案例的完整概述。

答案 5 :(得分:0)

您需要将可选参数添加到界面中:

 interface IInterface
    {
        string GetTopic(string one, string t = null);
    }

    class a : IInterface
    {
        public string GetTopic(string one, string t = null)
        {
            throw new NotImplementedException();
        }
    }