static void Main(string[] args)
 { 
      object i = 10;
      Change(i);
      Console.WriteLine(i);
      Console.Read();
 }
static void Change(object i)
{
  i = (object)(100);
}
代码大致就是这样的,为什么输出的i依然是 10 呢?请高人指点一下,谢谢!!

解决方案 »

  1.   

    传到change中的i和main方法中的i不是同一个对象,传参时已近复制了一个i到change中(因为i是基数据类型,你用object也没用)
      

  2.   

     public static void getxx(ref int i)
            {
                i = 100;
            }int i = 10;
                getxx(ref i);
                Console.WriteLine(i);//print>>>100public static void getxx(int i)
            {
                i = 100;
            }int i = 10;
                getxx(i);
                Console.WriteLine(i);//print>>>10
      

  3.   

    楼主的方法是值传递,不会改变传递参数的值的,可用ref或者out来传值static void Main(string[] args)
    {
          object i = 10;
          Change(ref i);
          Console.WriteLine(i);
          Console.Read();
    }
    static void Change(ref object i)
    {
      i = (object)(100);

      

  4.   

     object i = 10; 
     Change(i); 
     Console.WriteLine(i); 
     Console.Read(); static void Change(out object i) 

      i = (object)(100); 

    使用地址传递
      

  5.   

     object i = 10;
     Console.WriteLine(i.GetType());//确实显示i是System.Int32类型(值类型)
     object i = new datatable();
     Console.WriteLine(i.GetType());//显示i是System.data.datatable类型(引用类型)
    因此可以说,由于值类型和引用类型都继承自object,因此用object实例化对象时,编译器会根据赋值的具体情况来确定究竟是值类型还是引用类型。
    所以,值类型和引用类型都继承自object,不能说object是引用类型哦
      

  6.   

     只有new出来的对象才会在堆中分配内存
    java传参数,都是值传递,引用类型传递的对堆中值的引用,即地址。
    而Object i = 0 ; 没有在堆分配内存,它传递的是值得副本。
      

  7.   

    static void Main(string[] args) 

          object i = 10; 
          Change(i); 
          Console.WriteLine(i); 
          Console.Read(); 

    static void Change(object i) 

      i = (object)(100);   //关键在这一步,这样写就是重写创建一个对象赋值给此方法中的i,这是i就不在只想原来的的i了,相当于从新new 了个对象,所以结果还是10

      

  8.   

    static void Main(string[] args)
            {
                object i = 10;
                Change(i);
                Console.WriteLine(i);
                Console.Read();
            }
            static void Change(object i)
            {
                Console.Write(i.GetHashCode());
                i = (Object)100;
                Console.Write(i.GetHashCode());
            } 
    结果 10  100   10
      

  9.   

    这个解释好清楚,学习了欢迎大家来我的博客
    http://blog.csdn.com/csdbfans
      

  10.   

    个人理解:
            static void Main(string[] args) 
            { 
                object i = 10;         //1.i是引用类型变量,引用(i)和值(10)都在栈上
                Change(i);             //2.传递i(即10的地址)
                Console.WriteLine(i);  //5.显示Main中i的值,即10
                Console.Read(); 
            } 
            static void Change(object i) //3.此处i也是引用类型,接收传递过来的数据(即10的地址,此时Change的i与Main的i这两个引用都指向栈上的同一个数据:10)
            { 
                i = (Object)100;     // 4.等号右边装箱了一个引用类型,并通过等号赋值给了Change的i,即此时Change的i不再指向10,而是100了。但树上操作不会影响Main的i
            } 
      

  11.   

    我坚定的认为object是个引用类型!
      

  12.   

    对于Object i = 10的理解:10是System.Int32的一个实例,而Sytem.Int32间接继承于Object,故Obejct i = 10 无非是一个基类的引用指向一个子类的实例而已,特别之处在于这个实例在栈上,而非通常的堆上,这也很正常。
      

  13.   

    抱歉,我澄清一下,确实Object是引用类型,上面除了“不能说object是引用类型哦”其他都是正确的。
    之所以i是值类型,因为他的引用指向了一个值类型。
      

  14.   

    object i = 10;//这里i是值类型
    Change(i); //由于change参数是object,而i是object的子类,所以是兼容类型传入的,虽然可以执行代码,但是i依然是值类型
    }
    static void Change(object i)//这里参数i是引用类型
    {
      i = (object)(100);
      

  15.   

    楼上说的对,i还是值类型,用值类型当参数接受看看,别忘了加上ref