C# Tips
−intとInt32はどう違う?−
[トップ]
[目次]
C#のint型と.NET FrameworkクラスライブラリのInt32クラス
C#にはint、long、byteなどといった型があります。
.NET FrameworkにはSystem.Int32、System.Int64、System.Byteなどといったクラスがあります。
これらはどう違うのでしょう?
1
2
3
4
5
6
7
8
9
|
private void Test_int() {
int i = 0;
i = 5;
Func_int(i);
}
private int Func_int(int i) {
return i;
}
|
intを使ったコード
|
1
2
3
4
5
6
7
8
9
|
private void Test_Int32() {
Int32 i = 0;
i = 5;
Func_Int32(i);
}
private Int32 Func_Int32(Int32 i) {
return i;
}
|
Int32を使ったコード
|
これをildasmで表示してみました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
.method private hidebysig instance void
Test_int() cil managed
{
// Code size 13 (0xd)
.maxstack 2
.locals init (int32 V_0)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4.5
IL_0003: stloc.0
IL_0004: ldarg.0
IL_0005: ldloc.0
IL_0006: call instance int32 Test::Func_int(int32)
IL_000b: pop
IL_000c: ret
} // end of method Test::Test_int
.method private hidebysig instance int32
Func_int(int32 i) cil managed
{
// Code size 6 (0x6)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldarg.1
IL_0001: stloc.0
IL_0002: br.s IL_0004
IL_0004: ldloc.0
IL_0005: ret
} // end of method Test::Func_int
|
intを使ったコードのil
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
.method private hidebysig instance void
Test_Int32() cil managed
{
// Code size 13 (0xd)
.maxstack 2
.locals init (int32 V_0)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4.5
IL_0003: stloc.0
IL_0004: ldarg.0
IL_0005: ldloc.0
IL_0006: call instance int32 Test::Func_Int32(int32)
IL_000b: pop
IL_000c: ret
} // end of method Test::Test_Int32
.method private hidebysig instance int32
Func_Int32(int32 i) cil managed
{
// Code size 6 (0x6)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldarg.1
IL_0001: stloc.0
IL_0002: br.s IL_0004
IL_0004: ldloc.0
IL_0005: ret
} // end of method Test::Func_Int32
|
Int32を使ったコードのil
|
違いがわかりますか?
というか違いはありません。
intとInt32はまったく同じもの
実はわざわざilを調べるまでもなく、「C#言語仕様 4.1.3 単純型」
[Web]
[ms-help]
にちゃんと「これら(intとか)の予約語はエイリアスでしかない」と書いてあります。
だから違いがなくてあたりまえです。
Int32はクラスじゃなくてほんとは構造体
Int32とかはクラスじゃなくて、ほんとは構造体(struct)です。
リファレンスでもちゃんと使い分けています。
C++のclassとstructは、デフォルトの可視性がprivateかpublicかという違いくらいしかありませんが、
C#(というかCLS)のclassとstructは参照型か値型かという大きな違いがあります。
この辺のことは値型と参照型に書いてます。
[トップ]
[目次]
株式会社ディーバ 青柳 臣一
2002/04/13