c#编程基础之ref、out参数

引例:

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

源码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace refout参数学习
{
    class Program
    {
        static void Main(string[] args)
        {
            int age = 20;
            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 = 20;
            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 = 22;
        }
    }
}

程序截图:

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 = 10;
            int i2 = 20;
            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 = 10;
            int i2 = 20;
            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参数

时间: 2024-08-26 23:44:04

c#编程基础之ref、out参数的相关文章

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

可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参数. 代码如下: using System; using System.Collections.Generic; using System.Text; namespace 函数可变参数学习 { class Program { static void Main(string[] args) { Say

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

7.脚本参数的传递    7.1.shift命令        简介:            shift n        每次将参数位置向左偏移n位        例子 #!/bin/bash usage() { echo "usage:`basename $0` filenames" } totalline=0 #下面的语句中 $# 表示参数的个数 if [ $# -lt 2 ] then usage fi while [ $# -ne 0 ] do line=`cat $1 |

Oracle PL/SQL 编程基础 实例

create table mytest(name varchar(20),password varchar(30)); create or replace procedure sp_pro2 is begin insert into mytest values('fc','123'); end; 查看错误信息 show error 如何调用该过程: 1, exec 过程名 (参数,..) 2.  call 过程名 (参数  ) set server output on begin dbms_ou

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

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要

elisp 编程基础

*/--> elisp 编程基础 Table of Contents 1. 指令 2. 打印 3. 数学运算 3.1. 加减乘除 3.2. 类型判断 3.3. 字符串与数字转换 4. 逻辑判断 4.1. 真假判断 4.2. 逻辑运算 4.2.1. and 和 or 4.2.2. 数字判断 4.2.3. 字符串判断 4.2.4. equal 5. 变量 5.1. 全局变量 5.2. 局部变量 6. 代码块 7. 遍历 8. 函数与命令 9. 补充: 奇怪的单引号 → ` 10. ref 1 指令

c#socket编程基础 [转帖]

c#socket编程基础 Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Int

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

**************[5][C#面向对象编程基础]第1讲:类与对象**************** ????????????????*************2.1.1_类与对象的概念************** ? 研究对象的入口是: 静态特征:-------属性(什么样子) 动态特征:-------方法!(能做什么)这两个也是对象区分的重要因素! 3. 对象表示世界中的实体,面向对象编程就是将这些实体模拟到计算机中! 4. 什么是封装? ????封装是指将一个或多个小对象包装在一起,

网络编程基础

网络编程基础 1.套接字概念 Linux环境下使用套接字进行进程之间的通信.用过套接字的接口,其他进程的位置对于应用程序来讲是透明的.相互通信双方端点都有一个套接字,双方如果要进行通信,通过套接字建立桥梁,双方就可以通信了. 类似文件一样,套接字也有一个套接字描述符,应用程序可以像操作文件一样操作套接字.在进行网络通信的过程中,用户感觉就是在操作文件一样,这是Linux将外部设备抽象为一个文件的好处. 2.字节序 不同主机的体系结构不同,所采用的数据存储方式不同.网络中,进程之间的通信是跨主机的

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握