<out()>属性。有用的用途是什么?</out()>

时间:2011-01-24 11:29:26

标签: .net vb.net attributes output-parameter

System.Runtime.InteropServices下,<Out()>属性存在。 但这是为了什么?如果您能使用以下示例作为答案的基础,我将很高兴。

 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub

5 个答案:

答案 0 :(得分:7)

该属性的目的有两个:

  • 呼叫站点处理,是否强制执行变量初始化
  • 编组

如果要从C#或具有类似语义的类似语言调用该方法,编译器将知道这样的参数不需要初始值。

换句话说,你可以这样做:

int a;
CallSomeMethodWithOutParameter(out a);

并且编译器知道在进行调用之前无需确保a已经有值。

另一方面,如果没有该属性,则需要以下内容,再次使用C#:

int a = 0;                               // <-- notice initialization here
CallSomeMethodWithOutParameter(ref a);   // <-- and ref here

另一个目的是将方法调用编组到不同的调用上下文中,例如通过P / Invoke,到另一个应用程序域或Web服务,以通知编组例程有问题的参数将在方法返回时包含一个值,但在调用它时不需要将任何值传递给方法。

当参数和返回值需要打包并传输到实际呼叫所经过的远程位置时,这可能会有所不同。

换句话说,如果要在通过P / Invoke使用的方法调用上指定它,当方法调用时,不会对现有参数值进行编组,但是当方法返回将其值提升回您的调用代码。

请注意,此优化取决于要使用的编组例程,这些是实现细节。该属性只是告诉例程它可以做哪些参数,它不是一个始终遵循的指令。

答案 1 :(得分:3)

这意味着参数被C#视为“out”参数。在这种情况下,C#编译器将假设:

  • 通过引用传递的变量的任何现有值都是无关紧要的,因此明确的赋值无关紧要
  • 变量 在方法返回时被赋予适当的值,除非有异常 - 所以它在语句的末尾明确赋值。

其他语言当然可以选择以不同的方式使用[Out]属性,但这种解释是最自然的。基本上它说参数几乎就像一个额外的返回值。 (当然,有很多不同之处,不同程度的微妙,但这是一个out参数的一般感觉。)

答案 2 :(得分:2)

它在ComVisible类型中用于指示生成的COM类型库应该使用[out]属性修饰参数。

答案 3 :(得分:0)

我不了解VB,但假设它等同于C#的out关键字:

它的行为与ref类似,但不要求调用者初始化传递给out参数的变量,因为该函数不会读取它。

如果使用COM oder p-invoke,它可能会对编组产生影响。

答案 4 :(得分:0)

当应用于方法参数和返回值时,此属性控制编组方向,因此它被称为方向属性。 [OutAttribute]告诉CLR在返回时从被叫方回调给回叫者。调用者和被调用者都可以是非托管代码或托管代码。例如,在P / Invoke调用中,托管代码调用非托管代码。但是,在反向P / Invoke中,非托管代码可以通过函数指针调用托管代码。

有些情况会忽略[OutAttribute]。例如,[OutAttribute]int没有任何意义,因此CLR会忽略[OutAttribute]。 <{1}}字符串也是如此,因为字符串是不可变的。

因此,对于您的示例,此属性没有意义。有关此属性和相关[OutAttribute]属性的更多信息,您可以找到here