3

これら 2 つの項目間のパフォーマンスへの影響は何ですか? 私は最近静的クラスを見てきましたが、どうすればよいかわかりません。

public enum SomeEnum
{
   One = 1,
   Two,
   Three
}

public static class SomeClass
{
   public static readonly int One = 1;
   public static readonly int Two = 2;
   public static readonly int Three = 3;
}
4

3 に答える 3

15

違いはタイプセーフです。これらの列挙型が 2 つあるとします。どのように違いを見分けるつもりですか:

void SomeMethod(int x, int y)

// Compiles, but won't do what you want.
SomeMethod(SomeOtherClass.Xyz, SomeClass.One);

void SomeMethod(SomeEnum x, SomeOtherEnum y)

// Compile-time error
SomeMethod(SomeOtherEnum.Xyz, SomeEnum.One)

したがって、特定の値のセットの 1 つになりたい式がある場合はいつでも、列挙型を使用する場合、どの値のセットに関心があるかをリーダーとコンパイラの両方に明確にすることができますint だけで...それほど多くはありません。

于 2011-04-05T20:59:42.190 に答える
4

列挙型は IL に直接埋め込まれますが、フィールド (クラスにあるものなど) にはフィールド ロード命令が必要ですが、これは少し高価になる可能性があります。以下は、列挙型とフィールドを受け入れるメソッドを呼び出すための IL コードです。

 IL_0001:  ldc.i4.1
  IL_0002:  call       void ConsoleApplication2.Program::TestMethod(valuetype ConsoleApplication2.SomeEnum)
  IL_0007:  nop
  IL_0008:  ldc.i4.3
  IL_0009:  call       void ConsoleApplication2.Program::TestMethod(valuetype ConsoleApplication2.SomeEnum)
  IL_000e:  nop
  IL_000f:  ldsfld     int32 ConsoleApplication2.SomeClass::Two
  IL_0014:  call       void ConsoleApplication2.Program::TestMethod(int32)
  IL_0019:  nop
  IL_001a:  ldsfld     int32 ConsoleApplication2.SomeClass::One
  IL_001f:  call       void ConsoleApplication2.Program::TestMethod(int32)
于 2011-04-05T21:17:03.947 に答える
2

1 つには、型の安全性、少なくとも簡単に回避されない型の安全性があります。たとえば、列挙値を使用して、次のような関数プロトタイプを作成できます。

void Foo( SomeEnum 値 );

一方、静的クラスでは、int パラメーターを使用する必要があります。確かに、タイプ セーフをキャストすることはできますが、その方が使いやすく、より明確になり、変換もより簡単に実行できます。また、enum は自動インクリメント値、デバッガーでのプリティ プリント サポート、プロパティ グリッドなどのコントロールとのバインドの利点を提供します。あなたはアイデアを得る。

于 2011-04-05T21:00:36.887 に答える