class P
    {
        public int a = 10;
        public void math(object c)
        {
            c = (int)c +a;
            Console.WriteLine(c);
        }
        static void Main(string[] args)
        {
            P a1 = new P();
            object d = 4;
            a1.math(d);
            Console.WriteLine(d);        }
    }
答案14
    4这道题目我想问,d不是引用类型的字段么,照理说不用加ref也可以引用传递,可这里d最后还是4,没有变化。请问高手怎么理解?

解决方案 »

  1.   

    引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。
      

  2.   

    引用所指向的数据包括引用本身的值...另外可能还有该值的从属数据如该值的属性值...在你的例子中该引用仅仅是一个装箱的int...所以不能改变其数据...
      

  3.   

    public class Location
       {
          private int xVal;
          private int yVal;      public Location( int xCoordinate, int yCoordinate )
          {
             xVal = xCoordinate;
             yVal = yCoordinate;
          }      public int x
          {
             get
             {
                return xVal;
             }
             set
             {
                xVal = value;
             }
          }      public int y
          {
             get
             {
                return yVal;
             }
             set
             {
                yVal = value;
             }
          }      public override string ToString()
          {
             return ( String.Format( "{0}, {1}", xVal, yVal ) );
          }   }   public class Tester
       {
          public void myFunc( Location loc )
          {
             loc.x = 50;
             loc.y = 100;
             Console.WriteLine( "In MyFunc loc: {0}", loc );
          }
          static void Main()
          {
             Location loc1 = new Location( 200, 300 );
             Console.WriteLine( "Loc1 location: {0}", loc1 );
             Tester t = new Tester();
             t.myFunc( loc1 );
             Console.WriteLine( "Loc1 location: {0}", loc1 );
          }
       }
    }
    答案是200,300
          50,100
          50,100
    那这里locl是class引用类型,为什么它前面不加 ref,直接可以引用传递
      

  4.   

    那有你們說的那么復雜
      public void math(object c)
            {
                c = (int)c +a;
                Console.WriteLine(c);
            } 
    object c 注意這個,傳遞參數的時候,是重新開辟新的空間給c, c = (int)c +a這個結果是要重新開闢新的空間給最後的結果,引用類型定義好后,它的值並不會改變的,比如 string s="a";string s1=s; s=s+"b",
    s1還是等於s,s的值並沒有改變
      

  5.   

    [Quote=引用 11 楼 cccwwwjjj0077 的回复:]
    引用 9 楼 vrhero 的回复: 
     当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值  
        
      引用所指向的数据包括引用本身的值...另外可能还有该值的从属数据如该值的属性值...  
      
     能说的详细点么?
    [/Quote
    s1的值当然不会发生变化,始终为"a",而s不是应该变为"ab"了吗?当s=s+"b"的时候,内存新开辟了1个空间给s,此时s为"ab",原来的s则被销毁
      

  6.   

    s1的值当然不会发生变化,始终为"a",而s不是应该变为"ab"了吗?当s=s+"b"的时候,内存新开辟了1个空间给s,此时s为"ab",原来的s则被销毁
      

  7.   


    当s=s+"b"的时候,内存新开辟了1个空间给s,此时s为"ab",原来的s则被销毁,這里的銷毀好像不是很合適,應該是到s的作用域結束才銷毀或者其他的,s原來的地址空間的內容始終存在的
      

  8.   

    什么例子不好举,你偏要跟string过不去...去看看书,string恰好是一种特殊的引用类型...
      

  9.   

     我觉得问题在这
     c = (int)c +a; 
    拆箱
      

  10.   

    可能是我沒有表達清楚,
      public void math(object c)
            {
                c = (int)c +a;
                Console.WriteLine(c);
            }
    object c 注意這個,傳遞參數的時候,是重新開辟新的空間給c,重新new了一個新的對象,并不是在原來實參的空間上進行加的,所以原來的沒有變化,還是指向原來的地址