Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 这个<;Out()>;属性它有什么有用的用途?_.net_Vb.net_Attributes_Output Parameter - Fatal编程技术网

.net 这个<;Out()>;属性它有什么有用的用途?

.net 这个<;Out()>;属性它有什么有用的用途?,.net,vb.net,attributes,output-parameter,.net,Vb.net,Attributes,Output Parameter,在System.Runtime.InteropServices下,存在属性。 但这是为了什么?如果你能用下面的例子作为回答的基础,我会很高兴 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer) Result = x + y End Sub Shared Sub Add(ByVal x为整数,ByVal y为整数,ByRef Result为整数) 结果=

System.Runtime.InteropServices
下,存在
属性。 但这是为了什么?如果你能用下面的例子作为回答的基础,我会很高兴

 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub
Shared Sub Add(ByVal x为整数,ByVal y为整数,ByRef Result为整数)
结果=x+y
端接头

我不知道VB,但假设它相当于C#的
out
关键字:

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


如果您使用COM-order p-invoke,它可能会对封送处理产生影响。

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

  • 通过引用传递的变量的任何现有值都是无关的,所以明确的赋值并不重要
  • 除非有异常,否则在方法返回时,变量将被分配一个适当的值——因此它肯定是在语句末尾被分配的

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

该属性的目的有两个:

  • 调用站点处理,无论是否强制变量初始化
  • 编组
如果要从C#或具有类似语义的类似语言调用该方法,编译器将知道这样的参数不需要初始值

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

int a;
CallSomeMethodWithOutParameter(out a);
编译器知道,在进行调用之前,不需要确保
a
已经有值

另一方面,如果没有该属性,同样在C#中需要以下内容:


int a=0;// 它在ComVisible类型中用于指示生成的COM类型库应使用[out]属性修饰参数。

当应用于方法参数和返回值时,此属性控制封送方向,因此称为定向属性<代码>[OutAttribute]
告诉CLR在返回时从被调用方封送回调用方。调用方和被调用方都可以是非托管代码或托管代码。例如,在P/Invoke调用中,托管代码正在调用非托管代码。然而,在反向P/Invoke中,非托管代码可以通过函数指针调用托管代码

在某些情况下,
[OutAttribute]
将被忽略。例如,
[OutAttribute]int
没有任何意义,因此
[OutAttribute]
被CLR忽略。这同样适用于
[OutAttribute]
字符串,因为字符串是不可变的


因此,对于您的示例,该属性没有意义。关于这个属性和相关的
属性的更多信息,您可以找到。

这对C来说不是很重要吗?如果它要编译相关的代码的话?呼叫站点上的“ref”和“out”是否相同不要紧:)实际上,它的意思是,如果在调用相关例程之前可能没有编写变量,编译器将默默地插入代码来初始化保存变量的存储位置,而不是抱怨它(无法保证这些代码将被放置在何处;也无法保证离开并重新进入作用域的变量在未重新初始化的情况下不会继续使用相同的存储位置)。编译器不能真的假设变量是编写的,因为它不能确定被调用的例程是否真的编写了它。@supercat:这取决于我们考虑问题的级别。“检查源代码是否有效”级别确实假设变量是编写的。“发出IL”级别没有-尽管针对不同平台的不同实现可能能够。
int a = 0;                               // <-- notice initialization here
CallSomeMethodWithOutParameter(ref a);   // <-- and ref here