4

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

int foo(int k, bool check = false)

一个乏味的解决方法是重载一个函数。一个更简单的?(没有办法只添加变量并检查函数的调用!!)

谢谢,孙

4

6 回答 6

10

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

于 2011-06-24T08:20:08.810 回答
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);

如果您有多个可选参数,并且只想指定其中一个不是第一个可选参数,或者为了提高调用方的可读性,命名参数很有用。

于 2011-06-24T08:16:09.510 回答
4

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

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

于 2011-06-24T08:17:05.453 回答
2

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

语法就像你说的:

int foo(int k, bool check = false)
{
}
于 2011-06-24T08:17:13.640 回答
2

要详细说明 Denis Mazorick 关于在 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 Europe”中的“Hello World”都改一下。重新编译库并将 dll 复制到控制台应用程序的输出文件夹中。不要重建控制台应用程序。

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

你好世界
你好欧洲

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


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

于 2011-06-24T10:26:48.800 回答
0

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

看看string.Format()你可以在哪里使用它的例子:

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

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

于 2011-06-24T08:38:00.397 回答