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

如何在不复制C#的情况下将结构数组元素提取到变量中?,c#,arrays,struct,value-type,C#,Arrays,Struct,Value Type,我对C#中的struct数组有一个小问题:假设我有一个structFoo: structfoo { 公共字符串S; 公共int X; ... ... } 我有一个Foo数组: Foo[]arr=… 在一种方法中,我经常使用arr[I],因此我希望将其保存在局部变量中(I的表达式也有点长): var f=arr[i] 现在,我的问题是我知道结构是值类型的,这意味着像这样的赋值会导致复制。结构有点大(7个字符串和一个bool),所以在这种情况下我宁愿避免复制 如果我没有弄错的话,在不复制结构的情况

我对C#中的struct数组有一个小问题:假设我有一个struct
Foo

structfoo
{
公共字符串S;
公共int X;
...
...
}
我有一个
Foo
数组:
Foo[]arr=…

在一种方法中,我经常使用
arr[I]
,因此我希望将其保存在局部变量中(
I
的表达式也有点长):
var f=arr[i]

现在,我的问题是我知道结构是值类型的,这意味着像这样的赋值会导致复制。结构有点大(7个字符串和一个bool),所以在这种情况下我宁愿避免复制

如果我没有弄错的话,在不复制结构的情况下访问结构字段的唯一方法是直接使用数组:
arr[I].s
arr[I].X
,但这很快就会让人讨厌。我确实希望将数组元素保留在局部变量中,但我不希望将其复制到变量中而浪费性能

有没有一种方法可以制作类似于引用变量(类似于C++)的东西来避免复制?如果不是,那么我很好奇编译器是否优化了它

我应该如何处理这个元素?我可以在不复制的情况下将其放入局部变量中,还是必须通过数组访问以避免复制

提前感谢。

您可以在C#7和更高版本中使用ref局部变量执行此操作:

使用系统;
公共结构大结构
{
公共字符串文本;
公共整数;
}
课堂测试
{
静态void Main()
{
LargestStruct[]数组=新的LargestStruct[5];
//elementRef不是数组值的副本-
//它实际上是数组中的变量
ref LargeStruct elementRef=ref数组[2];
elementRef.Text=“你好”;
Console.WriteLine(数组[2].Text);//打印hello
}
}
当然,我通常会建议避免:

  • 大型结构
  • 可变结构
  • 公共字段(虽然如果它是可变的,那么通过公共字段执行该操作可能是最好的)

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

谢谢。我使用此结构在Unity项目中存储数据。这就是为什么我必须使用可变公共字段。至少,这个结构是私有的,所以我真的不在乎。