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;
        }
       
    }
}

程序截图:

posted @ 2014-08-11 16:37  技术宅星云  阅读(271)  评论(0编辑  收藏  举报