我对C#中的结构数组有一个小问题:假设我有一个结构Foo
:
struct Foo
{
public string S;
public int X;
...
...
}
并且我具有CCD_ 2的阵列:Foo[] arr = ...
在一种方法中,我经常使用arr[i]
,所以我想将其保留在局部变量中(i
的表达式也有点长(:var f = arr[i]
现在,我的问题是,我知道structs是值类型的,这意味着像这样的赋值会导致复制。结构有点大(7个字符串和一个bool(,所以在这种情况下我宁愿避免复制。
如果我没有记错的话,在不复制结构的情况下访问结构的字段的唯一方法是直接使用数组:arr[i].S
或arr[i].X
,但这很快就会变得令人讨厌。我真的很想把数组元素保留在一个局部变量中,但我不想把它复制到变量中浪费性能。
有没有办法制作类似引用变量(类似于C++(的东西来避免复制?如果不是,我很好奇这是否是编译器优化的东西?
我应该如何处理这个元素?我可以在不复制的情况下将它放在本地变量中吗?还是必须通过数组访问它以避免复制?
提前谢谢。
您可以在C#7和更高版本中使用ref局部变量来完成此操作:
using System;
public struct LargeStruct
{
public string Text;
public int Number;
}
class Test
{
static void Main()
{
LargeStruct[] array = new LargeStruct[5];
// elementRef isn't a copy of the array value -
// it's really the variable in the array
ref LargeStruct elementRef = ref array[2];
elementRef.Text = "Hello";
Console.WriteLine(array[2].Text); // Prints hello
}
}
当然,我通常建议避免:
- 大型结构
- 可变结构
- 公共字段(尽管如果它是可变的,那么通过公共字段进行操作可能是最好的(
。。。但我承认总有例外。