多くのC ++開発者がひどいC#コードを書いているのを見てきたので、これは非常に良い質問です。
C#を「より良い構文を備えたC ++」と考えないことが最善です。彼らはあなたの思考で異なるアプローチを必要とする異なる言語です。C ++を使用すると、CPUとメモリが何をするのかを常に考えるようになります。C#はそうではありません。C#は、特にCPUとメモリについて考えるのではなく、作成するビジネスドメインについて考えるように設計されています。
私が見たこの一例は、多くのC ++開発者がforeachよりも高速であるため、forループの使用を好むことです。これは通常、C#では不適切なアイデアです。反復されるコレクションの種類(およびコードの再利用性と柔軟性)が制限されるためです。
C ++からC#に再調整する最善の方法は、異なる視点からコーディングを試みることです。最初は、これは難しいでしょう。なぜなら、長年にわたって、あなたの脳で「CPUとメモリが何をしているのか」スレッドを使用して、書いたコードをフィルタリングすることに完全に慣れるからです。ただし、C#では、代わりにビジネスドメイン内のオブジェクト間の関係について考える必要があります。「コンピューターは何をしているのか」とは対照的に「何をしたいのか」。
リストにforループを書く代わりに、オブジェクトのリスト内のすべてに何かをしたい場合は、を取り、IEnumerable<MyObject>
使用するメソッドを作成しますforeach
ます。
具体的な例:
確定的なクリーンアップを必要とするリソース(ファイルなど)の有効期間を制御します。これは手元で簡単に使用できますが、リソースの所有権を転送するときに適切に使用するにはどうすればよいでしょうか(...スレッド間)?C ++では、単に共有ポインタを使用して、適切なタイミングで「ガベージコレクション」を処理します。
これをC#で(特にスレッド間で)実行しないでください。ファイルに対して何かを行う必要がある場合は、一度に1か所で行ってください。クラス間で渡されるアンマネージリソースを管理するラッパークラスを作成することは問題ありません(実際には良い習慣です)。管理されていないリソースの所有権を共有しないでください。Dispose
パターンを使用して、クリーンアップを処理します。
特定のジェネリックの関数をオーバーライドすることに常に苦労しています(C ++での部分的なテンプレートの特殊化などが大好きです)。C#でジェネリックプログラミングを行う試みを放棄する必要がありますか?ジェネリックは意図的に制限されている可能性があり、特定の問題領域を除いてジェネリックを使用するのはC#っぽくないですか?
C#のジェネリックは、ジェネリックになるように設計されています。ジェネリックの特殊化は、派生クラスで処理する必要があります。List<T>
それがa List<int>
またはaである場合、なぜ異なる振る舞いをするのList<string>
ですか?上の操作はすべてList<T>
に適用するなどの一般的なので、ある任意の List<T>
。aの.Add
メソッドの動作を変更する場合は、内部でジェネリックを使用しますが、異なる方法で処理List<string>
を行う派生クラスMySpecializedStringCollection : List<string>
または合成クラスMySpecializedStringCollection : IList<string>
を作成します。これにより、リスコフの代替原則に違反したり、クラスを使用する他のユーザーを過度にねじ込んだりすることを回避できます。
マクロのような機能。一般に悪い考えですが、問題の一部の領域では、他の回避策はありません(たとえば、デバッグリリースにのみ送信されるログのように、ステートメントの条件付き評価)。それらがないということは、if(condition){...}定型文を追加する必要があり、副作用を引き起こすという点ではまだ同じではないことを意味します。
他の人が言ったように、プリプロセッサコマンドを使用してこれを行うことができます。属性はさらに優れています。一般に、属性はクラスの「コア」機能ではないものを処理するための最良の方法です。
要するに、C#を書くときは、CPUとメモリではなく、ビジネスドメインのみを考えるべきだということに留意してください。必要に応じて後から最適化できますが、コードには、マップしようとしているビジネス原則間の関係を反映させる必要があります。
C#
他のコードを生成するために使用します。あなたは読むことができるCSV
か、XML
またはあなたが入力として何を提出しており、生成C#
またはSQL
ファイルを。これは、機能マクロを使用するよりも強力です。