Благодаря новым функциям-членам, доступным только для чтения, в C # 8 , я пытаюсь минимизировать ненужное копирование экземпляров структуры в моем коде.
У меня есть foreach
итераций над массивамиструктуры, и в соответствии с этим ответом это означает, что каждый элемент копируется при итерации по массиву.
Я подумал, что теперь я могу просто изменить свой код, чтобы предотвратить копирование, вот так:
// Example struct, real structs may be even bigger than 32 bytes.
struct Color
{
public int R;
public int G;
public int B;
public int A;
}
class Program
{
static void Main()
{
Color[] colors = new Color[128];
foreach (ref readonly Color color in ref colors) // note 'ref readonly' placed here
Debug.WriteLine($"Color is {color.R} {color.G} {color.B} {color.A}.");
}
}
К сожалению, это не компилируется с
CS1510 A ref or out value must be an assignable variable
Однако при использовании индекса, подобного следующему, компилируется:
static void Main()
{
Color[] colors = new Color[128];
for (int i = 0; i < colors.Length; i++)
{
ref readonly Color color = ref colors[i];
Debug.WriteLine($"Color is {color.R} {color.G} {color.B} {color.A}.");
}
}
Является ли мой синтаксис в foreach
Альтернатива неверна, или это просто невозможно в C # 8 (возможно, из-за того, как перечисление реализовано внутри)?Или C # 8 в настоящее время применяет некоторые интеллектуальные возможности и больше не копирует Color
экземпляры самостоятельно?