有没有更简单的方法为C#中的方法创建重载?

时间:2011-07-09 18:08:45

标签: c# syntax overloading argument-passing

这是一个普遍的编程疑问,而不是具体的。但我会用一个例子说明。假设我正在创建一个自己的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()方法,并且每个参数组合都可以通过。 (这使得编写单独的函数非常繁琐)。

感谢。

2 个答案:

答案 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}

这样做的一个好处是你可以传递除常量之外的东西,比如对象的新实例化或静态只读事物。