黑马程序员训练营--浅谈c#中值传递和引用传递

来源:互联网 发布:js unicode编码转换 编辑:程序博客网 时间:2024/06/06 02:29

---------------------- Windows Phone 7手机开发、.Net培训 期待与您交流! ----------------------

c#中都有哪些值类型哪些引用类型?
C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

值类型和引用类型的含义是什么?
值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。)
引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递的对象完全是同一栈中对象。)

      
以值传递参数
当实参当作值来传递时,就产生了一个新的拷贝。
这时候x和p是两个不同的内存空间,将x的值拷贝一份传到p这个命名空间中,这时候p这个内存空间就跟x的内存空间的值相同的,但也仅此而已,他们两个并没有关系!当程序员改变p内存空间的值的时候,由于x和p不在同一个内存空间中,所以这时候x内存空间的值并不会改变!
通俗点说,一张农行的银行卡和一张建行的银行卡,里面都有100元钱,这时候你往建行里面存一百块钱,农行里面的余额还是100元!

   class Test 
   { 
       static void Main(string[] args) 
       { 
           int x=8; 
           Fo(x); 
           Console.WriteLine("x={0}", x); 
       } 
     
       static void Fo(int p) 
       { 
           p = p + 1; 
           Console.WriteLine("p={0}", p); 
       } 
   } 
执行结果为:p=9 x=8

以引用传递参数
使用ref关键字时,表示是用引用的方式传递参数,实参和形参都是同一个对象,改变其中一个值,另一个值也会改变
下面这个例子,将x的内存空间地址,传给p,这时候x和p公用一个内存空间,当程序员在Fo方法里改变了这个内存空间的值,那么,x的值也会随着改变
通俗点说,你有一张农行的银行卡和一张与之关联的存折,这时候你往银行卡里存了一百块钱,然后拿着存折去查看余额,你会发现存折里也增加了100元,这就是说银行卡跟存折的数据在一个内存中,改变任意一个,另一个也会改变!
       static void Main(string[] args) 
       { 
           int x = 8; 
           Fo(ref x); 
           Console.WriteLine("x={0}", x); 
       } 
 
       static void Fo(ref int p) 
       { 
           
           p = p + 1; 
           Console.WriteLine("p={0}", p); 
       }
执行结果为:p=9 x=9

两个通俗的例子如有不足之处,请指正,谢谢!

 

 

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

 详细请查看:http://net.itheima.com/