C#默认参数解决方法

时间:2011-06-24 08:14:34

标签: c# default-parameters

是否有默认参数的解决方法?在C ++中我会使用

int foo(int k, bool check = false)

繁琐的解决方法是重载函数。一个更容易? (没有办法只添加变量并检查函数的调用!!)

谢谢, 太阳

6 个答案:

答案 0 :(得分:10)

C#(4.0之前)不支持默认参数。即使在c#4.0中,默认参数也有点不同于C ++ - 它们存储在元数据中,当您使用默认参数引用程序集时,它们会被编译到您的代码中。因此,如果将来更改默认值,您的代码仍将传递OLD默认值,这可能会导致不良影响。因此,使用带有单个参数和双参数的重载函数,并调用具有更多参数的参数传递默认值。这种方法的副作用最小。

答案 1 :(得分:4)

在C#4中,您也可以这样做。所以这是允许的:

int foo(int k, bool check = false){
  ...
}

也可以在C#4中使用命名参数,因此您可以通过多种方式调用此方法:

foo(10, true);
foo(10);
foo(k: 10, check: true);
foo(check: true, k: 10);
如果你有几个可选参数,并且只希望指定其中一个不是第一个可选参数,或者提高调用端的可读性,那么

命名参数很有用。

答案 2 :(得分:4)

在C#4.0中,现在支持默认和命名参数。

http://msdn.microsoft.com/en-us/library/dd264739.aspx

答案 3 :(得分:2)

如果使用MSBuild 4.0(VS2010)构建,则可以在程序集中使用可选参数,即使您的目标是.Net 2.0框架。

语法就像你说的那样:

int foo(int k, bool check = false)
{
}

答案 4 :(得分:2)

详细说明Denis Mazourick关于在C#4.0中使用 default optional parameters以及如何将默认值编译到消费类中的答案,试试这个。

使用以下代码创建一个类库并构建它:

public class ClassWithDefaultParameters {
    public string Msg { get; set; }

    public ClassWithDefaultParameters(string msg = "Hello World") {
        Msg = msg;
    }
}

public class ClassWithConstructorOverloads {
    public string Msg { get; set; }

    public ClassWithConstructorOverloads(string msg) {
        Msg = msg;
    }

    public ClassWithConstructorOverloads() : this("Hello World") {}
}

现在创建一个控制台应用程序并引用刚刚构建的dll(不是项目,而是实际的dll)。将其放在代码中并构建控制台应用程序。

    static void Main() {
        var cwdp = new ClassWithDefaultParameters();
        var cwco = new ClassWithConstructorOverloads();

        Console.WriteLine(cwdp.Msg);
        Console.WriteLine(cwco.Msg);
   }

运行应用程序时,输出将如您所愿:

Hello World
Hello World

现在打开类库,并在“Hello Europe”中更改“Hello World”。重新编译库并将dll复制到控制台应用程序的输出文件夹中。 重建控制台应用程序。

再次运行控制台应用程序时,输出将为:

Hello World
Hello Europe

可能不是你的预期!直到重建控制台应用程序,两行才会打印Hello Europe


我不知道这个,我想我不会因为这个而使用默认参数。更糟糕的是,微软没有在MSDN页面上提到这一点。

答案 5 :(得分:0)

嗯,没有更简单的方法,你可以使用param功能,但它也有风险。

查看string.Format()的示例,您可以在其中使用它:

stringA.Format("{0} is {1}", str1, str2)

这样你可以传递任意数量的参数,但是如何使用它并且非常容易出错