C#默认参数解决方法

C#默认参数解决方法,c#,default-parameters,C#,Default Parameters,是否有默认参数的解决方法?在C++中,我将使用< /P> int foo(int k, bool check = false) 一个乏味的解决方法是重载函数。比较容易的?(不能只添加变量并检查函数的调用!!) 谢谢, 在C#4中,你也可以这样做。所以这是允许的: int foo(int k, bool check = false){ ... } 也可以在C#4中使用命名参数,因此您可以通过多种不同的方式调用此方法: foo(10, true); foo(10); foo(k: 10, c

是否有默认参数的解决方法?在C++中,我将使用< /P>
int foo(int k, bool check = false)
一个乏味的解决方法是重载函数。比较容易的?(不能只添加变量并检查函数的调用!!)

谢谢, 在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);
如果您有多个可选参数,并且只希望指定其中一个不是第一个可选参数的参数,或者为了提高调用端的可读性,则命名参数非常有用。

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


如果程序集是使用MSBuild 4.0(VS2010)生成的,即使您的目标是.Net 2.0 framework,也可以在程序集中使用可选参数

语法就像你说的:

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

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

好吧,没有更简单的方法,您可以使用
param
功能,但也有风险

请看一下
string.Format()
的示例,您可以像这样使用它:

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

通过这种方式,您可以传递任意数量的参数,但如何使用它是相当棘手的,而且可能非常容易出错。要详细说明Denis Mazourick关于在C#4.0中使用默认值以及如何将默认值编译到消费类中的回答,请尝试以下方法

使用以下代码创建类库并生成它:

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复制到控制台应用程序的输出文件夹。不要重建控制台应用程序

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

        Console.WriteLine(cwdp.Msg);
        Console.WriteLine(cwco.Msg);
   }
再次运行console应用程序时,输出将为:

Hello World Hello Europe 你好,世界 你好,欧洲 可能不是你所期望的!直到重新构建console应用程序,这两行才会打印
Hello Europe



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

很抱歉,该项目使用了C#2.0:(我的也是,我使用VS2010,编译器添加了可选参数,而不是框架。很酷的方法Denis…谢谢…C#有时会有点尴尬…我不知道默认值会被编译到消费代码中。谢谢你提到这一点。我添加了一个答案,并用一个示例展示了效果。这个答案并不正确。)别提这个!