2011-08-04 71 views
3

如果我调用一个使用out或ref参数的方法,为什么在调用方法时需要使用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’,因为它不同于另一种方法只在裁判和出“,所以我不能那样做。

编辑:

了些研究后,似乎我需要指定传出或引用调用方法时,如果有声明如下两种重载方法:

void DoStuff(int x, out int y) 

    void DoStuff(int x, int y) 
+1

你真的不希望它是隐含的,它更好的这种方式。只要考虑意外变量变化的可能性。 – Jodrell

+0

这也有让ref看起来很尴尬的好处,因此降低了它的流行度,从而使代码更易于维护。 (IMO) – Jodrell

回答

10

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

+0

的确,这是c#的积极特征之一 – Jodrell

+0

感谢亚当,似乎超载也进入了它。如果我将示例中的两个方法签名更改为: void DoStuff(int x,out int y) void DoStuff(int x,int y) 然后它们可以被重载。 – GrandMasterFlush

+1

@Grand:是的; IL不区分'ref'和'out',这就是为什么你不能创建一个具有'ref'的重载和另一个只是'out'的重载,但你可以有一个具有'ref' /'' out“参数和一个不是。 –

0

你的情况可能被认为是黑客行为。它的目的是允许一个方法改变参数的值。

例如:

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


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

他问他为什么在调用函数时需要使用'ref'或'out'(而不是只需要在方法签名中声明它们为'ref'或'out'),而不是'ref'和'out'。 –

+0

我的不好,upvoted你的答案:) – TJHeuvel

+0

@TJHeuvel对不起,我的问题不完全清楚,我的意思是! – GrandMasterFlush

2

ref和out实际上是一样的事情。不同之处在于out关键字使编译器在从方法返回之前检查变量是否已分配。

编辑

对不起,误解了这个问题,我还以为你问为什么C#不会让你有2种方法具有相同签名,只有在参数修饰符的差异。请参阅@Adam Robinson的答案;这是为了确保主叫方知道可能发生的情况(或者在出局的情况下,将发生)到方法返回后的变量。

+2

他问他为什么在调用函数时需要使用'ref'或'out'(而不是只需要在方法签名中声明它们为'ref'或'out'),而不是'ref'和“出去”。 –

+1

对不起,我已经重新提出这个问题,以消除这种模糊性。 – GrandMasterFlush

1

C#让你标记参数作为ref/out警示/指针,不同的东西用这些参数和传递的值可能会改变发生的程序员。例如,在这种情况下:

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

我知道在看上面的例子中myInt值是12,但是这不会是如果outref参数是隐含的情况。

1

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

它有额外的好处,可以阻止你不小心做到这一点。

已经维持在由裁判通过暗示,甚至在默认情况下,我会说,打字3个charachters是一个很小的代价清晰度(也可能是理智),它提供的平台代码。

相关问题