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

わんくま同盟

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

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


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


管理者用

- Child Tree -