2014-01-15 78 views
2

我想能够存储对数组的引用,但不确定是否需要指针或从何处开始。我正在寻找类似于使用ref的函数,但是在一个变量中。以C#存储数组的位置

+0

你是指“二维数组”还是“散列表”? – zey

+0

你的意思是你想要两个或多个变量指向同一个数组? –

+0

我的意思是我有一个数组,我需要能够在运行中访问它。它不在我需要访问它的范围之外,我不想复制它。我希望能够存储对该数组的引用,以便我可以通过它访问它。 – Zshelley

回答

4

假设有一个数组:

int[] a = new int[42]; 

可变a是到阵列的引用。你可以让一个又一个这样的:

int[] b = a; 

现在ab指同一阵列。

你可以像这样的值赋给一个元素:

a[0] = 666; 

,然后使用其他参考看到相同的价值:

Debug.Assert(b[0] == 666); 

什么将此归结为是事实上,数组是reference types。所以赋值运算符将引用复制到对象,并且不会复制对象本身。与value types对比,例如,结构体,为其赋值操作符复制对象的值。

+0

我觉得它的工作就是这样。假设b = a只会将a中的所有数据复制到b中。现在就试试,谢谢! – Zshelley

+1

@Zshelley数组是引用类型..因此,引用被复制..而不是他们引用的数据。 –

+0

副本仅适用于值类型。引用类型变量(所有对象)是指向堆中对象的指针 - 在C#中,它们看起来不像指针。在David的例子中,a和b是指针。但是,int a = 1; int b = a; (int是一个值类型)用值1的单独副本定义两个变量。您需要清楚地理解值和引用类型之间的差异。 –

0

如果您想存储对数组的引用,因为它们是引用类型,所以不需要使用C#等高级语言的指针(对内存位置的引用)。所有的引用类型变量都像指针一样工作,但引用到高级语言(如C#)中的内存位置的过程是完全自动的,并且对用户是隐藏的。

我已经回答了一个关于指针的问题(用Java编写)here。即使语言不同,Java也是像C#这样的高级语言,并且引用内存位置的过程也是类似的。

关于你的问题,如果你有一个这样的数组:

int[] myArray = new int[2]; 

你可以存储在另一个数组这样的引用:

int[] myStoredArrayRef = myArray; 

现在,两个对象指相同的数组,因为它们指的是内存中相同的“位置”(您复制了它的引用)。事实上,如果你用这种方式修改myArray元素:

myArray[0] = 123; 

myStoredArrayRef元素将发生变化:

Console.WriteLine(myStoredArrayRef[0]); //it will print '123'; 

你也可以存储到一个列表的引用,因为他们'reference types(正如@DavidHeffernan指出的那样)像数组一样,使用相同的过程。

+0

这也适用于列表? – Zshelley

+0

是的,因为它们也是参考类型。 –

+0

@Zshelley是的!大卫已经透露了我:-) –