C# 传值与传址

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
 namespace ConsoleApplication1
 {
     class Program
     {
         /*   先来了解一下什么是实参, 什么是形参.   
               所谓形参其实也就是说函数定义的时候所带的参数.  比如 static void Myfuntion(int i , int t)  其中 int i  and int t 都是形参.
          *   而实参呢? 实参代表的是将要传入函数里面进行运算的两个参数, 可以是变量,也可以是常量.只要与形参类型相同即可*/
 
         // 函数分为传值与传址两种方式. 传值不影响实参的数据,传址则会影响实参的数据. 下面用几段代码来示例
           //在使用传值或者传址的选择上应当遵循这样一个规则.
             //1. 传值是将形参的内容复制一份给实参.
             //2. 传址是将形参与实参同时指向一个地址.
             //如果在数据较大的情况下使用传值的方式必然会影响程序性能, 所以当数据较大时可以使用传址的方式.使用传址的方式会让程序的效率大大提升.
         static void Myfuntion(int i , int t)  //这个函数将以传值的方式运行  
         {
             if (i > t)
                 i += 5;
             else
                 t += 5;
         }
 
         static void Myfuntion1(ref int i, ref int t) // 这个函数将会以传址的方式进行运算. 因为前面加了ref关键字, 函数只要加了ref关键字就会是以传址的方式进行运算
         {
             if (i > t)
                 i += 5;
             else
                 t += 5;
         }
 
         static void Myfuntion2(int[] array)  //这里注意, 这个函数没有带ref关键字, 但是也是以传址的方式进行运算. 因为在C#中,引用类型都是以传址的方式进行运算,而array属于数组, 数组又属于引用类型,所以....
         {
             for (int i = 0; i < array.Length; i++)
             {
                 array[i] = 40;
             }
         }
 
         static void Myfuntion3 (int i , int t , out int s)  //这个函数虽然返回值为Void(代表没有返回值) , 其实有返回值 因为我们加了一个新的关键字, out , 这个关键字能够将 s 单独返回. 同样out关键字也是以传址的方式进行运算的.  还有,out 参数可以不用赋值,即使你赋值了也会被忽略
         {
             s = 50;
             if (i > t)
                 i += 5;
             else
                 t += 5;
         }
 
         static void Main(string[] args)
         {
             // 现在我们来使用上面定义的四个函数,看看效果是怎样的.
             int a = 10, b = 15, c;
             //1. 传值方式的函数
             Myfuntion(a, b);  // 这个时候a and b 还是等于 10 和 15  , 因为函数中的形参虽然改变结果了. 但是不会影响到实参.
             Console.WriteLine("a : {0} and b : {1}",a,b + "\n");
 
             // 2. 传址方式的函数
             Myfuntion1(ref a, ref b); //这里要注意, 函数中使用了ref关键字,在调用的时候也要使用ref关键字.  此时的结果应该是a = 10 b = 20 因为上面的代码是传址方式的, 形参发生了改变也会影响到实参        
             Console.WriteLine("a : {0} and b : {1}",a,b + "\n");
 
             // 3.隐式的传址方式函数.
             int[] My = new int[5];  //定义一个数组并且为它赋值
             for (int i = 0; i < My.Length; i++)  
             {
                 My[i] = 30;
             }
             // 现在调用函数
             Myfuntion2(My);   //结果可想而知, my的每一位都会等于 50
             foreach (int w in My)
             {
                 Console.WriteLine(w);
                 Console.WriteLine();
             }
 
             // 4. out 参数函数
             Myfuntion3(a, b, out c); //同样, 和ref一样在调用的时候也需要加上关键字
             Console.WriteLine(c); // c应该会等于 50
             //我们试试把C赋值了之后再调用函数,看看会发生什么.
             c = 90;
             Myfuntion3(a, b, out c);
             Console.WriteLine(c);  //还是会等于50;
         }
     }
 }
 // 下面是运算结果
 
 /*  a : 10 and b : 15
 -------------------
 a : 10 and b : 20
 ------------------
 40
 
 40
 
 40
 
 40
 
 40
 ----------------------
 50
 ----------------------
 50
 

  * */


转http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html


调用调用是程序设计语言中函数或过程调用时传递参数的两种基本机制。 ### 调用(Call by Value) 在这种调用方式下,实际参数的具体会复制给形参。这意味着,在被调用的过程中对形参所做的任何修改都不会影响到实参本身。它通常用于需要保护原始数据不变的情况下,确保外部环境的数据安全性稳定性。 **特点:** - 参数传递的是变量的一份拷贝; - 函数内部的操作不会改变原变量的状态; - 更加安全可靠,因为不存在副作用; ```python # Python 示例 (Python 中所有不可变类型都是按值传递) def modify(x): x = 10 a = 5 modify(a) print(a) # 输出仍为5,不受函数内操作的影响 ``` ### 调用(Call by Reference 或 Call by Address) 而地址则是将实际参数内存位置的信息提供给了形式参数,使得两者共享相同的存储空间。因此如果在过程中改变了形参的内容,则相应的结果同样会在实参上体现出来。这种方式可以节省时间空间开销,并允许返回多个计算结果等优点。 **注意:** 某些高级语言如 C++、C#, Java 支持直接引用类型的传递, 其他像 Python 则是以对象引用的方式间接实现了类似的效果. **特点:** - 直接作用于原有数据; - 可能会影响原来的变量内容; - 提高效率并简化某些算法; ```cpp // C++ 示例 void swap(int &x , int &y){ int temp=x; x=y; y=temp; } int main(){ int a=4,b=6; cout << "交换前:" << endl; cout<<"a="<<a<<", b="<<b<<endl; swap(a,b); cout<<"\n交换后:"<<endl; cout <<"a=" <<a<< ", b="<<b ; } /* 运行以上代码将会打印出: 交换前: a=4, b=6 交换后: a=6, b=4 */ ``` 这两种调用模式各有优劣,开发者应当根据具体情况选择合适的策略来编写高效可靠的软件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值