投稿数 - 437, コメント - 55168, トラックバック - 156

int は何から出来ている?

シェアードソース CLIのソースを眺めていて思った事。

「int は何から出来ているんだ?」

全く同様の事を議論している掲示板を過去に見た覚えがあるが(多分@IT)、失念してどこだか分からなくなってしまった。そもそも私には内容が全く理解できなかったが。

C# の int は System.Int32 のエイリアスだ。つまり、

int a;

System.Int32 a;

と書いているのと同じであるという事。

しかし、それだとどうにも納得できないのが、Int32 のソース。
なんと、Int32 は内部に自分自身を持っているのだ。
構造体は循環参照ができないはず。なのに、Int32 はやっちゃっている。

.NET の型は大きく分けて「値型」と「参照型」である。しかしやはり「組み込み型」というものが存在するのだろう。
IL は直接 int を操作できる命令がある。
つまり 「int = Int32」とはならないで、C# コンパイラは、「int = IL の組み込み int」と扱っている。
Int32 に定義されているメソッドを使用しようとしたとき初めて「int は Int32」として扱われる。

int a = 1;
Int32 a = 1;
ldc.i4.1
stloc.0

どちらも、同じ IL になるが、Int32 を使っているというのは微塵も感じれない。

次のようにしたときに初めて、Int32 が顔を出す。

string s = a.ToString();
call instance string [mscorlib]System.Int32::ToString()

結論。
「int は Int32 のエイリアス」
ではなく
「Int32 は 定義されているメソッドを使わない限り、int のエイリアスとして扱われる」

以上、完全に推測です。更に追求中・・・。

投稿日時 : 2005年11月12日 16:07

フィードバック

# re: int は何から出来ている?

こっそー

int a = new int();
Int32 b = new Int32();
int c = new Int32();
Int32 d = new int();
2005/11/15 12:36 | おぎわら

# re: int は何から出来ている?

どういうことですか~TT
何かメッセージなんですか~!?
ふ、深すぎます。
2005/11/15 12:47 | 囚人

# re: int は何から出来ている?

IL 解析かな?
2005/11/15 14:37 | じゃんぬ

# re: int は何から出来ている?

int a = new int();
Int32 b = new Int32();
int c = new Int32();
Int32 d = new int();

int e;
Int32 f;

decimal g = new decimal();

short h = new short();
long i = new long();
float j = new float();
double k = new double();
-------------------------------------------
.locals init ([0] int32 a,
[1] int32 b,
[2] int32 c,
[3] int32 d,
[4] int32 e,
[5] int32 f,
[6] valuetype [mscorlib]System.Decimal g,
[7] valuetype [mscorlib]System.Decimal h,
[8] int16 i,
[9] int64 j,
[10] float32 k,
[11] float64 l)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4.0
IL_0003: stloc.1
IL_0004: ldc.i4.0
IL_0005: stloc.2
IL_0006: ldc.i4.0
IL_0007: stloc.3
IL_0008: ldloca.s g
IL_000a: initobj [mscorlib]System.Decimal
IL_0010: ldloca.s h
IL_0012: initobj [mscorlib]System.Decimal
IL_0018: ldc.i4.0
IL_0019: stloc.s i
IL_001b: ldc.i4.0
IL_001c: conv.i8
IL_001d: stloc.s j
IL_001f: ldc.r4 0.0
IL_0024: stloc.s k
IL_0026: ldc.r8 0.0
IL_002f: stloc.s l

おお!
やはりそうなのかな・・・。
2005/11/15 15:13 | 囚人

# Equals と ==

Equals と ==
2006/02/03 15:15 | 囚人のジレンマな日々

# VOqPjwAhodkHwriapMg

xrumer ??????30????????????????5??????????????? | ????????

コメントの投稿

タイトル
名前
URL
コメント