① c#中ref到底有什么作用.
其实,你也不用理解得多复杂!你只要知道,如果用上ref的话,操作的是同一个变量,所以会改变值,如果没用上ref的话,操作的不是同一个变量,所以值不会改变。这就行了!其他的,以后学得深入了,你就会懂了!现在弄这些问题,只会令你学得很痛苦的!只不过用ref的话,调用的参数要在调用前就要初始化,初始化,你懂吧?就是赋值!
② C#中out和ref之间的区别
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。
对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。
总结起来,他们有如下语法区别:
1、ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//语法错误
SomeMethod( out i );//通过
2、ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
int j=i;//通过
//...
}
public void SomeMethod(out int i)
{
int j=i;//语法错误
}
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。
ref在参数传递之前必须初始化;而out则在传递前不必初始化,且在 ... 值类型与引用类型之间的转换过程称为装箱与拆箱。
总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。
下面谈谈ref和out到底有什么区别:
1 关于重载
原则:有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载
2 关于调用前初始值
原则:ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将提示:使用了未赋值的局部变量;
out作为参数的函数在调用前,实参可以不赋初始值。
3 关于在函数内,引入的参数初始值问题
原则:在被调用函数内,out引入的参数在返回前至少赋值一次,否则编译器将提示:使用了未赋值的out参数;
在被调用函数内,ref引入的参数在返回前不必为其赋初值。
总结:C#中的ref和out提供了值类型按引用进行传递的解决方案,当然引用类型也可以用ref和out修饰,但这样已经失去了意义。因为引用数据类型本来就是传递的引用本身而非值的拷贝。ref和out关键字将告诉编译器,现在传递的是参数的地址而不是参数本身,这和引用类型默认的传递方式是一样的。同时,编译器不允许out和ref之间构成重载,又充分说明out和ref的区别仅是编译器角度的,他们生成的IL代码是一样的。有人或许疑问,和我刚开始学习的时候一样的疑惑:值类型在托管堆中不会分配内存,为什么可以按地址进行传递呢?值类型虽然活在线程的堆栈中,它本身代表的就是数据本身(而区别于引用数据类型本身不代表数据而是指向一个内存引用),但是值类型也有它自己的地址,即指针,现在用ref和out修饰后,传递的就是这个指针,所以可以实现修改后a,b的值真正的交换。这就是ref和out给我们带来的好处。
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
ref(C# 参考)
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
例如:
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。
尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
class CS0663_Example
{
// Compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
}
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
out(C# 参考)
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
例如:
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { }
}
③ c#中的void和ref到底代表了什么意思,什么时候使用
一、void 是C#中“无返回值函数"的定义。
eg.
publicvoidHello()
{
//sayhellohere
}
publicstringHello()
{
return"Hello";
}
你可以看到,两个都是C#中的函数, 用void声明的函数体不需要有返回值,而用类型声明的函数体必须有对应类型的返回值(return ),否则编译器会报错。
二、ref关键字是用来定义引用变量传递的。
C#中的类型分为值类型 和 引用类型。我举个简单例子。
voidMain()
{
inta=1;
Sum(a);
a=?//运行到这里时a等于几?
}
publicvoidSum(inta)
{
a=a+1;
}
这个void 中,传入了a,然后对其+1; 但是如果只是这么写 运行完Sum(a)之后, a还是=1。
因为在Void Main方法里, a = 1; 但是他把a传递给Sum(a)方法时,是传递的一个值进去,对于Main()方法来说,传完之后就不再关注这个变量了,所以 a还是一直等于1。
但是将Sum方法改为:
publicvoidSum(refinta)
{
a=a+1;
}
ref int a 就是告诉编译器, 这个int类型的变量a,是做引用传递的。
如果再用Main()调用Sum方法时, 运行之后 a = 2;
④ c#编程中关键字"ref"在什么时候使用是在定义函数之后没有设定返回值的时候使用吗它的作用
还是以例子来说明吧;
1. ref:
int i =0;
有函数fun(ref i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下两段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(1)的输出是1,(2)的输出是3,
2. out:
int i; //注意,这里只是声明了变量i,并没有对其初始化
有函数fun(ref i)、fun(out i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下三段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString());
(1)和(2)在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“i”
而(3)能正常编译,而且输出3
对于你的问题,的确,ref和out跟C/C++中的指针很类似,但是ref和out还是有区别的,主要就是在于ref应用的场合是已经有了一个变量了,想在另外一个函数里头对其进行修改,这时只能用ref,out的话适用于函数想返回多个值的时候,比如一个函数做某个运算,结果是一个int,但是无论函数运行成功或失败,它都会返回一个int,但我们在调用的时候还想知道函数的执行是否成功了,这个时候就可以用一个这样的函数:int i; bool fun(out i); 通过fun函数返回的bool值可以知道函数执行是否成功,然后通过out的i我们可以知道函数运算得出的结果,因此一般情况out主要用于一个函数返回多个返回值的时候。
最后总结一下:
Ref和Out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。稍有不同之处是:
使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化。
使用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。
⑤ REF是什么意思
REF是Reference的缩写,为参考尺寸的意思。
参考尺寸依ASME Y14.5上的定义是:在别处已有标示的尺寸,为了看图人的方便,在其他位置重复标示的尺寸。可以由现有尺寸计算出来的尺寸,但也是为了看图人的方便,而标示的尺寸。参考尺寸是不可量测的。
(5)ref关键字用于告诉编译器扩展阅读:
尺寸标注基本规则:
1、机件的真实大小应以图样上所注的尺寸数值为依据,与图形的大小及绘图的准确度无关。
2、尺寸,以毫米为单位时,不需标注计量单位的代号或名称,如采用其他单位,则必须注明相应的计量单位的代号或名称。
3、机件的每一尺寸,一般只标注一次,并应标注在反映该结构最清晰的图形上。
⑥ c# ref和out区别仅仅是参数需不需要初始化
ref和out使用时的区别是:
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
⑦ 在c#中Ref关键字的作用是啥
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。 若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。 传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。 属性不是变量,不能作为 ref 参数传递。
⑧ ref是什么意思
REF是Reference的缩写,为参考尺寸的意思。同时也指一个识别系统,也是计算机程序中的一个关键字,瑞士的一个公司名。
参考尺寸依ASME Y14.5上的定义是:在别处已有标示的尺寸,为了看图人的方便,在其他位置重复标示的尺寸。可以由现有尺寸计算出来的尺寸,但也是为了看图人的方便,而标示的尺寸。参考尺寸是不可量测的。
1、ref关键字:让参数按照引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中;也等同将值类型的数据使用引用方式传参。
2、若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。
3、传递到ref参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。尽管ref和out在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用ref参数,而另一个方法采用out 参数,则无法重载这两个方法。
⑨ C#中关键字ref的作用是什么
一般ref被用来传参数的。
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。
ref 参数的值被传递到 ref 参数。 传递到 ref 参数的参数必须最先初始化。
将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。 属性不是变量,不能作为 ref 参数传递。