在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
答案 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。