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#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...
随机推荐
- nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- 预览github里面的网页或dome
1.问题所在: 之前把项目提交到github都可以在路径前面加上http://htmlpreview.github.io/?来预览demo,最近发现这种方式预览的时候加载不出来css,js(原因不详) ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
- Android Weekly Notes Issue #237
Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...
- 【Star CCM+实例】开发一个简单的计算流程.md
流程开发在CAE过程中处于非常重要的地位. 主要的作用可能包括: 将一些经过验证的模型隐藏在流程中,提高仿真的可靠性 将流程封装成更友好的界面,降低软件的学习周期 流程开发实际上需要做非常多的工作,尤 ...
- Python处理Excel表格
同事小王今天说他有一个Excel表格,表格如下,一列是姓名,一列是电话号码,总共有大概2000行数据. 有的姓名占了一行,有的占了两行,还有一些占了三行的.如下图: 他问我可不可以全部统一成一行,而且 ...