2012-11-08 120 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变化,并能看到它反映在底层数组中。

相关问题