C# 获取对变量的引用并避免不必要地复制它

C# 获取对变量的引用并避免不必要地复制它,c#,reference,C#,Reference,假设我有一个这样的类: class Array{ int[] values; } 现在假设我有一个类,它存储了大量的Arrays: class ArrayOfArrays{ Array[] arrays; } 假设,出于某种原因,我想得到数组中最后一个数组,并放入一个变量(为了更好的可读性)。在C语言中,我想要Array last=&ArrayOfArraysObject.arrays[lastIndex]。因为我不会修改它,为了获得更好的性能,我不需要复制整个数组,只需要一

假设我有一个这样的类:

class Array{
    int[] values;
}
现在假设我有一个类,它存储了大量的
Array
s:

class ArrayOfArrays{
    Array[] arrays;
}
假设,出于某种原因,我想得到
数组
中最后一个
数组
,并放入一个变量(为了更好的可读性)。在C语言中,我想要
Array last=&ArrayOfArraysObject.arrays[lastIndex]
。因为我不会修改它,为了获得更好的性能,我不需要复制整个数组,只需要一个引用就可以了


我可以在C#中有这种行为吗?(在不使用函数调用的情况下,我不想仅仅为了使用关键字
ref
,而创建一个函数,这看起来有点过分了)

您可以创建一个
public
属性,返回
数组的最后一个元素

class ArrayOfArrays
{
    Array[] arrays;

    public Array LastOfArrays { get { return arrays.Last(); } }
}
测试它: 现在,
aoa.array[LastElement]。值[0]
也将是
333
。因此,基本上在这里保留引用,而不是复制整个数组

确认:

您可以创建一个
public
属性,该属性返回
数组的最后一个元素

class ArrayOfArrays
{
    Array[] arrays;

    public Array LastOfArrays { get { return arrays.Last(); } }
}
测试它: 现在,
aoa.array[LastElement]。值[0]
也将是
333
。因此,基本上在这里保留引用,而不是复制整个数组

确认:

数组已使用C#中的引用。你不必做任何特别的事情,你就能得到你想要的行为:

int[][] foo = new int[][] { new int[] {1,2,3}, new int[]{4,5,6}, new int[]{7,8,9} };        
var bar = foo[2];
foo[2][2] = 0; // make a change **after** assigning to bar  
Console.WriteLine(bar[2]); // outputs "0" -- bar knows about the change

bar[1] = 6; // same thing, but in reverse
Console.WriteLine(foo[2][1]); // outputs "6" -- foo knows about the change

在上面的示例中,
foo[2]
bar
是对内存中相同数组的引用
bar不仅仅是一个副本。

数组已经在C#中使用了引用。你不必做任何特别的事情,你就能得到你想要的行为:

int[][] foo = new int[][] { new int[] {1,2,3}, new int[]{4,5,6}, new int[]{7,8,9} };        
var bar = foo[2];
foo[2][2] = 0; // make a change **after** assigning to bar  
Console.WriteLine(bar[2]); // outputs "0" -- bar knows about the change

bar[1] = 6; // same thing, but in reverse
Console.WriteLine(foo[2][1]); // outputs "6" -- foo knows about the change

在上面的示例中,
foo[2]
bar
是对内存中相同数组的引用
bar
不仅仅是一个副本。

返回最后一个元素的属性如何?这与直接访问
ArrayOfArraysObject.arrays[lastIndex]
没有太大区别。为了可读性(并保持效率),如果可能的话,我更愿意创建一个类似于引用变量的东西。它确实保留了引用。对于C语言中那些生锈的,如果你做了
Array last=&ArrayOfArraysObject.arrays[lastIndex]
,那么下一行将替换外部
数组[]中的最后一个条目
使用新数组时,对象
最后一次
引用是否会更改?在C中,在我的情况下,这无关紧要。我不会修改数组,只想用一个可以理解的名称访问它,而不必复制整个数组。返回最后一个元素的属性如何?这与直接访问
ArrayOfArraysObject.arrays[lastIndex]
没有多大区别。为了可读性(并保持效率),如果可能的话,我更愿意创建一个类似于引用变量的东西。它确实保留了引用。对于C语言中那些生锈的,如果你做了
Array last=&ArrayOfArraysObject.arrays[lastIndex]
,那么下一行将替换外部
数组[]中的最后一个条目
使用新数组时,对象
最后一次
引用是否会更改?在C中,在我的情况下,这无关紧要。我不会修改数组,只是想用一个可以理解的名称访问它,而不必复制整个数组。如果不是
array[]arrays
,而是
List array
,这会有什么不同吗?只有当列表中的项目数发生变化时,才需要知道哪一个是最后一个。在我的示例中,
引用仍然有效,但它将继续引用相同的数组,即使该数组不再是最后一个数组。如果不是
数组[]数组
,而是
列表数组
,则会有所不同吗?只有当列表中的项目数发生变化时,才需要知道哪一个是最后一个。在我的示例中,
bar
引用仍然有效,但它将继续引用相同的数组,即使该数组不再是最后一个数组。