为什么我需要在para或ref前面加上params?

时间:2011-08-04 14:46:15

标签: c#

如果我正在调用一个使用out或ref参数的方法,为什么在调用方法时需要用out或ref标记参数?即。

DateTime.TryParse(myDate, out dateLogged)

我曾经认为这可以减少操作符重载时的歧义但是如果我创建两个这样的方法:

void DoStuff(int x, out int y)
{
    y = x + 1;
}

void DoStuff(int x, ref int y)
{
    y = x + 1;
}

然后Visual Studio报告“无法定义重载方法'DoStuff',因为它与ref和out中的另一种方法不同”,所以无论如何我都不能这样做。

编辑:

经过一些研究后,如果有两个重载方法声明如下,我需要在调用方法时指定out或ref:

    void DoStuff(int x, out int y)

    void DoStuff(int x, int y)

5 个答案:

答案 0 :(得分:10)

它就在那里你明确同意你所调用的方法可能会修改变量本身的值。这是C#语言要求;其他语言如VB.NET不要求你装饰实际的方法调用,只需要方法签名。

答案 1 :(得分:2)

Ref和Out真的是一回事。不同之处在于out关键字使编译器在从方法返回之前检查变量是否已分配。

修改

对不起,误解了这个问题,我以为你在问为什么c#不允许你有2个方法具有相同的签名,只有参数修饰符的区别。见@Adam Robinson的回答;这是为了确保调用者在从方法返回后知道可能发生的事情(或者在出局时将发生)。

答案 2 :(得分:1)

C#使您将参数标记为ref / out作为警告/指向程序员的指针,表明这些参数发生了不同的情况,并且传递的值可能会发生变化。例如,在这种情况下:

int myInt = 12;
string myString = Fizz(myInt);
// What is the value of myInt at this point?

我知道上面的示例看myInt的值是12,但如果outref参数是隐含的,则不会出现这种情况。

答案 3 :(得分:1)

因此阅读代码的人知道你在做什么,它清楚地表明传递的变量可能会改变。

它还有一个额外的好处就是阻止你偶然做到这一点。

在隐含地或甚至默认情况下通过ref传递的平台上维护代码时,我会说输入3个字符只是为它提供的清晰度(可能是理智)付出的代价。

答案 4 :(得分:0)

您的案件可能被视为黑客攻击。它的目的是允许一个方法来改变一个参数的值。

例如:

void someMethod(ref i)
{
 i = 1;
}


int i = 0;
someMethod(ref i); //i now becomes 1, without the ref it would stay 0.