質問

最新の部分メソッドについて読みました C#言語仕様, 原理は理解できましたが、実際にどうやって使っているのか気になりますよね。部分的な方法から恩恵を受ける特定の設計パターンはありますか?

役に立ちましたか?

解決

部分メソッドは、.Net 2 に部分クラスがあったのと同様の理由で導入されました。

部分クラスは、複数のファイルに分割できるクラスです。コンパイラは、実行時にそれらすべてを 1 つのファイルに構築します。

この利点は、コーダーがクラスの一部で作業している間に、Visual Studio がクラスの一部にグラフィカル デザイナーを提供できることです。

最も一般的な例はフォーム デザイナです。開発者は、ほとんどの場合、ボタンや入力ボックスなどを手動で配置することを望んでいません。

  • .Net 1 では、コードは自動生成されました。 #region ブロック
  • .Net 2 では、これらは個別のデザイナー クラスになりました。フォームは依然として 1 つのクラスであり、開発者によって編集されるファイルとフォーム デザイナによって編集される 1 つのファイルに分割されるだけです。

これにより、両方のメンテナンスがはるかに簡単になります。マージはより簡単で、VS フォーム設計者がコーダーの手動による変更を誤って取り消してしまうリスクが少なくなります。

.Net 3.5 では Linq が導入されました。Linq には、データ構造を構築するための DBML デザイナーがあり、自動コードを生成します。

ここでの追加点は、開発者が入力する可能性のあるメソッドを提供するために必要なコードです。

開発者はこれらのクラスを (追加の部分ファイルを使用して) 拡張するため、ここでは抽象メソッドを使用できませんでした。

もう 1 つの問題は、ほとんどの場合、これらのメソッドは呼び出されず、空のメソッドを呼び出すのは時間の無駄であることです。

空のメソッド 最適化されていない.

したがって、Linq は空の部分メソッドを生成します。独自のパーシャルを作成してそれらを完成させない場合、C# コンパイラーはそれらを最適化するだけです。

この部分メソッドを実行できるように、常に void を返します。

新しい Linq DBML ファイルを作成すると、次のような部分クラスが自動生成されます。

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

次に、独自の部分ファイルでこれを拡張できます。

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

これらのメソッドを拡張しない場合は、すぐに最適化されます。

部分メソッドをパブリックにすることはできません。その場合、他のクラスが呼び出すためにそのメソッドが存在する必要があります。独自のコード ジェネレーターを作成する場合は、それが便利であることがわかりますが、それ以外の場合、実際に役立つのは VS デザイナーだけです。

前に述べた例は、可能性の 1 つです。

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

もう 1 つの潜在的な用途は、大規模で複雑なクラスが複数のファイルにまたがっている場合に、呼び出し側ファイルで部分参照が必要になる可能性があることです。ただし、その場合は、まずクラスを単純化することを検討する必要があると思います。

他のヒント

部分メソッドは概念上 GoF と非常によく似ています。 テンプレートメソッド 行動パターン(デザインパターン, 、p325)。

これらにより、アルゴリズムまたは操作の動作を 1 か所で定義し、別の場所で実装または変更できるため、拡張性とカスタマイズが可能になります。コードがすっきりしていると考えたので、C# 3.0 ではテンプレート メソッドの代わりに部分メソッドを使用し始めました。

優れた機能の 1 つは、実装されていない部分メソッドはコンパイルされて除去されるため、実行時のオーバーヘッドが発生しないことです。

コード生成 これは、それらが存在する主な理由の 1 つであり、それらを使用する主な理由の 1 つです。


編集:そのリンクは Visual Basic に固有の情報へのものですが、同じ基本原則が C# にも当てはまります。

私はそれらを軽いイベントだと考えています。再利用可能なコード ファイル (通常は自動生成されますが、必ずしも自動生成されるわけではありません) を用意し、実装ごとに、部分クラスで必要なイベントを処理するだけで済みます。実際、これが LINQ to SQL での使用方法 (そして、この言語機能が発明された理由) です。

C#.NET 3.0 の部分クラスに最適なリソースは次のとおりです。 http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

私は部分クラスの使用を避けるようにしています (デザイナー ファイル用に Visual Studio によって作成された部分クラスを除きます)。それらは素晴らしいです)。私にとって、クラスのすべてのコードを 1 か所にまとめることの方が重要です。クラスが適切に設計されており、1 つのことを表現している場合 (単一責任の原則)、その 1 つのコードのすべてが 1 か所にあるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top