编写重载的最简单方法

时间:2014-02-27 16:51:10

标签: c# overloading

什么是为方法编写重载的最简单方法,我不关心用户输入参数的顺序以及类型总是不同的方式?

例如:

public void DoSomething(String str, int i, bool b, DateTime d)
{
    //do something...
}

现在我想有可能以任何可能的方式调用该方法,例如:

DoSomething(1, DateTime.Now, "HelloWorld", false);
DoSomething(DateTime.Now, 1, "HelloWorld", false);
DoSomething("HelloWorld", DateTime.Now, 1, false);
DoSomething(false, DateTime.Now, "HelloWorld", 1);
//and so on...

除了一遍又一遍地复制方法并重新排列参数之外,真的没别的办法吗?

当你为参数指定默认值并且在调用方法时需要指定名称或者设置默认值时,我特别认为这很烦人。

3 个答案:

答案 0 :(得分:5)

首先,如果您的方法在参数计数方面增长,您应该认真考虑创建一个可以保存所有这些数据的特定类:

public class MyData
{
   public string Str {get;set;}

   public int I {get;set;}

   public bool B {get;set;}

   public DateTime D {get;set;}
}

并且只有一个方法签名:

public void DoSomething(MyData data)
{
    //...
}

你可以像这样使用它:

DoSomething(new MyData {I = 1, Str = "Hello", D = DateTime.Today, B = false});

这种方法的另一个优点是它提供了更多的可伸缩性,因为您可以在该类中添加任意数量的新属性,而无需更改方法签名。

除此之外,请参阅Named Parameters

答案 1 :(得分:2)

您可以使用命名参数,读取他的MSDN文章:

http://msdn.microsoft.com/en-us/vstudio/gg581066.aspx

答案 2 :(得分:2)

您可以使用named parameters并使用任何顺序的参数指定参数的名称:

DoSomething(i:1, d:DateTime.Now, str:"HelloWorld", b:false);
DoSomething(d:DateTime.Now, i:1, str:"HelloWorld", b:false);
DoSomething(str:"HelloWorld", d:DateTime.Now, i:1, b:false);
DoSomething(b:false, d:DateTime.Now, str:"HelloWorld", i:1);

或者你也可以使用params但是你放弃了类型检查