2010-02-10 80 views
4

在C#中,我们可以像C++一样执行以下操作吗?我可以给C#参数一个默认值吗?

public void myMethod(int i, MyClass obj, int value=100){ 

} 

另一个问题是MyClass的是引用类型,如果没有ref在它之前,它会通过MyClass的副本进入方法而不是参考?

感谢,

+3

您是否试过测试它是否使用默认值编译? – 2010-02-10 15:28:10

+0

当C#4可用时,传递一个类总是通过一个引用 – 2010-02-10 15:28:25

回答

5

其他人已经正确回答了可选参数部分:您可以在C#4中为参数指定默认值。(有各种限制,例如必须参数必须在可选参数之前出现,并且缺省值必须为是一个编译时间常数)

<gratuitous plug>See C# in Depth, 2nd edition,更多细节</gratuitous plug>

对于“参数传递”方面的第13章 - 所有参数通过由默认值传递,但在引用类型的情况下参数是一个参考,而不是对象。更改对象对于调用者将是可见的,但如果您更改参数本身以引用不同的对象,则更改将不会对调用者可见。 (它不会改变调用者变量的值。)有关详细信息,请参阅我的article on parameter passing

+1

'':) – 2010-02-10 15:33:56

+0

? – 5YrsLaterDBA 2010-02-10 16:12:09

+0

@ 5YrsLaterDBA:VS2010的发布候选人现在已经发布给MSDN订户,今天晚些时候发布给其他人。实际发布可能在4月份我相信。 – 2010-02-10 16:19:14

1

你可以做到这一点在C#4.0的可选参数

10

不是在C#达C#3(这是当前版本)。在C#4中,您可以使用默认值optional parameters

关于MyClass和ref的问题,参数按值传递。对于引用类型,可以说变量(或参数)的“值”是对实例的引用,所以如果修改MyClass实例上的属性,则可以修改调用方所引用的同一实例。

乔恩斯基特写关于这个问题的好文章:“Parameter passing in C#

3

的标准方法基本上完成在C#3此确切行为和更早是重载方法中的问题:

public void myMethod(int i, MyClass obj, int value=100){ 
    // do whatever 
} 

public void myMethod(int i, MyClass obj) { 
    myMethod(i, obj, 100); 
} 

如果MyClass是引用类型,然后obj将是一个MyClass一个参考目的。添加ref关键字将使obj参考(仍然)通过引用通过。换句话说,你可以这样做:

obj = new MyClass(); 

...而且你可以修改传递给myMethod参考。否则(没有ref)你只会修改本地参考;和原始参考,无论传递到myMethod,将保持不变。

相关问题