2011-06-24 78 views
4

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

int foo(int k, bool check = false) 

一个单调乏味的解决方法是重载一个函数。一个更容易? (有没有办法只是增加了变数和检查功能的调用!!)

感谢, 孙

回答

10

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

+2

非常丰富。感谢分享。 – Gleno

+0

酷办法丹尼斯...谢谢.. C#有时候有点尴尬...... – Sunscreen

+0

我不知道默认值会被编译到耗时代码中,感谢你提到这个问题,我添加了一个显示效果的例子。 [msdn文档](http://msdn.microsoft.com/en-us/library/dd264739.aspx)甚至没有提及此! – comecme

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

您可以在组件使用可选参数,如果他们用的MSBuild建立4.0(VS2010),即使你是面向.NET 2.0框架。

的语法就像你说:

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

对不起该项目采用C#2.0 :( – Sunscreen

+0

所以做我的,我使用VS2010和编译器的可选PARAMS增加了,而不是框架。 – DaveShaw

0

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

看看例子为string.Format()在那里你可以使用它像:

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

这样你可以通过任何数量则params的,但它是相当棘手如何ü消耗它,可能会很容易出错

2

若要详细说明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页面上没有提到这一点。