二者都是按地点通报的,运用后都将转变本来参数的数值。
ref能够把参数的数值通报进函数,然则out是要把参数清空,就是说你没法把一个数值从out通报进去的,out进去后,参数的数值为空,所以你必需初始化一次。这个就是两个的区分,或者说就像有的网友说的,ref是有进有出,out是只出不进。
ref(C# 参考)
ref 关键字使参数按援用通报。其结果是,当掌握权通报回挪用要领时,在要领中对参数的任何变动都将反映在该变量中。若要运用 ref 参数,则要领定义和挪用要领都必需显式运用 ref 关键字。
比方:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
通报到 ref 参数的参数必需最早初始化。这与 out 差别,后者的参数在通报之前不须要显式初始化。
只管 ref 和 out 在运行时的处理方式差别,但在编译时的处理方式雷同。因而,假如一个要领采纳 ref 参数,而另一个要领采纳 out 参数,则没法重载这两个要领。比方,从编译的角度来看,以下代码中的两个要领是完全雷同的,因而将不会编译以下代码:
1 2 3 4 5 6 7 |
|
然则,假如一个要领采纳 ref 或 out 参数,而另一个要领不采纳这两个参数,则能够举行重载,以下例所示:
1 2 3 4 5 |
|
out(C# 参考)
out 关键字会致使参数经由过程援用来通报。这与 ref 关键字类似,差别之处在于 ref 请求变量必需在通报之前举行初始化。若要运用 out 参数,要领定义和挪用要领都必需显式运用out 关键字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
只管作为 out 参数通报的变量没必要在通报之前举行初始化,但须要挪用要领以便在要领返回之前赋值。
ref 和 out 关键字在运行时的处理方式差别,但在编译时的处理方式雷同。因而,假如一个要领采纳 ref 参数,而另一个要领采纳 out 参数,则没法重载这两个要领。比方,从编译的角度来看,以下代码中的两个要领是完全雷同的,因而将不会编译以下代码:
1 2 3 4 5 6 7 |
|
然则,假如一个要领采纳 ref 或 out 参数,而另一个要领不采纳这两类参数,则能够举行重载,以下所示:
1 2 3 4 5 |
|
以下是本人依据履历整理出来的:
区分
ref和out的区分在C# 中,既能够经由过程值也能够经由过程援用通报参数。经由过程援用通报参数许可函数成员变动参数的值,并坚持该变动。若要经由过程援用通报参数, 可运用ref或out关键字。ref和out这两个关键字都能够供应类似的功能,其作用也很像C中的指针变量。它们的区分是:
1、运用ref型参数时,传入的参数必需先被初始化。对out而言,必需在要领中对其完成初始化。
2、运用ref和out时,在要领的参数和实行要领时,都要加Ref或Out关键字。以满足婚配。
3、out合适用在须要retrun多个返回值的处所,而ref则用在须要被挪用的要领修正挪用者的援用的时刻。
要领参数上的 out 要领参数关键字使要领援用通报到要领的同一个变量。当掌握通报回挪用要领时,在要领中对参数所做的任何变动都将反映在该变量中。
当愿望要领返回多个值时,声明 out 要领异常有效。运用 out 参数的要领依然能够返回一个值。一个要领能够有一个以上的 out 参数。
若要运用 out 参数,必需将参数作为 out 参数显式通报到要领。out 参数的值不会通报到 out 参数。
没必要初始化作为 out 参数通报的变量。但是,必需在要领返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数通报。
总之用一句话归纳综合就是:ref是有进有出,而out是只出不进。
相干文章:
【c#教程】C# 数据类型
经由过程静态局部变量看C,C++,C#,Java,PHP的特性
以上就是怎样对待C#中的out和ref?讨论它们之间的区分的细致内容,更多请关注ki4网别的相干文章!