如何在不复制C#的情况下将结构数组元素提取到变量中



我对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].Sarr[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
}
}

当然,我通常建议避免:

  • 大型结构
  • 可变结构
  • 公共字段(尽管如果它是可变的,那么通过公共字段进行操作可能是最好的(

。。。但我承认总有例外。

最新更新