コードの特定の部分を最適化しようとしていますが、パフォーマンス ループがタイトになっています。主に、将来適用できる新しいことを学ぼうとしています。私の実装は非常に長いので、私が達成しようとしていることの一般的な例を挙げます。
私の質問はこれに関連しています: C# 'is' operator performance、特に選択された答えに関連しています。
クラス A があるとします。A から派生したクラス B もあります。タイプ A (A と B のタイプの混合を含む) のリストがあります。これらのアイテムを処理する方法で、オブジェクトの実際のタイプに基づいて特定の動作を実現したいと考えています (これが正しい言い方であるかどうかはわかりません。何か間違ったことを言っている場合は修正してください)。
void Process(A item)
{
if (item is A)
{
DoBehavior((A)item); //I know the cast is redundant here, I'm just leaving
//it here for my explanation.
}
else if (item is B)
{
DoBehavior((B)item);
}
}
void DoBehaviour(A item)
{
//perform necessary behaviour for type A
}
void DoBehaviour(B item)
{
//perform necessary behaviour for type B
}
これが私が現在行っている方法です。A と B を含むタイプ A のリストを繰り返し処理していることに注意してください。また、状況を明確にするのに十分なコードを提供していないと思われる場合は、喜んで拡張します。
上に投稿した質問: C# 'is' operator performanceで、構造を変更して "as" 演算子を使用し、明示的なキャストを完全に取り除くことができることを学びました。
B bItem = item as B;
if (bItem != null)
{
DoBehavior(bItem);
}
これはすべて問題ありませんが、実際には、A と B だけでなく、C、D などもあり、すべて基本クラス A から派生しています。これにより、これらの if ステートメントの多くが発生します。最高のパフォーマンスを得るには、ネストする必要があります。
B bItem = item as B;
if (bItem != null)
{
DoBehavior(bItem);
}
else
{
C cItem = item as C;
if (cItem != null)
{
DoBehavior(cItem);
}
else
{
//and so on.
}
}
今、これは醜いです。私はきちんとしたエレガントなコードを書くのが好きですが、それを行うのは非常に苦手です (そのため、見栄えを良くするために時間を無駄にすることがよくあります)。
この質問が広すぎないことを願っていますが、まず、関連する動作が実行されるように型を取得する際に、より最適でクリーンなソリューションがあるかどうかを知りたいと思います。そうでない場合、これらの「as」演算子をこのようにネストするよりもクリーンな方法はありますか?
別の方法として、動作を基本クラス A に移動し、派生クラスごとにオーバーライドすることが考えられます。ただし、より高い思考の意味では、私のこの特定のケースでの動作は、クラス A (またはその子) の動作ではなく、むしろ、それに作用/動作する外部クラスです (タイプごとに異なる動作をします)。 )。他に良い方法がなければ、今説明したように実装を強く検討しますが、これについて専門家の意見を求めたいと思います。
これを短くしようとしましたが、詳細を省略しすぎた可能性があります。その場合はお知らせください。