问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c# 程序中关于ref 和out 参数问题

发布网友 发布时间:2022-04-07 17:49

我来回答

3个回答

热心网友 时间:2022-04-07 19:19

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 参数,则无法重载这两个方法。但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。

示例:

当希望方法返回多个值时,声明 out 方法很有用。使用 out 参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out 参数返回给调用方法。此示例使用 out 在一个方法调用中返回三个变量。请注意,第三个参数所赋的值为 Null。这样便允许方法有选择地返回值。

class OutReturnExample
{
static void Method(out int i, out string s1, out string s2)
{
i = 44;
s1 = "I''ve been returned";
s2 = null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
// value is now 44
// str1 is now "I''ve been returned"
// str2 is (still) null;
}
}

如果在函数体内不对参数开辟新的内存(即重新实例化),那么用不用out或ref是一样的(string类除外,好像string类的操作更像值类型);如果在函数内部要对参数重新实例化,就需要用ref或out了,因为如果不用ref或out的时候,参数实际上传的是对象引用的一个拷贝(就像c语言里船只真参数实际上也是传的指针的拷贝一样),对原来对象的操作就能对对象进行修改,如果要new一个实例的话,只是这个拷贝指向这块内存,而原来的对象引用还是指向原来的内存空间。况且参数的生存期只在函数体内,出了函数对他分配的内存也应该被回收。

C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

注:在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。

传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

属性不是变量,不能作为 ref 参数传递。

如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。

out

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

属性不是变量,不能作为 out 参数传递。
http://msdn.microsoft.com/zh-cn/library/szasx730.aspx

热心网友 时间:2022-04-07 20:53

不能这么改的 你还是用ref吧 this.x this.y被初始化为0 并且也没改变它的值

不过这里用引用传递也没有什么用处啊

举个例子

void fun(out int val1, ref int val2)
{
val1 = 10;
val2 = 20;
}

void Main()
{
int a = 1, b = 1;
fun(out a, ref b);
// a == 10 成立,b == 20 成立
}

使用out传递参数时 变量不一定要求初始化 但必须在方法体内对参数进行赋值
使用ref则要求先对变量进行初始化

热心网友 时间:2022-04-07 22:45

protected void Page_Load(object sender, EventArgs e)
{
int b;
string a = "wo";
fun(ref a,out b);

}
public void fun(ref string a,out int b)
{
a="ni";
b = 1;
}
上面代码助你理解 执行完fun()后: a ="ni",b=1
但调用fun(ref a,out b)前,b 并没有付初值
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
吃干燥剂会有什么反应 干燥剂不慎食用怎么办 于冕被流放多少时间才回来 石羊场客运站坐几路公汽到成都市龙潭社区保平村九组? 从成都石羊场到龙潭寺北湖客运站做地铁公交咋个赶车呀?老师们_百度知 ... 成都理工大学坐车到石羊场客运站怎么走?大概要多久啊?谢谢!! 请问一下成都理工大学到石羊车站怎么做车啊? 还在盲目护理毛孔吗?如何正确护理毛孔? 毛孔粗大该如何处理? 脸t区毛孔粗大怎么办 毛孔粗大的原因是什么 立定跳远的通讯稿100 帮忙写一篇立定跳远的校运会广播稿。是立定跳远啊!!有特点 描写秋季运动会的立定跳远的句子 美团优选的订单备注是给谁看的 PLC通讯时指令代码是干什么的 关于PLC指令? 立定跳远的投搞这么写啊 我想退掉保险,怎么找不到公众号? 三菱PLC fnc指令什么意思 为什么有些人的美团优选显示补货,有些人的显示菜品 管仲事迹读后感 PLC数据传输指令 立定跳远的技巧。写下来 林汉达中国历史故事集读后感怎么写? 三菱PLC指令{ 管仲鲍叔小白最好的关系是相互成就读后感300? “立定跳远”的英语怎么写? 美团优选怎么一直显示补货? 读了伯牙鼓琴管鲍之交你有什么感悟写下来? 洗衣机调到最高水位都装不满水是什么问题 提交上诉状之后多久才可以接到法院的缴费通知? 上诉后多久交上诉费 法院在收到上诉状后,上诉人必须在几天内缴上诉费? 上诉费用缴纳时间是多久 民事诉讼提交上诉状后多久才可以收到法院的缴费通知? 法院诉讼费用何时交纳? 你还知道哪些动物的逃生方式? 向一审*提交上诉状后没收到缴费通知单没缴费是不是等于还没上诉成功?_百度问一问 动物的逃生方法有哪些 上诉费缴纳时间是什么时候 各种动物怎么逃生 动物的自救的方法有哪些 向*提交上诉状了但还没收到缴费通知单也没缴费,是不是也等于已经提起上诉了? 常见动物的逃生方式。 自收到一审法院开的上诉费票起多少日内交诉讼费? 发生洪水时,动物都是如何逃生的呢? 上诉费什么时候缴纳 民事上诉状邮寄给二审法院,一般上诉人多久才会接到交上诉费的通知 苹果手机对收到的短信如何再次编辑 动物还有那些逃生方法