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

わんくま同盟

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

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

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

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: C#でunionを実現する方法 /魔界の仮面弁士 →Re[3]: C#でunionを実現する方法 /魔界の仮面弁士
 
上記関連ツリー

C#でunionを実現する方法 / taro (21/02/16(Tue) 14:53) #96816
Re[1]: C#でunionを実現する方法 / Hongliang (21/02/16(Tue) 15:04) #96818
Re[1]: C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 16:58) #96824
  ├ Re[2]: C#でunionを実現する方法 / taro (21/02/16(Tue) 18:05) #96826
  │└ Re[3]: C#でunionを実現する方法 / Hongliang (21/02/16(Tue) 19:02) #96828
  └ C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 18:35) #96827 ←Now
    └ Re[3]: C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 19:09) #96829
      └ Re[4]: C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 19:36) #96830
        └ Re[5]: C#でunionを実現する方法 / taro (21/02/19(Fri) 13:43) #96856

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信