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#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...
随机推荐
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...
- 7.让网站支持http和https的访问方式
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 怎么让网站在本地支持SSL?http://www.c ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- Android 剪贴板详解
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...
- CGI与FastCGI nginx+PHP-FPM
本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...
- php实现的分页类
php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...
- ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)
原文:Partial Views 作者:Steve Smith 翻译:张海龙(jiechen).刘怡(AlexLEWIS) 校对:许登洋(Seay).何镇汐.魏美娟(初见) ASP.NET Core ...
- 灵魂宝石 bzoj 2663
灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- PHP安装
工具 http://www.cnblogs.com/xiwang6428/p/4315049.html http://www.iteye.com/news/22672 1 安装:sudo apt-ge ...