none
關於使用ref傳遞參數的情況 RRS feed

  • 問題

  •  

    請教各位前輩,我在程式當中使用ref的方式來傳遞物件,目的是為了能夠符合演算法的表示方式,但程式在執行的過程中發現到一個很嚴重的問題。以下列程式碼為例,當我使用了ref傳遞物件的方法執行完畢,在這之後,若是使用任何一個物件(指的是test1或test2或test3)的方法進行操作(在此範例中,是清除陣列內的元素),也會跟著修改到另外二個物件內的陣列,對我而言,這是一個很嚴重的錯誤。請問各位前輩,有什麼方式可以解決這個問題呢?

     

    main ()
    {
      //新增物件
      Reference test1 = new Reference();
      Reference test2 = new Reference();
      Reference test3 = new Reference();
     
      //新增test1.Myar內的元素和value
      for(int i=0;i<=5;i++)
      {
         test1.Myar.Add(i);
      }
      test1.value=20;

      //將 test1.Myar的元素複制到test2.Myar和test3.Myar

      test1.copy(ref test2.Myar,ref test3.Myar,ref test2.value);
     
      //清除test1.Myar內的元素
      test1.clear();

      /************顯示結果*******************/
      /*       test1.Myar=Null               */
      /*       test1.value=100               */
      /*       test2.Myar=Null;              */
      /*       test2.Myar=20;                */
      /*       test3.Myar=Null;              */
      /*       test3.value=0;                */
      /***************************************/

      /* 執行完test1.clear()後,test1.Myar內的元素都會清空,但問題是,會連帶把test2.Myar和test3.Myar也一併清空,另外特別的是,test2.value和test3.value並沒有一併被修改成為100,我猜想或許是arraylist有什麼特別的地  方。*/
    }

     

    public class Reference
    {
      public int value;
      public ArrayList Myar;
     
      public void copy(ref ArrayList input1,ref ArrayList inpt2,ref int input3)//利用ref的方式修改輸入的參數
      {
        input1=this.Myar;
        input2=this.Myar;
        input3=this.value;
      }
      public  void clear()//清除陣列
      {
        this.Myar.Clear();
        this.value = 100;
      }
      public Reference//物件初始化
      {
        this.Myar = new ArrayList();
        this.value = 0;
      }
    }

     

     

    ps.上述的程式是可以執行的

    2008年6月1日 下午 01:54

解答

  • public void copy(ref ArrayList input1, ref ArrayList input2, ref int input3) //利用ref的方式修改輸入的參數
    {
        input1 = (ArrayList)Myar.Clone();
        input2 = (ArrayList)Myar.Clone();
        input3 = this.value;
    }

    public Reference()//物件初始化
    {
        this.Myar = new ArrayList();
        this.value = 0;
    }

    2008年6月1日 下午 03:22

所有回覆

  • public void copy(ref ArrayList input1, ref ArrayList input2, ref int input3) //利用ref的方式修改輸入的參數
    {
        input1 = (ArrayList)Myar.Clone();
        input2 = (ArrayList)Myar.Clone();
        input3 = this.value;
    }

    public Reference()//物件初始化
    {
        this.Myar = new ArrayList();
        this.value = 0;
    }

    2008年6月1日 下午 03:22
  •  

    問題解決了,感謝chhuang大大的指點。我跑到msdn上去看了一下clone的說明,實在是不能理解何謂"淺層複製"?另外,為何利用了"淺層複製"就能夠解決這個奇怪的問題咧? 不知道能不能再次麻煩chhuang大再說明一下原因呢? 我非常的想要了解這種底層的知識呀~~再次感謝~

     

     

    題外話.....居然只用短短的程式碼就解決了我以為可能是bug的問題....(我還另外找了.net 2008來try),總覺得打的落落長的自已有點愚蠢...。

    2008年6月1日 下午 04:50