引入:

首先看一个例子:

     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的共性与区别以及用法的更多相关文章

  1. out, ref 和 params 的区别和用法

    1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...

  2. ref和out的区别,值类型和引用类型的使用

    今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0 ...

  3. ref和out的区别?

    ref 和out的区别在面试中会常问到: 首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传 ...

  4. ref和out的区别

    ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...

  5. 浅谈C#中ref与out的区别

    在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和 ...

  6. C#中的ref和out的区别

    转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递 ...

  7. 关于ref与out的区别

    写在最前面 这几天一直在公司接受培训,都是一些基础的知识,同时也乘着这个机会巩固一下自己的基础,基础太重要了.前些时一直看的是多线程方面的知识,接下来我会写一些其他方面的知识,毕竟作为一个实习新人得和 ...

  8. C#中ref和out的区别浅析

    这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下   在C#中通过使用方法来获取返回值时,通 ...

  9. 参数修饰符ref,out ,params的区别

    参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...

随机推荐

  1. XIB自定义视图的整理

    - (void)setAppInfo:(AppInfo *)appInfo { _appInfo = appInfo; _icon.image = appInfo.image; _label.text ...

  2. 使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能

    MVC中有一点非常闪瞎人眼的功能就是,可以根据Model与View视图来直接将页面也数据模型进行绑定,那么我们在想客户端发送页面时不需要进行各种控件赋值,不需要操心怎么渲染,当客户提交表单给服务器时也 ...

  3. windows Server 2003修改远程连接限制

    调整最大远程连接数: 1.开始->控制面板->添加或删除程序->添加/删除windows组件->选择“终端服务器”进行安装. 2.开始->运行->gpedit.ms ...

  4. 1.3.1 switch 语句中的 String

    switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...

  5. 《python基础教程》笔记之 基础知识

    数字相关 在Python程序前加上 from __future__ import division 或者在解释器里面直接执行它,或者通过命令行运行Python时使用命令开关-Qnew,会使单斜线不再整 ...

  6. Python3 如何优雅地使用正则表达式(详解七)

    常见问题 正则表达式是一个非常强大的工具,但在有些时候它并不能直观地按照你的意愿来运行.本篇我们将指出一些最常见的错误. 使用字符串方法 有时使用 re 模块是个错误!如果你匹配一个固定的字符串或者单 ...

  7. webpy,希望能多了解一些关于WSGI,PYTHON的WEB开发框架的事,也希望能进一步了解PYTHON

    如果能真正看懂源代码,那就强了. 几年了,不应该总是小搞小打的. [Python]Webpy 源码学习(一) http://diaocow.iteye.com/blog/1922760 学习线路: 那 ...

  8. SSL 证书申请(居然还可以在淘宝上购买)

    免费的目前有 2 个国内的:免费SSL证书申请国外的:StartSSL™ Certificates & Public Key Infrastructure 备注:其实,国内的这家的根证书,也是 ...

  9. qt-solutions提供了8个开源项目

    其实这是官方提供的源代码,至于为什么会另建项目,而没有整合到QT项目里去,我猜可能有2个原因: 1. 这几个项目本身不完善,并且也不是QT项目的核心,因此没有必要花精力去完善 2. 一定程度上可以维护 ...

  10. 检测客户端显示器分辨率、浏览器类型和客户端IP

    原文:检测客户端显示器分辨率.浏览器类型和客户端IP 下面的代码实现了检测客户端显示器分辨率.浏览器类型和客户端IP的功能.你可以把客户端信息保存到Session,ViewState等中以便在其它的页 ...