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#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...
随机推荐
- 对抗假人 —— 前后端结合的 WAF
前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- [Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高
运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAI ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- ESLint的使用笔记
原文地址:https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral 在团队协 ...
- Mysql - 查询之关联查询
查询这块是重中之重, 关系到系统反应时间. 项目做到后期, 都是要做性能测试和性能优化的, 优化的时候, 数据库这块是一个大头. sql格式: select 列名/* from 表名 where 条件 ...
- Spring mvc @initBinder 类型转化器的使用
一.单日期格式 因为是用注解完完成的后台访问,所以必须在大配置中配置包扫描器: 1.applicactionContext.xml <?xml version="1.0" e ...
- C#编写windows服务,多服务为什么只启动一个(ServiceBase.Run)
https://zhidao.baidu.com/question/380395667.html //多服务一个宿主程序时必须注间以下要点: Service1的ServiceName 必须 Insta ...