2012-11-08 116 views
-1

我需要更改從GetCell方法獲得的數組單元格對象。當我嘗試更改收到的對象時,它不會更改原來的對象。爲什麼對象引用不能引用預期的對象?

這是它的外觀在代碼:

// this is in MyClass 
A[,] arr = new A[100,500]; 

// this is in main class 
MyClass GetAAt(Point p) { return myClass.arr[p.X,p.Y]; } 
var a = GetAAt(new Point(23,45)); 
a = new A(); // this only changes the local `a` but not the arr[23,45] 

我在做什麼錯在這裏?

回答

3

您沒有更改收到的對象。
相反,您正在更改一個用於保存接收到的對象的變量,以代之以保留一個全新的對象。

+0

那麼我該怎麼做我想做的事? – user1306322

+0

@ user1306322:你不能。 – SLaks

+0

你仍然可以解決問題,你只需要努力一點就可以了。 [看我的回答](http://stackoverflow.com/a/13298796/1159478)爲例。 – Servy

0

aarr[23, 45]是引用類型(指針)

設置anew A()僅使其指向一個新的對象。它實際上並沒有改變它指向的對象。

你可能有一個方法添加到MyClass,消除/重新初始化值)

嘗試增加一個類似的方法,您MyClass

public void ResetAAt(int i, int j) 
{ 
    arr[i, j] = new A(); 
} 
+0

對不起,我忘了提及'arr'在另一個類 – user1306322

+0

@ user1306322我編輯了我的答案 –

1

你是分配新的實例變量a。你可以添加一個新的方法到類

void SetAAt(Point p, A a) 
{ 
    arr[p.X,p.Y] = a; 
} 

,並調用它像這樣:

Point p = new Point(23,45); 
var a = new A(); 
SetAAt(p, a); 

附:你不應該將你的數組命名爲班級的同名。雖然這是可能的,但我認爲這不是一個好的做法。

+0

該數組的名稱是'arr'。這是一系列'A's。 – user1306322

+0

@SamIam對不起,沒有任何錯誤。這是他使用Point的方式,我試圖改變他的代碼。我會編輯我的答案。 –

0

返回的是對該數組中該位置的對象的引用。然後,您將該返回值設置爲一個變量。以任何方式更改那些變量引用不會影響數組。

你需要做的是增加一個間接的另一層:

public class Wrapper 
{ 
    private A[,] array; 
    private Point position; 

    public Wrapper(A[,] array, Point position) 
    { 
     this.array = array; 
     this.position = position; 
    } 

    public A Value 
    { 
     get 
     { 
      return array[position.X, position.Y]; 
     } 
     set 
     { 
      array[position.X, position.Y] = value; 
     } 
    } 
} 

這將允許你在GetAAt創建一個包裝,退貨,並有WrapperValue變化,並能看到它反映在底層數組中。

相關問題