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

わんくま同盟

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

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

■96829 / 3階層)  C#でunionを実現する方法
□投稿者/ 魔界の仮面弁士 (2968回)-(2021/02/16(Tue) 19:09:54)
No96827 (魔界の仮面弁士) に追記
> 一応、unsafe が不要なバージョンも書いてみました。

ST_1 を使うのを忘れていたので書き直し。(structData の階層が抜けてました!)

fixed 版と比べると元コードからの変更点が多くなるので、
今回の目的とは合わないと思いますが。

using System;
public readonly ref struct ST_1
{
 private readonly Span<float> _span;
 public ref float A => ref _span[0];
 public ref float B => ref _span[1];
 public ref float C => ref _span[2];
 public ref float D => ref _span[3];
 public ST_1(Span<float> span) => _span = span;
}
public readonly ref struct ST_2
{
 private readonly Span<float> _span;
 public ref float Value1() => ref _span[0];
 public readonly Span<float> ValueArray => _span[1..5];
 public readonly ST_1 StructData => new ST_1(_span[1..5]);
 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 });

  Console.WriteLine("☆☆☆ 渡した値は 5 つ ☆☆☆");
  Console.WriteLine($"Value1 = {x.Value1()}");
  Console.WriteLine($"ValueArray[] = {{ {string.Join(", ", x.ValueArray.ToArray())} }}");
  Console.WriteLine($"StructData.A = {x.StructData.A}");
  Console.WriteLine($"StructData.B = {x.StructData.B}");
  Console.WriteLine($"StructData.C = {x.StructData.C}");
  Console.WriteLine($"StructData.D = {x.StructData.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], StructData.D を書き換え ☆☆☆");
  x.Value1() = -123.45f;
  x.ValueArray[1] = -234.56f;
  x.StructData.D = -345.67f;

  Console.WriteLine($"Value1 = {x.Value1()}"); // ★ 1.23 → -123.45
  Console.WriteLine($"ValueArray[] = {{ {string.Join(", ", x.ValueArray.ToArray())} }}"); // ★
  Console.WriteLine($"StructData.A = {x.StructData.A}");
  Console.WriteLine($"StructData.B = {x.StructData.B}"); // ★ 3.45 → -234.56
  Console.WriteLine($"StructData.C = {x.StructData.C}");
  Console.WriteLine($"StructData.D = {x.StructData.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[2]: C#でunionを実現する方法 /魔界の仮面弁士 →Re[4]: 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
  └ Re[2]: C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 18:35) #96827
    └ C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 19:09) #96829 ←Now
      └ Re[4]: C#でunionを実現する方法 / 魔界の仮面弁士 (21/02/16(Tue) 19:36) #96830
        └ Re[5]: C#でunionを実現する方法 / taro (21/02/19(Fri) 13:43) #96856

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