Keep on going never give up.

Let's Go

C# 学习笔记(15)方法中利用参数返回值 (ref参数、out参数)

C#Lonely2019-05-03 13:43:3631次0条

通常情况下,方法参数默认是值传递的,也就是“复制一份”,传递的是变量所对应数据的一个拷贝,而非引用。当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响。

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 20;
            int number = Test(num); //(实参)传num参数,外部去为内部赋值
            Console.WriteLine("num={0},number={1}", num, number); //num为20,number为30            
            Console.ReadKey();
        }
        
        public static int Test(int x) //(形参)x接收num参数(也就是复制num一份)后,x为20
        {
            x += 10; //x为30
            return x;
        }
    }
}

当然还有另外一种情况,我们向方法传递参数时使用ref关键字和out关键字。在传参数过程中,如果参数有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中变量的值也会相应改变。

out 关键字:

使参数按引用来传递。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。out参数主要用于传出值(只出不进),在离开方法前必须对out修饰的参数进行赋值。

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //out是内部去为外部变量赋值,out一般用在函数需要有多个返回值的场所。
            int num;
            int number = Test(out num); //如果参数是以 out 形式传入的,那么num在传入前可以不赋初值。(因为out是只出不进的,所以传入数据没有意义);num接收x参数后,num为50。           
            Console.WriteLine("num={0},number={1}", num, number); //输出num为50,number为100。
            Console.ReadKey();
        }
        
        public static int Test(out int x) //在方法的参数类型前加 out ,那么传参数的时候也必须在实参前加out,表明这个参数不是用来传入的,而是用来传出值的。x给num传出参数。
        {
            x = 50; //在方法中对于由 out 修饰的参数,必须赋值,并且必须在使用前赋值,因为该参数是用于传出的。
            int i = 100;
            return i;
        }
       
    }
}

ref 关键字:

使参数按引用传递。当调用方法时,在方法中会对ref传入的参数值进行改变。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。ref参数可以理解成双向的,既可以传入,又可以传出(有进有出)。传递到 ref 参数的实参必须先进行初始化。

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {            
            int num = 100; //传递到 ref 参数的实参必须先初始化
            int number = Test(ref num); //ref,传入、传出值
            Console.WriteLine("num={0},number={1}", num, number);
            Console.ReadKey();
        }
        
        public static int Test(ref int x)
        {
            int i = x;
            x += 100;
            return i;
        }
       
    }
}

out和ref之间的区别

共同点:

out、ref传递的都是参数的引用(内存地址),使用后都将改变原来参数的数值。

不同点:

ref可以把参数的数值传递进函数,但是你无法把一个数值从out传递进去,out会把参数清空,就是说out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,ref是有进有出,out是只出不进。



暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!