黑马程序员技术交流社区
标题:
out和ref有什么区别,在用法上?
[打印本页]
作者:
庞海瑞
时间:
2013-8-12 19:39
标题:
out和ref有什么区别,在用法上?
out和ref有什么区别,在用法上?
作者:
许庭洲
时间:
2013-8-12 20:22
1. ref必须先初始化;
2. out则是内部为外部赋值,不需要初始化,如果外部初始化了也没用;
3. ref应用场景内部对外部的值进行改变;
4. out则是内部为外部变量赋值。
作者:
张松
时间:
2013-8-12 20:58
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:
ref
可以把参数的数值传递进函数,ref参数要求在方法外必须赋值,但是
out
是要把参数清空,就是说你无法把一个数值从
out
传递进去的,
out
进去后,参数的数值为空,所以方法内必须为out参数赋值。这个就是两个的区别,或者说
ref
是有进有出,
out
是只出不进.
out实例:
static void Main(string[] args)
{
//请用户输入用户名和密码 写一个方法判断用户是否登录成功 并且返回登录信息
Console.WriteLine("请输入用户名");
string strName = Console.ReadLine();
Console.WriteLine("请输入密码");
string strPwd = Console.ReadLine();
string str;
bool b = IsLogin(strName, strPwd, out str);
Console.WriteLine("登录结果{0}",b);
Console.WriteLine("登录信息{0}",str);
Console.ReadKey();
//out参数 的作用就是返回多个值 在方法内必须为out参数赋值
}
public static bool IsLogin(string name, string pwd,out string msg)//在多余返回值的前面标记out
{
bool b = false;
if(name=="admin"&&pwd=="admin")
{
b = true;
msg = "登录成功";
}
else if (name == "admin")
{
msg = "密码错误";
}
else if (pwd == "admin")
{
msg = "用户名错误";
}
else
{
msg = "未知错我";
}
return b;
}
ref实例:
static void Main(string[] args)
{
int n1 = 10;
int n2 = 20;
Change(ref n1,ref n2);//ref 参数 侧重于将值带入一个方法中,再将值从这个方法中带出 ref参数要求在方法外必须赋值
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.ReadKey();
}
public static void Change(ref int number1, ref int number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
}
作者:
熊丽
时间:
2013-8-12 21:01
使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化
首先:两者都是按地址传递的,使用后都将改变原来的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。即,ref是有进有出,out是只出不进。
Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。
作者:
高文咪
时间:
2013-8-12 21:37
它们的区别是:
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与out的代码:
static void Main(string[] args)
{
int m = 0;
Console.WriteLine(RefValue(1, ref m).ToString());
Console.WriteLine(m.ToString());
int j = 0;
Console.WriteLine(OutValue(1, out j).ToString());
Console.WriteLine(j.ToString());
Console.ReadLine();
}
public static int RefValue(int i, ref int j)
{
int k = j;
j = 10;
return i + k;
}
public static int OutValue(int i, out int j)
{
j = 10;
return i + j;
}
复制代码
作者:
brucel50
时间:
2013-8-15 15:14
using System;
namespace Que
{
class Program
{
static void Main(string[] args)
{
int i1 = 2;
int i2 = 3;
ChangeNum(ref i1,ref i2);
Console.WriteLine("i1 = {0},i2 = {1}",i1,i2);
Console.ReadKey();
}
//交换两个变量
static void ChangeNum(ref int i1,ref int i2)
{
i1 = i1 + i2;
i2 = i1 - i2;
i1 = i1 - i2;
}
}
}1.ref是引用传递
复制代码
输出i1 = 3,i2 = 2
2.out 是从方法中给调用方法前后的变量赋一个值
using System;
namespace Out
{
class Program
{
static void Main(string[] args)
{
int i1;
int i2 = 2;
Outusing(i2,out i1);
Console.WriteLine("i1为out出来的,值是{0}",i1);
Console.ReadKey();
}
//交换两个变量
static void Outusing(int i,out int iout)
{
iout = i*5;
}
}
}
//结果是:i1为out出来的,值是10
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2