代码之家  ›  专栏  ›  技术社区  ›  GateKiller

为什么我必须在C中指定“out”关键字?

  •  3
  • GateKiller  · 技术社区  · 15 年前

    在我问我的问题之前,请看一下这个示例函数:

    DateTime.TryParse("01/01/2000", out oDate)
    

    为什么我需要指定 out 关键字?编译器不应该从函数的定义中知道这一点吗?

    我问这个问题纯粹是出于好奇,希望我能学到一些关于编译器的新知识。

    我还应该澄清一下,我特别询问的是C.NET 3.5编译器。

    6 回复  |  直到 15 年前
        1
  •  17
  •   Andrew Hare    15 年前

    out关键字 能够 由编译器暗示,但我的理解是C团队决定 out 函数调用方显式要求的关键字,以提高参数性质的可见性。

        2
  •  10
  •   Malfist    15 年前

    编译器确实知道,您可能不知道。这是一种让您知道正在传递的参数可能会在传递给它的函数中发生变化的方法。

        3
  •  6
  •   JaredPar    15 年前

    这与编译器所知道的无关,而是要确保开发人员意识到这个调用可以并且将改变变量x的值。

    这其中有很多根源于C++,其中引用值不需要调用站点监视器。看C++调用是不可能的,并且确切地知道它会做什么。C++中引用和参数传递的参数在语义上有很大的差异。

        4
  •  2
  •   kemiller2002    15 年前

    是的,编译器可以解决这个问题,但是这样您就知道它将修改您正在传入的变量。

    C语言有很多我称之为安全网的东西,它们明确地告诉程序员正在发生的事情。几个例子是:

    1. switch语句中不存在故障。
    2. 不能在if语句中赋值:if(x=5)抛出错误而不是计算为true。
        5
  •  1
  •   nabrond    15 年前

    http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx

    “out关键字导致引用传递参数。这与ref关键字类似,只是ref要求在传递变量之前对其进行初始化。要使用out参数,方法定义和调用方法都必须显式使用out关键字。“

    由于datetime.typarse不需要初始化odate,因此必须传递out关键字。

        6
  •  0
  •   David Thornley    15 年前

    好吧,我不是专家,如果我搞砸了,有人能纠正我吗?

    有两种方法可以将参数传递给C函数:按值和按引用。这里最大的区别是,修改函数内部的参数是否会修改用于调用它的变量。这不是我相信编译器自己决定的事情。

    由于您希望odate是从调用者传入并更改的变量,所以您希望它通过引用传递。

    另一个问题是是否应该初始化它。C喜欢捕捉未初始化时使用变量的情况,因为这几乎总是一个错误。在这种情况下,您可能只需声明要传递的内容,并使用typarse()给它第一个值。这是一种完全合法的技术,因此编译器应该允许这种技术。这是另一件事,我不相信编译器是正确的。(我假设编译器还检查以确保out参数在用于typarse()之前已初始化)。

    所以,“out”有两个目的。它确定参数是通过引用传入的,并且应该在函数内部对其进行初始化。这两者都不能由编译器决定。