C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■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();
 }
}
返信 編集キー/


管理者用

- Child Tree -