c#中out和ref的使用区别 [转]
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
如果你想返回多个值怎么办,OUT....
区别可以参看下面的代码:
using system;
class testapp
{
static void outtest(out int x, out int y)
{//离开这个函数前,必须对x和y赋值,否则会报错。
//y = x;
//上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
x = 1;
y = 2;
}
static void reftest(ref int x, ref int y)
{
x = 1;
y = x;
}
public static void main()
{
//out test
int a,b;
//out使用前,变量可以不赋值
outtest(out a, out b);
console.writeline("a={0};b={1}",a,b);
int c=11,d=22;
outtest(out c, out d);
console.writeline("c={0};d={1}",c,d);
//ref test
int m,n;
//reftest(ref m, ref n);
//上面这行会出错,ref使用前,变量必须赋值
int o=11,p=22;
reftest(ref o, ref p);
console.writeline("o={0};p={1}",o,p);
}
}
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结起来,他们有如下语法区别:
1、ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//语法错误
SomeMethod( out i );//通过
2、ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
int j=i;//通过
//...
}
public void SomeMethod(out int i)
{
int j=i;//语法错误
}
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。
总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要赋一个值。也就是说函数承担初始化这个变量的责任。
转自:http://www.cnblogs.com/xuezheng/archive/2007/08/20/862769.html
转载于:https://www.cnblogs.com/guodapeng/archive/2007/09/23/903543.html
c#中out和ref的使用区别 [转]相关推荐
- C#中out和ref之间的区别【转】
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- C#中out和ref使用的区别
看了网上许多关于out和ref关键字的使用介绍,自己为了方便记住,稍微简略总结了下两者的区别: a. 赋值: (1)ref要求变量使用前必须先赋值(2)out不必要,赋了也没关系,但会清零 b. 传出 ...
- Mysql执行计划中eq_ref和ref类型的区别
下面是一位大佬的回复,我觉得挺好理解的,就来记录下. 文章目录 eq_ref ref eq_ref eq_ref - 想象你有两张桌子.表A包含列(id,text),其中id是主键.表B具有相同的列( ...
- ref out param 区别
如果在方法声明参数中未使用ref或out关键字,在方法中更改参数的值,当控制传递回调用过程时,不会保留更改的值:我们可以通过方法参数关键字,更改这种行为. 1.ref 2.out 3.params r ...
- 浅谈ref与out区别
今天又一次碰到了ref与out区别的问题,当初总认为自己学的还不错,但每次遇到后都要纠结一番,这次再次学习和巩固一下. MSDN中的定义: ref 关键字使参数按引用传递.其效果是,当控制权传递回调用 ...
- php中什么时候用传值,php中传值与传引用的区别。什么时候传值什么时候传引用?...
java中的this与super的区别 java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Ba ...
- vue3 ref 和 reactive 区别
前言 最近学习cloud项目,前端使用到 vue3 + ts 等技术,在写需求过程中遇到响应式数据问题,经百度查找相关笔记,在此记录一下,在实战中成长吧. 问题 出现的问题:定义一个默认数组并且 fo ...
- sql语句中left join和inner join中的on与where的区别分析
原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...
- 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别
一.append()和extend()方法都是用来添加数据到list末尾的,两者的区别: append()添加的时候会把添加的数据当成一个整体进行添加,允许添加任意类型的数据 extend()添加的时 ...
最新文章
- CSS Guide Lines
- framebuffer的入门介绍-实现程序分析【转】
- opencv 人脸识别 (二)训练和识别
- 软考-信息系统项目管理师-项目质量管理
- Oracle建立约束、删除约束
- Linux网络编程--文件描述符
- 怎样格式化电脑_硬盘数据销毁最安全的步骤是怎样的?有公司可以做吗
- Python里的++和--不是运算符
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
- Linux下make -j加快编译速度
- 林子雨大数据软件安装和编程指南导航
- js书写原生ajax,JS 原生ajax写法
- DCFNET:用于视觉跟踪的判别相关滤波器网络
- 2021年西式面点师(中级)报名考试及西式面点师(中级)证考试
- 想要运营公众号?公众号形象定位有哪些?
- 如何增长U盘的寿命- 小技巧
- 对于pytorch中nn.CrossEntropyLoss()与nn.BCELoss()的理解和使用
- c++plus_6th_第4章
- 如何用计算机控制家带你开关,计算机控制系统复习点及答案
- C# GroupBy 用法