首页 > 其他分享 >一些让我当年搞混的玩意:传参

一些让我当年搞混的玩意:传参

时间:2022-12-17 21:46:45浏览次数:65  
标签:传参 Console int void 搞混 static Swap 玩意

前言

记得大一刚开始学后端语言的时候,在基础阶段学的"传参"知识点让我一脸懵,现在凭着感觉简单写写,最近给自己定了任务:每周至少写3篇blog,反正也没什么人看,就随便叨叨几句

分类

在csharp中有3种传参,分别是值传参,引用传参,输出传参。

值传参

其中值传参是csharp默认的传参方式,这种方式在调用一个方法的时候,会为每一个参数都开辟一个新的内存地址(存储空间)。
而参数呢,又分为实参和形参,在值传参时,如果参数是实参,那么是实参的值就会COPY给形参,所以说实参和形参引用的不是统一给内存地址。由此可得,形参的值更新的时候,不会影响实参的值,从而保证了实参的数据安全。

举个例子
有怎么一个需求:给你a,b两个整数,让你将a,b两个整数的值互换,你会怎么做。

        static void Main(string[] args)
        {
            int a = 200;
            int b = 400;
            int c;//定义一个暂存变量

            c = a;
            a = b;
            b = c;

            Console.WriteLine($"a={a},b={b}");

            Console.ReadKey();
        }

上面的代码,将会打印出a=400,b=200已经成功交换。下面我封装一下看看:

        static void Main(string[] args)
        {
            int a = 200;
            int b = 400;
            Swap(a, b);
            Console.WriteLine($"a={a},b={b}");//a=200,b=400
            Console.ReadKey();
        }
        public static void Swap(int number1,int number2)
        {
            int c;
            c = number1;
            number1 = number2;
            number2 = c; 
        }

上面的代码运行后,打印出来的结果是a=200,b=400,为什么没有交换呢,是因为在main方法中调用Swap(a,b)时,Swap会为a和b这组数据开辟两个新的内存地址,number1和number2,这两个内存地址和变量a、变量b毫无瓜葛的,所以就算再Swap中做了交换,也不会影响a和b的值。像这种直接把数据传递进入方法的形式(操作)就叫值传参。

引用传参

上面的这个例子中,我头铁!就是想调用Swap方法,交换a和b的值,还有别的办法吗,能不能控制将a,b两个实参传入Swap时,不让方法去开辟新的内存地址,直接用a和b变量本身的内存地址?嘿嘿,csharp确确实实有一种方式可以做到,这就是引用传参,大白话就是调用方法的时候,传给方法的参数直接告诉方法:" 我丫的给你内存地址了,直接用就行,不用你重新开辟新的内存地址了!"(可能我怎么描述很俗气,但是自娱自乐的我很爽,你管不着)
代码:

        static void Main(string[] args)
        {
            int a = 200;
            int b = 400;
            Swap(ref a, ref b);
            Console.WriteLine($"a={a},b={b}");//a=400,b=200
            Console.ReadKey();
        }
        public static void Swap(ref int number1, ref int number2)
        {
            int c;
            c = number1;
            number1 = number2;
            number2 = c; 
        }

上面的代码中我只在Swap方法和调用Swap方法时的参数前添加了ref关键字,再运行一下a和b的变量就能正常交换了。其中ref是reference,引用的意思。这时候调用Swap方法时,传入的参数就可以不让Swap方法去开辟新的内存地址,直接用a和b变量本身的内存地址了。

输出传参

最后一个输出传参呢,和其他语言不通(其他语言没有)。我们知道,在方法中,retuen语句可以返回一个特定的数据,但是我们还可以用输出参数,在不修改方法返回类型的情况下(注意:不修改方法的返回类型的情况下),输出更多的数据。比如下面是一个没有返回值的方法

        static void Main(string[] args)
        {
            int c = 300;
            GetValue(c);
            Console.WriteLine(a);
            Console.ReadKey();
        }
        public static void GetValue(int number)
        {
            number = 100;
        }

在mian方法中调用一下GetValue,按照上面值传参的解读,整个程序执行完后,变量a的值是不会更新的,但是,如果我们定义GetValue方法的时候在参数前面加上out,那么这个这个时候更新number参数,变量c的值也会随之更新,进而向方法外部扩展。

        static void Main(string[] args)
        {
            int c = 300;
            GetValue(out c);
            Console.WriteLine(c);
            Console.ReadKey();
        }
        public static void GetValue( out int number)
        {
            number = 100;
        }

定义GetValue方法的时候在参数前面加上out后,程序执行完后变量a的值被更新为100。这就是所谓的输出传参,就是可以把方法内的变化反应在参数中,并且以return以外的形式输出。

值传参和输出传参简单地比较

上面的例子中,不管是值传参还是输出传参,其目的都是希望将输入方法的变量地址传给方法,不让方法为传入的参数开辟新的内存地址。不过,这个输出传参和引用传参看起来好像作用一样的啊,都是改变了参数的数据。那么他们到底有什么不同点呢?先看下代码:

        static void Main(string[] args)
        {
            //int a = 200;
            int a;//用传参的前提是,被引用的变量必须已经完成了初始化
            int b = 400;
            Swap(ref a, ref b);
            Console.WriteLine($"a={a},b={b}");//a=400,b=200

            //int c = 300;
            int c;
            GetValue(out a);
            Console.WriteLine(a);
            Console.ReadKey();
        }
        public static void GetValue( out int number)
        {
            number = 100;
        }

        public static void Swap(ref int number1, ref int number2)
        {
            int c;
            c = number1;
            number1 = number2;
            number2 = c;
        }

代码中在min方法里把变量a的初始值给去掉了,然后编译会报错,而将变量c的初始值给去掉后再使用输出参数的getValue方法没有任何问题。
所以引用传参的前提是被引用的变量必须已经完成了初始化

结语

如有问题,可在下方评论或邮件联系我,联系邮箱:[email protected]

标签:传参,Console,int,void,搞混,static,Swap,玩意
From: https://www.cnblogs.com/ynysj/p/16988440.html

相关文章