■96827 / ) |
Re[2]: C#でunionを実現する方法 |
□投稿者/ 魔界の仮面弁士 (2967回)-(2021/02/16(Tue) 18:35:59)
|
■No96824 (魔界の仮面弁士) に追記 > fixed で代用してみるとか。
fixed 指定の場合は unsafe が必須になりますので、 プロジェクトのプロパティで、[ビルド]タブの「アンセーフ コードの許可」を 有効にしておいてください。
一応、unsafe が不要なバージョンも書いてみました。 (今回の要件には合わないと思います)
using System; public struct ST_1 { public float A; public float B; public float C; public float D; } public readonly ref struct ST_2 // 要 C# 7.2 以上 { private readonly Span<float> _span; public ref float Value1() => ref _span[0]; public ref float A => ref _span[1]; public ref float B => ref _span[2]; public ref float C => ref _span[3]; public ref float D => ref _span[4]; public Span<float> ValueArray => _span[1..5]; // 要 C# 8.0 以上 public ST_2(Span<float> span) => _span = span; }
class Program { static void Main() { ST_2 x = new ST_2(stackalloc float[5] { 1.23f, 2.34f, 3.45f, 4.56f, 5.67f }); // 要 C# 7.3 以上
Console.WriteLine("☆☆☆ 渡した値は 5 つ ☆☆☆"); Console.WriteLine($"Value1 = {x.Value1()}"); Console.WriteLine($"ValueArray[] = {{ {string.Join(", ", x.ValueArray.ToArray())} }}"); Console.WriteLine($"A = {x.A}"); Console.WriteLine($"B = {x.B}"); Console.WriteLine($"C = {x.C}"); Console.WriteLine($"D = {x.D}"); Console.WriteLine($"ValueArray[0] = {x.ValueArray[0]}"); Console.WriteLine($"ValueArray[1] = {x.ValueArray[1]}"); Console.WriteLine($"ValueArray[2] = {x.ValueArray[2]}"); Console.WriteLine($"ValueArray[3] = {x.ValueArray[3]}");
Console.WriteLine(); Console.WriteLine("☆☆☆ Value1, ValueArray[1], D を書き換え ☆☆☆"); x.Value1() = -123.45f; x.ValueArray[1] = -234.56f; x.D = -345.67f;
Console.WriteLine($"Value1 = {x.Value1()}"); // ★ 1.23 → -123.45 Console.WriteLine($"ValueArray[] = {{ {string.Join(", ", x.ValueArray.ToArray())} }}"); // ★ Console.WriteLine($"A = {x.A}"); Console.WriteLine($"B = {x.B}"); // ★ 3.45 → -234.56 Console.WriteLine($"C = {x.C}"); Console.WriteLine($"D = {x.D}"); // ★ 5.67 → -345.67 Console.WriteLine($"ValueArray[0] = {x.ValueArray[0]}"); Console.WriteLine($"ValueArray[1] = {x.ValueArray[1]}"); // ★ 3.45 → -234.56 Console.WriteLine($"ValueArray[2] = {x.ValueArray[2]}"); Console.WriteLine($"ValueArray[3] = {x.ValueArray[3]}"); // ★ 5.67 → -345.67
Console.ReadKey(); } }
|
|