c#编程基础之ref、out参数
引例:
先看这个源码,函数传递后由于传递的是副本所以真正的值并没有改变。
源码如下:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
int age = ;
IncAge(age);
Console.WriteLine(age);//打印结果还是20
Console.ReadKey(); }
static void IncAge(int age)//复制了一份,所以IncAge内部改变的是副本
{
age++;
}
}
}
运行截图:
要解决上面方法就需要使用ref参数:
上面源码修改后如下:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
int age = ;
IncAge(ref age);//此处必须也加上参数ref
Console.WriteLine(age);//使用参数ref后,传递真值,而不是副本,所以打印21
Console.ReadKey(); }
static void IncAge(ref int age)//使用ref参数后,传递过来的将不是副本,而是原本,函数内改变,其值也将发生改变
{
age++;
}
}
}
程序截图:
out参数由内部进行赋值,所传递参数无需初始化,而且即使初始化也没用。
源码如下:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
int age;
IncAge(out age);//此处必须也加上参数out
Console.WriteLine(age);//使用参数out后,传递真值,并有函数内部赋值所以打印22
Console.ReadKey(); }
static void IncAge(out int age)//使用out参数后,所传递值不需要初始化,由函数内部为其赋值。
{
age = ;
}
}
}
程序截图:
out参数应用场景:
源码如下:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
string str = Console.ReadLine();
int i;
if(int.TryParse(str,out i))
{
Console.WriteLine("转换成功!{0}",i);
}
else
{
Console.WriteLine("数据错误!");
}
Console.ReadKey();
} }
}
运行结果:
ref运行场景,比如我们先看这个源码:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
int i1 = ;
int i2 = ;
Swap(i1, i2);//将i1和i2各复制一份传递给函数
Console.WriteLine("i1={0},i2={1}", i1, i2);//i1和i2没有发生交换,还是i1=10,i2=20
Console.ReadKey();
}
static void Swap(int i1, int i2) //交换函数
{
int temp=i1;
i1 = i2;
i2 = temp;
} }
}
运行结果:
想要实现真的交换,这时就需要ref参数了,修改源码如下:
using System;
using System.Collections.Generic;
using System.Text; namespace refout参数学习
{
class Program
{
static void Main(string[] args)
{
int i1 = ;
int i2 = ;
Swap(ref i1,ref i2);//将i1和i2传递给函数
Console.WriteLine("i1={0},i2={1}", i1, i2);//i1和i2发生交换,还是i1=20,i2=10
Console.ReadKey();
}
static void Swap(ref int i1,ref int i2) //接受传递来的i1和i2的值,将i1和i2的值进行交换。
{
int temp=i1;
i1 = i2;
i2 = temp;
} }
}
程序截图:
c#编程基础之ref、out参数的更多相关文章
- c#编程基础之函数可变参数
可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参 ...
- Shell编程基础教程7--脚本参数的传递
7.脚本参数的传递 7.1.shift命令 简介: shift n 每次将参数位置向左偏移n位 例子 #!/bin/bash us ...
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
[.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...
- [.net 面向对象编程基础] (19) LINQ基础
[.net 面向对象编程基础] (19) LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...
- [.net 面向对象编程基础] (21) 委托
[.net 面向对象编程基础] (20) 委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...
- 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...
- 编程基础-msdn编程指南笔记
此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx 注释:// 单行注释 /* 多行注释*/ ...
- C#面向对象编程基础-喜课堂笔记
**************[5][C#面向对象编程基础]第1讲:类与对象**************** *************2.1.1_类与对象的概念**** ...
- C#基础之方法和参数
C#基础之方法和参数 接上一篇<C#基础之类型和成员基础以及常量.字段.属性> 实例方法.静态方法 C#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...
随机推荐
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- CoreCRM 开发实录——开始之新项目的技术选择
2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...
- 基于window7+caffe实现图像艺术风格转换style-transfer
这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...
- 【干货分享】流程DEMO-资产请购单
流程名: 资产请购 业务描述: 流程发起时,会检查预算,如果预算不够,流程必须经过总裁审批,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算. 流程相关文件: 流程 ...
- BPM助力企业数字化转型
自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...
- 驱动01.LED
1.写出leds_open,leds_write函数2.1告诉内核这几个函数的存在?定义一个结构体file_operations2.2把这个结构体告诉内核?用register_chrdev(major ...
- keepalived从机接管后主机恢复不抢占VIP
在lvs+keepalived环境中,为了减小keepalived主从切换带来的意外风险,,设置主机恢复后不抢占VIP.待进行vrrp协议通告备机不可用时切换.主要修改两个地方.(红色部分) 只需修改 ...
- 个人也能申请微信小程序获得APPID和手机测试效果
微信小程序昨晚火爆公测,我也第一时间注册了小程序账号开启公测之旅. 注册过程可以看文档:https://my.oschina.net/imhoodoo/blog/780901 进入后台之后我们其实主要 ...
- C#执行异步操作的几种方式比较和总结
C#执行异步操作的几种方式比较和总结 0x00 引言 之前写程序的时候在遇到一些比较花时间的操作例如HTTP请求时,总是会new一个Thread处理.对XxxxxAsync()之类的方法也没去了解过, ...