值类型:值类型的变量就是数据本身,包括基本数据类型(int, float, char)、枚举(enum)和结构体(struct)。
引用类型:引用类型的变量指向数据的,是一个引用,而不是数据本身,包括类(Class)、委托(delegate)、接口(interface)和数组。
注意,变量的值类型、引用类型跟参数传递中的值传递、引用传递是不同的概念,下面讲解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 }
传递变量的引用,在定义函数时必须使用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 }
原文:https://www.cnblogs.com/love-me-love-my-code/p/10425828.html