引例:

先看这个源码,函数传递后由于传递的是副本所以真正的值并没有改变。

源码如下:

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参数的更多相关文章

  1. c#编程基础之函数可变参数

    可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参 ...

  2. Shell编程基础教程7--脚本参数的传递

    7.脚本参数的传递    7.1.shift命令        简介:            shift n        每次将参数位置向左偏移n位        例子 #!/bin/bash us ...

  3. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

  4. [.net 面向对象编程基础] (19) LINQ基础

    [.net 面向对象编程基础] (19)  LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...

  5. [.net 面向对象编程基础] (21) 委托

    [.net 面向对象编程基础] (20)  委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...

  6. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  7. 编程基础-msdn编程指南笔记

    此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx 注释:// 单行注释 /* 多行注释*/ ...

  8. C#面向对象编程基础-喜课堂笔记

    **************[5][C#面向对象编程基础]第1讲:类与对象****************                 *************2.1.1_类与对象的概念**** ...

  9. C#基础之方法和参数

    C#基础之方法和参数 接上一篇<C#基础之类型和成员基础以及常量.字段.属性> 实例方法.静态方法 C#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...

随机推荐

  1. PHP 5.6 编译安装选项说明

    `configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION].. ...

  2. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  3. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)

    前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...

  4. 普通程序员如何转向AI方向

    眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...

  5. Android如何制作漂亮的自适布局的键盘

    最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路. 这里最上面的titlebar高度固定,下面输入的金额高 ...

  6. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...

  7. iOS开源项目周报1229

    由OpenDigg 出品的iOS开源项目周报第三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Ma ...

  8. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  9. Maven(一)linux下安装

    1.检查是否安装JDK,并且设置了环境变量(JAVA_HOME): echo $JAVA_HOME java -version 运行结果: 显示jdk的安装路径,和java的版本,如: #jdk路径 ...

  10. windows下mongodb配置

    打开cmd(windows键+r输入cmd)命令行,进入D:\mongodb\bin目录(如图先输入d:进入d盘然后输入cd d:\mongodb\bin), 输入如下的命令启动mongodb服务: ...