C#参数传递

C#的变量类型

值类型:值类型的变量就是数据本身,包括基本数据类型(int, float, char)、枚举(enum)和结构体(struct)。

引用类型:引用类型的变量指向数据的,是一个引用,而不是数据本身,包括类(Class)、委托(delegate)、接口(interface)和数组。

注意,变量的值类型、引用类型跟参数传递中的值传递、引用传递是不同的概念,下面讲解C#的参数传递。

C#的参数

C#的参数有5种传递方式,分别为值传递参数,引用传递参数(ref),输入参数(int),输出参数(out),可变参数(params)。

值传递参数

值传递就是传递变量本身。对于值类型的变量,因为因为变量本身就是数据,所以传递的就是数据;对于引用类型的变量,传递的是引用。

在函数内对变量的操作不会影响调用方。

注意,是对变量本身的操作。对于值类型的变量来说,操作变量等同于操作数据;对于值类型的变量来说,操作变量是指操作引用,而不是引用指向的数据。

 1 class Hero
 2 {
 3     public Hero(string strName)
 4     {
 5         Name = strName;
 6     }
 7     public string Name
 8     {
 9         get;
10         set;
11     }
12 }
13 
14 class ParamTest
15 {
16     public void PlusOne(int val)
17     {
18         val += 1;
19     }
20 
21     public void ChangeHero(Hero aHero)
22     {
23         aHero = new Hero("Zhangwuji");
24     }
25 }
 1 static void Main(string[] args)
 2 {
 3     ParamTest tester = new ParamTest();
 4     int value = 3;
 5     tester.PlusOne(value);
 6     Console.WriteLine(value); // 3
 7     Hero wudangHero = new Hero("Zhangcuishan");
 8     tester.ChangeHero(wudangHero);
 9     Console.WriteLine(wudangHero.Name); // "Zhangcuishan"
10 
11     Console.ReadKey();
12 }

当然,对于引用类型的变量,在函数里操作引用指向的数据,会影响到调用方。

1 class ParamTest
2 {
3     public void ChangeHeroName(Hero aHero)
4     {
5         aHero.Name = "Zhangwuji";
6     }
7 }
1 static void Main(string[] args)
2 {
3     ParamTest tester = new ParamTest();
4     Hero wudangHero = new Hero("Zhangcuishan");
5     tester.ChangeHeroName(wudangHero);
6     Console.WriteLine(wudangHero.Name); // "Zhangwuji"
7 
8     Console.ReadKey();
9 }

引用传递参数

引用传递参数传递变量的引用,不会为参数另外开辟空间,在定义函数和调用函数时都必须使用ref关键字。参数在传递前必须初始化。

参数在函数中可读可写。

在函数中对变量的操作会影响到调用方。

 1 class ParamTest
 2 {
 3     public void PlusOne(ref int val)
 4     {
 5         val += 1;
 6     }
 7  
 8     public void ChangeHero(ref Hero aHero)
 9     {
10         aHero = new Hero("Zhangwuji");
11     }
12 }
 1 static void Main(string[] args)
 2 {
 3     ParamTest tester = new ParamTest();
 4     int val = 3;
 5     tester.PlusOne(ref val);
 6     Console.WriteLine(val); // 4
 7     Hero wudangHero = new Hero("Zhangcuishan");
 8     tester.ChangeHero(ref wudangHero);
 9     Console.WriteLine(wudangHero.Name); // "Zhangwuji"
10 
11     Console.ReadKey();
12 }

输入参数(C# 7.2)

传递变量的引用,在定义函数时必须使用in关键字,调用函数时可用可不用。

参数在函数中只能读。

输出参数

传递变量的引用,在定义函数和调用函数时都必须使用out关键字。

参数在传递前不一定要初始化,但函数返回前必须给该参数赋值。

在函数中对变量的操作会影响到调用方。

1 class ParamTest
2 {
3     public void NewHero(out Hero aHero)
4     {
5         aHero = new Hero("Zhangwuji");
6     }
7 }
1 static void Main(string[] args)
2 {
3     ParamTest tester = new ParamTest();
4     Hero wudangHero;
5     tester.NewHero(out wudangHero);
6     Console.WriteLine(wudangHero.Name); // "Zhangwuji"
7 
8     Console.ReadKey();
9 }

可变参数

顾名思义,参数的个数是可变的。可变参数必须是参数列表中的最后一个参数,并且一个函数只能有一个可变参数,使用params关键字来定义可变参数。

调用函数时,可以给可变参数传递0个、1个或多个参数。

 1 class ParamTest
 2 {
 3     public void Eat(params string[] foods)
 4     {
 5         foreach(var food in foods)
 6         {
 7             Console.WriteLine("eat:" + food);
 8         }
 9     }
10 }
 1 static void Main(string[] args)
 2 {
 3     ParamTest tester = new ParamTest();
 4     tester.Eat();
 5     tester.Eat("chicken", "duck");
 6     string[] foods = new string[] { "noodles", "dumpling" };
 7     tester.Eat(foods);
 8 
 9     Console.ReadKey();
10 }

猜你喜欢

转载自www.cnblogs.com/love-me-love-my-code/p/10425828.html