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