永发信息网

C#中ref和out到底有什么用?什么时候会用到呢?我浏览了一些资料但都不是很明白。

答案:3  悬赏:20  手机版
解决时间 2021-02-17 19:45
C#中ref和out到底有什么用?什么时候会用到呢?我浏览了一些资料但都不是很明白。
最佳答案
ref表示参数传递时按引用传递。
例如,假如我要交换2个数。
void Swap(int a,int b) { int t=a; a=b; b=t; } 这样并不能完成交换。因为参数传递时默认按值来的。
改成void Swap(ref int a,ref int b) { int t=a; a=b; b=t; } 调用时:int a=3,b=5; Swap(ref a,ref b);
然后a,b的值就被交换了。
out表示参数是传出的。一般是用作函数返回多个值时使用。
例如:Int32的TryParse函数,它用作把一个对象转化为Int32类型。
string s="123"; Int32 a; bool canParse=Int32.TryParse(s,out a);
也就是说TryParse实际有2个返回值,一个在canParse里,是一个bool值,表示是否能够转换。
另一个返回值在a里,如果能转换,a就是转换后的结果。追问void Swap(int a,int b) { int t=a; a=b; b=t; } 不能完成交换?平时写代码不都是这样写么?
void Swap(ref int a,ref int b) { int t=a; a=b; b=t; } int a=3,b=5; Swap(ref a,ref b);
参数传递时按什么传递啊?不是值吗?追答默认是值啊。ref改成引用传递。
你可以试试:
using System;
class Program
{
static void Swap(int a,int b) { int t=a;a=b;b=t; }
static void Main() { int a=3,b=5; Swap(a,b); Console.WriteLine("a={0} b={1}",a,b); }
}
改成引用传递后:
using System;
class Program
{
static void Swap(ref int a,ref int b) { int t=a;a=b;b=t; }
static void Main() { int a=3,b=5; Swap(ref a,ref b); Console.WriteLine("a={0} b={1}",a,b); }
}
你就可以看到a,b的值有没有交换了。
前者是按值传递,实际交换了的,是形参的值,而不是实参。
后者按引用传递,实际交换了的,就是实参的值。追问那在我们编程需求中,交换值也可以不用这种方法吧。那么ref和out在什么时候必须用?也就是不用它们就解决不了问题。追答交换值确实可以不用这种作法,把函数体直接写在要交换的地方也可以,但是这样代码中会出现很多类似于int t=a; a=b; b=t;这样的代码,这样的编码风格很烂的。
ref和out都只用在函数的参数中,当一个函数要改变传入的参数时用ref来修饰参数。当一个函数要返回多个值时用out。并且返回值作为参数返回。
全部回答
class Program
{
static void Main(string[] args)
{
int testNum = 100;
Operation(testNum);
//屏幕输出100,表示方法Operation内部对testNum的操作没有影响到testNum的值
Console.WriteLine("testNum的值:"+testNum);
int num1=200;
OtherOpearation(ref num1);
//屏幕输出10000,表示方法OtherOpearation内部对num1的操作影响到了num1值。跟引用类型相同
Console.WriteLine("num1的值:"+num1);
int num2;
//自己去测试结果吧,ref和out的区别我认为就是一个需要初始化,一个不需要。类似这两个方法可以使用ref和out修饰参数在void返回类型的情况下得到你想要的返回值
TheOtherOperation(out num2);
Console.WriteLine("num2的值:"+num2);
}
static void TheOtherOperation(out int result)
{
result = 25000;
}
static void OtherOpearation(ref int result)
{
result = 10000;
}
static void Operation(int result)
{
result = 250;
}
}
实际应用的时候,ref的对象是值类型。
用ref可以实现两个目的,第一,方法中的值参数是复制的形式带入的。所以如果传入的参数结构很复杂,数据量很大,而且多次调用这个方法,就会导致内存消耗大。此时用ref,传递的只是指针,而不是整个数据,就可以避免这种消耗。第二,如果希望这个值类型在这个方法中的所有修改和赋值都保留,就需要用ref。
out的用法,我经常用在一个方法返回多个类型的数据时。
例如string GetStr(string input, out int i)。这个方法最后返回了一个string,还抛出了一个int的值。
纯个人理解。希望能看懂我的意思。追问您的解释其他地方我能理解,有一个地方有些疑问:在这个方法中的所有修改和赋值都保留,是什么意思?我传递参数运行程序,怎么将参数值的改变能保留?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我爸爸今年72岁,应该是哪一年出生?
家里微波炉好长一段时间没用,昨儿一启动这玩
以天空像什么造句子
葫芦侠我的世界怎么当审核员?
陶渊明《归园田居》中“方宅十余亩,。 ,桃
三桥半挂车为什么刹车不同步?
武术弟子的区分有几种
日本有个电影满恶心的,就两个女的在一起的,
粤语:系甘捞野 是什么意思
该怎样进行java学习?
鱼漂有营养价值吗?
指令脉冲P输入是什么?
海鲜怎么发说说
荷花世界里有什么花
单选题下面句子中加粗词含贬义的一项是A.今已
推荐资讯
五分之二➗4表示把五分之二平均分成(
火线魔盒好还是cf百宝箱好,快
微博有很多博主发一些,名人住所和著名建筑的
15天疯狂运动减20斤!!!!!!!!!
qq空间页面怎么落花下来
手机屏幕与钢化膜之间有几个灰尘对屏幕有没有
肾阳虚证一般不出现的临床表现是A.小便频数B.
农村干部可以兼职辅警吗
为使后勤人员的考核更全面,应采般的做法是(
医路康大药房马超药店怎么去啊,有知道地址的
一根头发上突然由粗变细是怎么回事?
潍城区于河街道东毕村卫生室在什么地方啊,我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?