这是一个普遍的编程疑问,而不是具体的。但我会用一个例子说明。假设我正在创建一个自己的MessageBox类,我希望{21}重载实现.Show()
方法。我可以这样做,如下所示。
public static void Show(string x){}
public static void Show(int x){}
public static void Show(param x){}
public static void Show(param2 x){}
public static void Show(string x, param y){}
.
.
.
.
public static void Show(param x, param y){}
编写21种这样的方法变得非常麻烦。有没有更简单的方法来做到这一点?像,
public static void Show(string x, string y, int i, param p, ...... param21st z)
{
if (//see the arguments and decide)
//do stuff ignoring rest of the arguments;
else if (//passed arguments are of these type)
//then do this stuff.
else if (so and so)
// so and so.
}
注意:
1.我知道可能存在这样的论点:它不会使我的单个函数变得如此之大,以至于它可能超过单独编写的21个不同函数的大小。不。在我的情况下,单独编写是一个更大的麻烦,考虑到我需要在函数下执行的是非常简单的(只是该函数可能需要大量的参数)。此外,这个问题也是要了解不同的编码技术。
2.我理解我正在寻找的简洁风格有其缺点,就我而言,它是我为自己创造的业余爱好计划。因此可用性并不重要。只是我需要执行.Show()
方法,并且每个参数组合都可以通过。 (这使得编写单独的函数非常繁琐)。
感谢。
答案 0 :(得分:5)
你可以这样做,但你必须知道函数中的参数类型。
public static void Show(params object[] values)
{
if(values[0] == "something")
//Do stuff
}
答案 1 :(得分:4)
我看到的两个不错的选项是:1。可选参数,以及2.让方法根据需要相互调用。两者都将大大减少您需要编写的代码量。
以下是optional parameters(VS 2010或更高版本)的示例。在string x = ""
中,""
是x
的默认值。默认值必须是编译时常量。
public static void Show(string x = "", string y = null, int i = 0, param p = null, ...... param21st z = null)
{
if (//see the arguments and decide)
//do stuff ignoring rest of the arguments;
else if (//passed arguments are of these type)
//then do this stuff.
else if (so and so)
// so and so.
}
当你调用它时,如果你没有包含所有参数,你可能需要对它们进行命名,这样编译器就会明白你是什么而不是指定:
CustomMessageBox.Show(x: "hi", y: "there", p: myObject);
它实际上只是一个编译器技巧,可以使用默认值自动填充所有未包含的参数。
另一种选择是让方法尽可能相互调用。这样你就不会重复21次代码,只是它可以运行许多主要的不同方式。
public static void Show(string x){Show(x, null);}
public static void Show(int x){//do something}
public static void Show(param x){Show(string.Empty, x);}
public static void Show(param2 x){//do something}
public static void Show(string x, param y){//do something}
这样做的一个好处是你可以传递除常量之外的东西,比如对象的新实例化或静态只读事物。