C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
掲示板トップ
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
上記ツリーを一括表示
/
上記ツリーをトピック表示
上記の記事へ返信
入力内容にタグは利用できません。
他人を中傷する記事は管理者の判断で予告無く削除されます。
半角カナは使用しないでください。文字化けの原因になります。
名前、コメントは必須記入項目です。記入漏れはエラーになります。
入力内容の一部は、次回投稿時の手間を省くためブラウザに記録されます。
URL は自動的にリンクされます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
名前
(*必須)
E-Mail (任意)
Web サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No96829 (魔界の仮面弁士 さん) に返信 > ■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(); > } > }
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-