c# out原理 ref_C#高级参数params,ref,out

1.params

这个参数是不受形参限制,想传几个就传几个。以数组的方式传入参数。在一个方法中,只能有一个参数可以使用params,多参数时,params参数也只能出现在最后。比如:你网购电脑,需要选择cpu,品牌等很多条件,但是也可以不全部选择,这个时候就用上了params

 static void Main(string[] args)
        {
            Test(1, 2, 3, 4, 5);//调用
            Console.ReadKey();
        }
        static void Test(params int[] array)//params高级参数,后面是数组
        {
            for (int i = 0; i < array.Length; i++)//循环,array.Length是数组的长度。数组的第一个长度,对应的下标或者说索引是0
            {
                Console.WriteLine(array[i]);//循环打印,数组的元素
            }
        }

2.ref

这个参数是指按地址传送。是方法体内改变方法体外变量的值。在形参前需要加上ref,实参必须也要加上ref。并且他可以在一个方法中,可以多个参数使用ref。

static void Main(string[] args)
        {
            int n1 = 10;
            int n2 = 5;
            Console.WriteLine("n1={0},n2={1}", n1, n2);
            Changer(n1, n2);
            Console.WriteLine("n1={0},n2={1}", n1, n2);
            Console.ReadKey();
        }
   
        #region ref
        static void Changer(int num1, int num2)
        {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }
        #endregion

9537cb57d402200f104f915289c9cd63.png
以上代码的目的就是想要利用这个方法,来交换定义的两个变量的值,可惜没有成功,我们来分析一下什么原因
int n1 = 10;
int n2 = 5;
Console.WriteLine("n1={0},n2={1}", n1, n2);

这个代码毫无疑问输出必然是n1=10,n2=5。

我们来看形参,和变量,可以理解成,形参是方法体内的变量,而在方法体外本来就是变量对吧;我们按照以上的代码分析:我们知道,定义一个变量实质上就是向内存地址索要一片空间,所以,n1 n2 num1 num2,在内存上是索要了4个空间。我们在调用方法,Changer(n1,n2)这个实质上值吧变量n1n2的值 复制 给num1num2。通过方法,num1和num2的值也确实调换了,但是n1和n2的值是没有变换的。

ref这个时候就起到作用了,形参取实参的值。也就是说,num1,num2同时分别指向n1,n2。num1和n1是同一片内存空间,num2和n2是同一片内存空间。所以num1和num2的值修改了也就是n1,n2的值修改了。

打个比方,我电脑上的文档,我复制一份发给你,你在你的电脑做任何修改只会影响你,但是对我却是毫无影响对吧。但是你跟我用一台电脑,用这个文件,你吧他修改了,那就真的修改了。

static void Main(string[] args)
        {
            //Test(1, 2, 3, 4, 5);//调用
            int n1 = 10;
            int n2 = 5;
            Console.WriteLine("n1={0},n2={1}", n1, n2);
            Changer(ref n1, ref n2);
            Console.WriteLine("n1={0},n2={1}", n1, n2);
            Console.ReadKey();
        }
        
        #region ref
        static void Changer(ref int num1, ref int num2)
        {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }
        #endregion

aee79d56baae127ca2b6799c53a05caa.png
这样就提到了我们要的效果

所以说,ref的作用就是在方法内可以修改方法外的变量,实质就是形参指向实参的值或者内存空间

3.out

out参数就是把方法体内的变量传到方法体外。也就是实参取形参的内存空间。他和ref一样都是地址传送,他可以有多个参数使用,实参也需要加上out,看例子

static void Main(string[] args)
        {
            string uid1 = "admin";//定义用户名
            string pwd1 = "888888";//定义密码
            string mrg1;//登录反馈
            if(Checklogin(uid1,pwd1,out mrg1))//判断,调用方法
            {
                Console.WriteLine("登录成功");
            }
            else
            {
                Console.WriteLine("登录失败,错误原因" + mrg1);//把mrg传送给mrg1,得到反馈信息,输出给用户
            }

            Console.ReadKey();
        }
       
        static bool Checklogin(string uid, string pwd, out string mrg)//定义一个检查用户登录状态
        {
            if (uid=="admin" & pwd == "888888")//都对,返回真,反馈信息初始化空
            {
                mrg = null;//初始化
                return true;
            }
            else if (uid=="admin")//密码不对返回假,反馈密码错误
            {
                mrg = "密码错误";
                return false;
            }
            else
            {
                mrg = "用户名不存在";//账号不对,返回假,反馈用户们不存在
                return false;
            }
        }

f74c2c26d6a51c26b41b8dd760d20e86.png

c183fe4f77a10aab1ddc06001877932d.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值