我可以给C#参数一个默认值吗?

时间:2010-02-10 15:26:36

标签: c#

在C#中,我们可以像C ++一样执行以下操作吗?

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

}

另一个问题是MyClass是一个引用类型,如果之前没有ref,它会将MyClass的副本传递给方法而不是引用吗?

感谢,

5 个答案:

答案 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)