是否有解决默认参数的方法?在C++中,我会使用C#默认参数解决方法
int foo(int k, bool check = false)
一个单调乏味的解决方法是重载一个函数。一个更容易? (有没有办法只是增加了变数和检查功能的调用!!)
感谢, 孙
是否有解决默认参数的方法?在C++中,我会使用C#默认参数解决方法
int foo(int k, bool check = false)
一个单调乏味的解决方法是重载一个函数。一个更容易? (有没有办法只是增加了变数和检查功能的调用!!)
感谢, 孙
的C#(4.0之前)不支持默认参数。即使在C#4.0中,默认参数也与C++有所不同 - 它们存储在元数据中,当您使用默认参数引用程序集时,它们会被编译到您的代码中。所以,如果将来更改默认值,您的代码仍然会通过旧的默认值,这可能会导致不好的结果。因此,使用带有单个参数和双参数的重载函数,并使用更多参数传递默认值来调用函数。这种方法的副作用最小。
在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中,现在支持默认参数和命名参数。
好吧,没有简单的方法,你可以使用param
功能,但它也是有风险的。
看看例子为string.Format()
在那里你可以使用它像:
stringA.Format("{0} is {1}", str1, str2)
这样你可以通过任何数量则params的,但它是相当棘手如何ü消耗它,可能会很容易出错
若要详细说明Denis Mazourick在C#4.0中使用
默认
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 World”。重新编译库并将dll复制到控制台应用程序的输出文件夹中。做不是重建控制台应用程序。
当您再次运行控制台应用程序,输出将是:
Hello World Hello Europe
也许你预期的不是!直到你重建控制台应用程序,这两行都会打印Hello Europe
。
我不知道这一点,我想我不会使用默认参数,因为这个。更糟糕的是,微软在MSDN页面上没有提到这一点。
非常丰富。感谢分享。 – Gleno
酷办法丹尼斯...谢谢.. C#有时候有点尴尬...... – Sunscreen
我不知道默认值会被编译到耗时代码中,感谢你提到这个问题,我添加了一个显示效果的例子。 [msdn文档](http://msdn.microsoft.com/en-us/library/dd264739.aspx)甚至没有提及此! – comecme