C#中ref和out到底有什么用?什么时候会用到呢?我浏览了一些资料但都不是很明白。
3个回答
展开全部
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就是转换后的结果。
例如,假如我要交换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的对象是值类型。
用ref可以实现两个目的,第一,方法中的值参数是复制的形式带入的。所以如果传入的参数结构很复杂,数据量很大,而且多次调用这个方法,就会导致内存消耗大。此时用ref,传递的只是指针,而不是整个数据,就可以避免这种消耗。第二,如果希望这个值类型在这个方法中的所有修改和赋值都保留,就需要用ref。
out的用法,我经常用在一个方法返回多个类型的数据时。
例如string GetStr(string input, out int i)。这个方法最后返回了一个string,还抛出了一个int的值。
纯个人理解。希望能看懂我的意思。
用ref可以实现两个目的,第一,方法中的值参数是复制的形式带入的。所以如果传入的参数结构很复杂,数据量很大,而且多次调用这个方法,就会导致内存消耗大。此时用ref,传递的只是指针,而不是整个数据,就可以避免这种消耗。第二,如果希望这个值类型在这个方法中的所有修改和赋值都保留,就需要用ref。
out的用法,我经常用在一个方法返回多个类型的数据时。
例如string GetStr(string input, out int i)。这个方法最后返回了一个string,还抛出了一个int的值。
纯个人理解。希望能看懂我的意思。
追问
您的解释其他地方我能理解,有一个地方有些疑问:在这个方法中的所有修改和赋值都保留,是什么意思?我传递参数运行程序,怎么将参数值的改变能保留?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
}
{
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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询