こんにちは、Takymです。
C#インタラクティブの時間です。
> using System.Runtime.InteropServices;
// ↑ちゃんとusingしておこう。
> [StructLayout(LayoutKind.Explicit)]
. struct TEST {
. [FieldOffset(0)]
. ulong UInt32Value;
. [FieldOffset(0)]
. long SInt32Value;
. [FieldOffset(0)]
. double DoubleValue;
. [FieldOffset(0)]
. bool FlagValue;
. }
// よし、構造体はこんな実装でいいかな。
// 初期値を設定しよう。
> TEST t = new TEST();
> t.UInt32Value = 0x12345678;
(1,3): error CS0122: 'TEST.UInt32Value' はアクセスできない保護レベルになっています
// ↑あ、ちょっと失敗した。
// 全部publicにして・・・
> [StructLayout(LayoutKind.Explicit)]
. struct TEST
. {
. [FieldOffset(0)]
. public ulong UInt32Value;
. [FieldOffset(0)]
. public long SInt32Value;
. [FieldOffset(0)]
. public double DoubleValue;
. [FieldOffset(0)]
. public bool FlagValue;
. }
> TEST t = new TEST();
> t.UInt32Value = 0x12345678;
// これでどうだ!
// うん、問題なし。
> t
[Submission#4+TEST]
// あ、そういえば、ToStringを実装しなきゃいけなかったね・・・
// もう一度、実装
> [StructLayout(LayoutKind.Explicit)]
. struct TEST
. {
. [FieldOffset(0)]
. public ulong UInt32Value;
. [FieldOffset(0)]
. public long SInt32Value;
. [FieldOffset(0)]
. public double DoubleValue;
. [FieldOffset(0)]
. public bool FlagValue;
.
. public override string ToString()
. {
. return $"UInt32Value:{UInt32Value},SInt32Value:{SInt32Value},DoubleValue:{DoubleValue},FlagValue:{FlagValue}";
. }
. }
// 流石にもう何もないよね・・・
> TEST t = new TEST();
> t.UInt32Value = 0x12345678;
> t
[UInt32Value:305419896,SInt32Value:305419896,DoubleValue:1.50897478170006E-315,FlagValue:True]
// なんか少数が複雑だなぁ
// falseを入れてみよう
> t.FlagValue = false;
> t
[UInt32Value:305419776,SInt32Value:305419776,DoubleValue:1.50897418882129E-315,FlagValue:False]
// 少し変わった。
// 1.5だとどうなる!?
> t.DoubleValue = 1.5;
> t
[UInt32Value:4609434218613702656,SInt32Value:4609434218613702656,DoubleValue:1.5,FlagValue:False]
// 整数値が!?
// 1
> t.SInt32Value = 1;
> t
[UInt32Value:1,SInt32Value:1,DoubleValue:4.94065645841247E-324,FlagValue:True]
// おお!FlagValueがtrueになった!
今回はここまでです。