黑马程序员学习日记(8)--函数的ref、out参数和可变参数

----------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

函数的ref、out参数:

Rom'Zmo�Vp=Vnt-family:"Times New Roman"'>在给out方式传递参数之前,必须在函数内部必须得给参数赋值。外部不需要给参数初始化的值,到out函数内部认为是外部没有初始化,必须在内部给参数赋值。(内部为外部赋值,用于函数有多个返回值的场景)。每个函数只有一个返回值,如果想有多个就要用到out

普通的值类型变量,在别处的改动实际上是复制的副本在函数的参数前边加ref,使用参数时,将参数前边也加ref,则在调用函数的时候直接引用的是变量本身,它是引用而非复制。ref必须得初始化(函数内部对外部的值进行改变)

out在给out方式传递参数之前,必须在函数内部必须得给参数赋值。外部不需要给参数初始化的值,到out函数内部认为是外部没有初始化,必须在内部给参数赋值。(内部为外部赋值,用于函数有多个返回值的场景)。每个函数只有一个返回值,如果想有多个就要用到out

 class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            IncNum(i);
            Console.WriteLine("i的值是{0}",i);

            int j = 1;
            IncAge(ref j);
            Console.WriteLine("j的值被函数改变了(ref的作用){0}",j);

            int k = 0;
            GetValue(out k);
            Console.WriteLine("k的值被out掉了,初始化不起作用,他将有一个新的值{0},这是在函数内部被重新的初始化了",k);


            //---------------------------------------out应用--------------------------------------------
            int m;
            string str = Console.ReadLine();
            if (int.TryParse(str, out m))//有两个返回值,一个是true或者false,另一个是转换成功后m的整型的值
            {
                Console.WriteLine("转换成功,{0}", m);
            }
            else
            {
                Console.WriteLine("数据错误");
            }
            //---------------------------------------ref应用--------------------------------------------
            int n1 = 20, n2 = 30;
            //Swap(n1, n2);这样操作的是n1、n2的复制的参数,并没有操作他们本身
            Swap(ref n1, ref n2);
            Console.WriteLine("n1的值是{0},n2的值是{1}",n1,n2);

            Console.ReadKey();
        }
        static void IncNum(int num)
        {
            num++;//num只是i的复制的值,不能改变i本身
        }
        static void IncAge(ref int age)//ref的参数是对传递过来的参数的引用而不是复制,所以它将直接改变传递过来的值得本身而非它的复制品
        {
            age++;
        }
        static void GetValue(out int num)
        {
           // num++;外部初始化的值对out参数内部不起作用,必须在含有out参数函数的内部重新初始化
            num = 10;
        }

        //---------------------------------------ref应用--------------------------------------------
        //static void Swap(int m, int n)这样只是操作参数复制的数并没有操作参数本身
        static void Swap(ref int m,ref int n)
        {
            int temp;
            temp = m;
            m = n;
            n = temp;
        }
    }

可变参数

给函数添加可变参数,只需在传进的参数数组前边加param,可变参数可以与不变参数一块用(需要注意的是可变参数必须得是所有参数中的最后一个)。参数默认值(. net4.0,用函数重载来实现):void sayHello(string name,int age=20)

static void Main(string[] args)
        {
            string[] strs = {"bac","bcd","cddd","fefe"};
            VFun(strs);//如果传入的参数是数组则读取到的效果跟普通参数一样
            VFun("abc", "bcd", "def");//实现了添加可变参数,相加多少就加多少
            SayHello("小明", 11, "狗蛋", "键盘", "老鼠屎", "鼠标");//可变参数与不变参数的混合使用
            Console.ReadKey();
        }
        static void VFun(params string[] values)//传入可变参数,可以有多个参数,类型要一致,只需在参数数组前边加上param即可
        {
            foreach (var item in values)
            {
                Console.WriteLine(item);
            }
        }
        static void SayHello(string name,int age,params string[] nickname)//可变参数可以与普通参数一块使用,但是一定要放到最后边
        {
            Console.WriteLine("我的名字叫{0},我今年{1}岁了",name,age);
            foreach (var item in nickname)
            {
                Console.WriteLine("我的外号叫{0}",item);//如果把item错写成了nickname则只会输出第一个nickname
            }
        }

----------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值