C#值参数/引用参数/输出参数,有点抽象

一、值参数

1、在栈中为形参分配空间

2、复制实参到形参

     public class Person      {          public int age = 10;      }         static void Main(string[] args)        {            int a2= 10;            Person a1= new Person();            Console.WriteLine(a1.age + "--" + a2);            SetParam(a1, a2);            Console.WriteLine(a1.age + "--" + a2);            Console.ReadLine();        }        static void SetParam(Person f1, int f2)        {            f1.age = f1.age + 5;            f2 = f2 + 5;        }

上面的输出结果是.

10--10

15--10

C#值参数/引用参数/输出参数,有点抽象

二、引用参数

1、使用引用参数时,必须在方法的声明和调用中都使用ref修饰符。

2、实参必须是变量,在用作实参前必须被赋值,如果是引用类型的变量,可以赋值为一个引用或null值。

3、不在栈中为形参分配新的内存。

4、形参名称相当于实参变量的别名,引用与实参相同的内存位置。

       public class Person        {            public int age = 10;        }        static void Main(string[] args)        {            int a2 = 5;            Person a1 = new Person();            Console.WriteLine(a1.age + "--" + a2);            SetParam(ref a1,ref  a2);            Console.WriteLine(a1.age + "--" + a2);            Console.ReadLine();        }        static void SetParam(ref Person f1,ref int f2)        {            f1.age = f1.age + 5;            f2 = f2 + 5;        }

上面的输出结果是

10--5

15--10

C#值参数/引用参数/输出参数,有点抽象

三、输出参数

1、必须在声明的调用中都是用修饰符。输出参数的修饰符是out而不是ref。

2、实参不许是变量,不能是其他表达式类型。

3、在方法内部,输出参数在被读取之前必须被赋值。这意味着参数的初始值是无关的,而且没有必要在方法调用前为实参赋值。

4、每个输出参数在方法返回之前必须被赋值

     public class Person        {            public int age = 10;        }        static void Main(string[] args)        {            Person a1 = null;            int a2;            OutParam(out a1,out  a2);            Console.WriteLine(a1.age + "--" + a2);            Console.ReadLine();        }
        static void OutParam(out Person f1, out int f2)        {            f1 = new Person();            f1.age = 25;            f2 = 15;        }

上面的输出结果是

25--15

C#值参数/引用参数/输出参数,有点抽象