在C#中,我们可以像C++一样执行以下操作吗?我可以给C#参数一个默认值吗?
public void myMethod(int i, MyClass obj, int value=100){
}
另一个问题是MyClass的是引用类型,如果没有ref
在它之前,它会通过MyClass的副本进入方法而不是参考?
感谢,
在C#中,我们可以像C++一样执行以下操作吗?我可以给C#参数一个默认值吗?
public void myMethod(int i, MyClass obj, int value=100){
}
另一个问题是MyClass的是引用类型,如果没有ref
在它之前,它会通过MyClass的副本进入方法而不是参考?
感谢,
其他人已经正确回答了可选参数部分:您可以在C#4中为参数指定默认值。(有各种限制,例如必须参数必须在可选参数之前出现,并且缺省值必须为是一个编译时间常数)
<gratuitous plug>
See C# in Depth, 2nd edition,更多细节</gratuitous plug>
对于“参数传递”方面的第13章 - 所有参数通过由默认值传递,但在引用类型的情况下参数是一个参考,而不是对象。更改对象对于调用者将是可见的,但如果您更改参数本身以引用不同的对象,则更改将不会对调用者可见。 (它不会改变调用者变量的值。)有关详细信息,请参阅我的article on parameter passing。
'
? – 5YrsLaterDBA 2010-02-10 16:12:09
@ 5YrsLaterDBA:VS2010的发布候选人现在已经发布给MSDN订户,今天晚些时候发布给其他人。实际发布可能在4月份我相信。 – 2010-02-10 16:19:14
你可以做到这一点在C#4.0的可选参数
不是在C#达C#3(这是当前版本)。在C#4中,您可以使用默认值optional parameters。
关于MyClass和ref
的问题,参数按值传递。对于引用类型,可以说变量(或参数)的“值”是对实例的引用,所以如果修改MyClass
实例上的属性,则可以修改调用方所引用的同一实例。
乔恩斯基特写关于这个问题的好文章:“Parameter passing in C#”
的标准方法基本上完成在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
,将保持不变。
您是否试过测试它是否使用默认值编译? – 2010-02-10 15:28:10
当C#4可用时,传递一个类总是通过一个引用 – 2010-02-10 15:28:25