繁体   English   中英

我可以使C#中的函数采用可选参数还是需要重载它?

[英]Can I make a function in C# take an optional parameter or do I need to overload it?

我在界面中有以下内容:

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”。

这是否可能,或者我需要执行两个功能,并让一个重载另一个功能? 如何在界面中指定可选的第二个参数?

您可以设置默认值:

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

为了您的界面定义:

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

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

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

您可以使用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'));
}

这为您提供了一系列可选的参数。 这是参考链接

有可能的:

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

您需要更改接口以使第二个参数可选:

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

可以在此博客文章中找到有关可能情况的良好概述。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM