3

データに対してこの操作を何度も実行する必要があります。

public void AddBehavior(BehaviorTypes type)
{
    if (Enum.IsDefined(typeof(BehaviorTypes), type))
    {
    switch (type)
    {
        case BehaviorTypes.render:
            return new renderable();
        break;   
    }
}

これは、2 つの明示的な関数呼び出しと、オブジェクトのボックス化/ボックス化解除操作です! この操作は、列挙型を境界チェックするにはコストが高すぎます。もっと安い代替品を知っている人はいますか?

4

3 に答える 3

2

非常に標準的なトリックは、最初と最後の値を指定する列挙型宣言にメンバーを追加することです。

enum BehaviorTypes {
    First = One,    
    One = 1,
    Two,
    Three,
    Last = Three
}

これは超高速のテストで、約 1 ナノ秒かかります。

public void AddBehavior(BehaviorTypes type)
{
    if (type >= BehaviorTypes.First && type <= BehaviorTypes.Last) {
       // etc..
    }
}

あなたの switch ステートメントは、このチェックの必要性をすでに排除していることに注意してください。

于 2012-07-27T12:04:12.367 に答える
1

Enum.GetValues を使用して、列挙型のすべての既存の値を、静的メンバーの最適化されたコレクションで一度だけ抽出できます。次に、そのコレクションを検索する必要があります。

1つの列挙型のみが考慮されている場合、最も速いのはブール値の配列であり、積分が列挙型に存在するかどうかを示していると思います。この配列の構築 (1 回のコスト) を除いて、enum から int への変換と、配列への読み取りアクセス (私が間違っていなければ、これが最速です ?) があります。

于 2012-07-27T10:08:40.970 に答える