C#之out与ref的共性与区别以及用法
引入:
首先看一个例子:
class Program
{
static void Main(string[] args)
{
int number = ;
int result = Test(number);
Console.WriteLine("number={0},result={1}", number, result);
Console.ReadKey();
} static int Test(int a)
{
a = ;
return a;
}
}
此时,显然得到number=10,a=20;把number传给方法Test中的a,在方法number中改变a的值,number的值并不会发生改变。
然后我们做如下改变
class Program
{
static void Main(string[] args)
{
int number;
int result = Test(number);//此处会报错“使用了未赋值的局部变量‘number’”
Console.WriteLine("number={0},result={1}", number, result);
Console.ReadKey();
} static int Test(int a)
{
a = 20;
return a;
}
}
显然变量没有赋值就使用是错误的
现在我们使用out代码如下:
class Program
{
static void Main(string[] args)
{
int number;
int result = Test(out number);//注意调用时也需要加out
Console.WriteLine("number={0},result={1}", number, result);
Console.ReadKey();
}
static int Test(out int a)
{
a = 20;//若方法中参数标有out,一定对a先进行赋值才可以使用。
return a;
}
}
此时结果为number=20,result=20;一旦使用out,a就不是往方法里传值而是往外返回值。
不再是把number的值赋给a了,而是把number与a建立起一种联系,在方法Test中必须对a进行赋值,对a进行赋值后就相当于对number进行赋值(即把number的引用传递给a)
out总结:
1.在方法的参数前加out,那么在传参数的时候也必须在参数前使用out,以表明此参数并不是用来传入而是用来传出值的。
2.如果参数是以out形式传入的,那么在传入不能对其进行赋值。
3.在方法中对于用out修饰的参数,必须对其赋值,且必须在其使用前进行赋值。
ref:
class Program
{
static void Main(string[] args)
{
int number = 10;
int result = Test(ref number);//注意调用时也需要加ref
Console.WriteLine("number={0},result={1}", number, result);
Console.ReadKey();
}
static int Test(ref int a)
{
int b = a;
a=20;
return b;
}
}
此时结果为:number=20,result=10;此时把number的值传入了方法Test,并且变量b使用了,然后对a进行赋值20,并且传了出去。
即ref既可以传入参数也可以传出参数。
总结ref与out
out用于传入值,ref是双向的既可以传入又可以传出。(其原理为引用类型传递与值类型传递,不使用out与ref时为值类型传递,使用时为引用类型传递)
在传参数的过程中如果有ref与out修饰,那么改变方法中参数变量的值,也会改变使用者方法中变量的值。
out的使用实例
1.微软提供了一个int类型的方法
int.TryParse(string s,out int result)
首先解释一下这个方法
该方法的返回值为bool型。即转换成功返回true,转换失败返回false;同时转换成功会返回一个result,result的值即为转换后的值,转换失败result则为null
下面我们自己写一个方法实现这个功能
class Program
{
static void Main(string[] args)
{
string s = "123";
int result;
if (ConvertInt(s, out result))
{
Console.WriteLine("转换成功" + result);
}
else
{
Console.WriteLine("转换失败!");
}
Console.ReadKey();
}
static bool ConvertInt(string s,out int result)
{
try
{
result = Convert.ToInt32(s);
return true;
}
catch {
result = 0;//注意此处,必须对out修饰的参数result赋值
return false;
}
}
}
可在需要返回多个值时使用out与ref。
可以使用如下实例练手!
对一个数组元素求和并返回和与数组元素的最大值和最小值
C#之out与ref的共性与区别以及用法的更多相关文章
- out, ref 和 params 的区别和用法
1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...
- ref和out的区别,值类型和引用类型的使用
今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0 ...
- ref和out的区别?
ref 和out的区别在面试中会常问到: 首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传 ...
- ref和out的区别
ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...
- 浅谈C#中ref与out的区别
在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和 ...
- C#中的ref和out的区别
转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递 ...
- 关于ref与out的区别
写在最前面 这几天一直在公司接受培训,都是一些基础的知识,同时也乘着这个机会巩固一下自己的基础,基础太重要了.前些时一直看的是多线程方面的知识,接下来我会写一些其他方面的知识,毕竟作为一个实习新人得和 ...
- C#中ref和out的区别浅析
这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通 ...
- 参数修饰符ref,out ,params的区别
参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...
随机推荐
- CUICatalog: Invalid asset name supplied: (null)
出现这个问题的根本原因是你调用了[UIImage imageNamed:name]这个方法 但是name = nil;所以报出该错误. 解决方法,在项目中搜索[UIImage imageNamed ...
- SQL Server自定义函数( 转载于51CTO )
用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...
- onchar
void CMfcView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)//Windows响应函数 { // TODO: Add your messag ...
- scrapy1.1入门用例简介-2
写一个小的scrapy project,爬取相关网页内容并保存为.json文件 0.创建project,genspider等. 1.修改items.py,内容如下: 2.修改dmoz.py,内容如下: ...
- mysql优化 - mysql 的 hint
FORCE INDEX 强制索引 只使用建立在field1上的索引,而不使用其它字段上的索引. SELECT * FROM table1 FORCE INDEX (field1) IGNORE IND ...
- c++学习笔记和思考
1.内置类型:int float等编程语言自己定义的类型 类类型:自己声明的类,即是对对象的抽象 2.const double *cp 表示cp是指向一个const类型double类型数据的指针,而非 ...
- sqoop组件运行出错问题解决--com.mysql.jdbc.Driver
sqoop list-tables --connect jdbc:mysql://192.168.11.94:3306/huochetoudalian --username xxx -password ...
- XJOI网上同步测试DAY14 T2
思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...
- 认识Android
安卓的特点开放性平等性无界性方便性硬件的丰富性 Android操作系统之中,一共将体系结构划分为四层:应用层(Application).应用框架层(Application Framework).系统运 ...
- Altium Designer 蛇行等长布线
一. 设置需要等长的网络组 点击主菜单 Design --> Classes,在弹出的窗口中单击 Net Classes,并右键,点 Add Class 会增加一个 New Class,在该网络 ...