今日のC#インタラクティブ (2017/06/15) ~StructLayout編~

こんにちは、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になった!

今回はここまでです。

コメントを残す

WordPress.com で次のようなサイトをデザイン
始めてみよう