在我提出问题之前,请看一下这个示例函数:
DateTime.TryParse("01/01/2000", out oDate)
为什么我需要指定out
关键字?编译器不应该从函数的定义中知道这个吗?
我出于纯粹的好奇心问这个问题,希望我能学到一些关于编译器的新知识。
我还应该澄清一下,我特别询问C#.NET 3.5编译器。
答案 0 :(得分:17)
编译器可以暗示out关键字 ,但我的理解是C#团队决定使函数调用者明确要求out
关键字,以提高可见性。参数的性质。
答案 1 :(得分:10)
编译器知道,你可能不知道。这是一种让你知道传递的参数可以在你传递给它的函数中改变的方法。
答案 2 :(得分:6)
这不是关于编译器知道什么,而是关于确保开发人员意识到这个调用可以并且将改变变量X的值。
这很多都源于C ++,其中参考值不需要调用站点监视器。查看C ++调用并确切地知道它将做什么是不可能的。通过引用传递的参数和C ++中的值在语义上有很大差异。
答案 3 :(得分:2)
是的,编译器可以解决它,但这样你知道它将修改你传入的变量。
C#语言有很多我称之为安全网的东西,它明确地告诉程序员发生了什么。几个例子是:
答案 4 :(得分:1)
http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx
“out关键字导致参数通过引用传递。这类似于ref关键字,除了ref要求在传递之前初始化变量。要使用out参数,方法定义和调用方法都是如此必须明确使用out关键字。“
由于DateTime.TryParse不需要初始化oDate,因此必须传递out关键字。
答案 5 :(得分:0)
好的,我不是C#专家,所以如果我搞砸了,请有人纠正我吗?
有两种方法可以将参数传递给C#函数:按值和按引用。这里最大的区别是修改函数内部的参数是否会修改用于调用它的变量。这不是我信任编译器自己决定的东西。
由于您希望oDate是从调用者传入的变量,并且已更改,因此您希望它通过引用传递。
另一个问题是它是否应该被初始化。 C#喜欢在未初始化时使用变量时捕获,因为这几乎总是一个错误。在这种情况下,您可能只是声明传入的内容,并使用TryParse()为其提供第一个值。这是一种完全合法的技术,因此编译器应该允许它。这是另一件我不相信编译器正确的事情。 (我假设编译器还检查以确保在TryParse()中使用之前初始化out参数。)
所以,“out”有两个目的。它确定参数是通过引用传入的,并且它应该在函数内初始化。这些都不能由编译器确定。