在C#中,我们可以像C ++一样执行以下操作吗?
public void myMethod(int i, MyClass obj, int value=100){
}
另一个问题是MyClass是一个引用类型,如果之前没有ref
,它会将MyClass的副本传递给方法而不是引用吗?
感谢,
答案 0 :(得分:10)
不在C#中,直到C#3(这是当前版本)。在C#4中,您可以使用默认值optional parameters。
关于MyClass和ref
的问题,参数按值传递。对于引用类型,您可以说变量(或参数)的“值”是对实例的引用,因此如果您修改MyClass
实例上的属性,则修改相同的实例,因为调用者具有参考。
Jon Skeet写了一篇关于这个主题的好文章:“Parameter passing in C#”
答案 1 :(得分:5)
其他人正确回答了可选参数部分:您可以为C#4中的参数指定默认值。(有各种限制,例如必须参数必须在可选参数之前,默认值必须是编译 - 时间常数。)
<gratuitous plug>
See C# in Depth, 2nd edition,第13章了解更多详情</gratuitous plug>
对于“参数传递”方面 - 默认情况下所有参数都按值传递,但在引用类型的情况下,参数是引用,而不是对象。调用者可以看到对对象的更改,但是如果您更改参数本身以引用其他对象,则更改将不会对来电者可见。 (它不会更改调用者变量的值。)有关详细信息,请参阅我的article on parameter passing。
答案 2 :(得分: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
,都将保持不变。
答案 3 :(得分:1)
您可以在C#4.0中为可选参数
执行此操作答案 4 :(得分:0)