15. 值传递和引用传递

一、值传递和引用传递

   1、什么是值传递?

  答:值传递是指在调用函数时将实际参数(实参)复制一份传递到函数中,系统将为目标对象重新开辟一个完全相同的内存空间。这样在函数中如果对参数进行修改,将不会影响到实际参数。

  2、什么是引用传递?

  答:所谓引用传递是指在调用函数时将实际参数(实参)的地址传递到函数中,那么在函数中对参数所进行的修改,也会影响到实际参数。相当于使目标对象和原始对象对应同一个内存存储空间。

  3、怎么用?

  (1)值传递:

 1         //类型1:
 2         void Fun(int a)   //a形参                        
 3         {
 4             a = 10;
 5         }
 6         static void Main(string[] args)
 7         {
 8             int b = 20;   //b实参
 9             Program f = new Program();
10             //这里发生了值传递,结果等于20
11             f.Fun(b);
12             Console.WriteLine(b);
13             Console.ReadKey();
14         }

 

 1         //类型2:
 2         void AddNumber(int num1)
 3         {
 4             num1 += 100;
 5         }
 6         static void Main(string[] args)
 7         {
 8             int b = 20;
 9             Program f = new Program();
10             //这里发生了值传递,结果等于20
11             f.AddNumber(b);
12             Console.WriteLine(b);
13             Console.ReadKey();
14         }

 

  (2)引用传递:

 1         //类型1:ref关键字
 2         void Fun(ref int a)
 3         {
 4             a = 10;
 5         }
 6         static void Main(string[] args)
 7         {
 8             int b = 20;
 9             Program f = new Program();
10             //这里发生了引用传递,结果等于10
11             f.Fun(ref b);
12             Console.WriteLine(b);
13             Console.ReadKey();
14         }
 1         //类型2:
 2         void AddNumber(ref int num1)  //num1形参
 3         {
 4             num1 += 100;
 5         }
 6         static void Main(string[] args)
 7         {
 8             int b = 20;             //b实参
 9             Program f = new Program();
10             //这里发生了引用传递,结果等于120
11             f.AddNumber(ref b);
12             Console.WriteLine(b);
13             Console.ReadKey();
14         }

 

 

二、总结

  1、基本数据类型(int,float,double,char)都是值传递;
  2、类的实例化对象与数组都是“引用传递”;
  3ref 关键字可以把基本数据类型的值传递,改为“引用传递”;
  4out 关键字是“输出参数”关键字。

例:

1、实例化对象:(引用传递)

 1         //实参
 2         public string _strName = "张三";
 3         public int _intHeight = 180;
 4         void AddNumber(Program per)   //形参
 5         {
 6             per._strName = "李四";
 7             per._intHeight = 200;
 8         }
 9         static void Main(string[] args)
10         {
11             Program perObj = new Program();
12             perObj.AddNumber(perObj);
13             //结果输出为“200、李四”,说明实参改变了。所以为引用类型
14             Console.WriteLine(perObj._intHeight);
15             Console.WriteLine(perObj._strName);
16             Console.ReadKey();
17         }

 

2、out关键字

 1         //利用 out 关键字实现多个返回值
 2         public void ComputerNumber(int intNum1,int intNum2,out int intAddResult,out int intSubResult)
 3         {
 4             intAddResult = intNum1 + intNum2;
 5             intSubResult = intNum1 - intNum2;
 6         }
 7         static void Main(string[] args)
 8         {
 9             Program Obj = new Program();    //实例化
10             int intAddResult1 = 0;
11             int intSubResult1 = 0;
12             Obj.ComputerNumber(10, 20, out intAddResult1, out intSubResult1);
13             //输出结果为30和-10
14             Console.WriteLine(intAddResult1);
15             Console.WriteLine(intSubResult1);
16             Console.ReadKey();
17         }

 

posted @ 2017-10-05 10:05  LiuChangwei  阅读(308)  评论(0编辑  收藏  举报