23

部分メソッドの使用法を理解するのに苦労しています。

LINQ やその種のデータベースに関係のない例を挙げていただけますか?

部分メソッドは、WinForms にいてその背後でコーディングしている場合と同じですか?メソッドを使用するとコンパイルされますが、使用しない場合はコンパイラによって削除されますか? あれは正しいですか?

4

3 に答える 3

32

部分クラスがある場合、あるファイルでメソッドのシグネチャを定義し、別のファイルで実装することができます。それは部分的な方法です。

したがって、1つのファイルには次のものがあります。

partial class Foo
{
    partial void Bar();  // no implementation

    public void DoSomething()
    {
        // do some stuff...
        Bar();    // this will be removed if Bar isn't implemented in another partial class
        // do something else...
    }
}

そして別のあなたが持っている

partial class Foo
{
    partial void Bar()
    {
        // do something...
    }
}

Barこれにより、実装されているかどうかを気にせずに最初のファイルを呼び出すことができますBar。がどこかに実装されていない場合Bar、それへの呼び出しは削除されます (ここから):

部分メソッドを使用すると、クラスの一部の実装者は、イベントと同様にメソッドを定義できます。クラスの他の部分の実装者は、メソッドを実装するかどうかを決定できます。メソッドが実装されていない場合、コンパイラはメソッド シグネチャとメソッドへのすべての呼び出しを削除します。メソッドの呼び出しは、呼び出しでの引数の評価から発生する結果を含め、実行時には影響しません。したがって、実装が提供されていない場合でも、部分クラスのコードは部分メソッドを自由に使用できます。メソッドが呼び出されても実装されていない場合、コンパイル時または実行時のエラーは発生しません。

部分メソッドは void を返す必要があります。そうしないと、メソッドが実装されていない場合にすべてのメソッド呼び出しを削除するのは安全ではなくなります。

部分メソッドの宣言は、コンテキスト キーワードの partial で開始する必要があり、メソッドは void を返す必要があります。

部分クラスと同様に、主な用途は生成されたコードの操作です。

部分メソッドは、生成されたコードをカスタマイズする方法として特に役立ちます。メソッド名と署名を予約できるため、生成されたコードはメソッドを呼び出すことができますが、開発者はメソッドを実装するかどうかを決定できます。部分クラスと同様に、部分メソッドを使用すると、コード ジェネレーターによって作成されたコードと人間の開発者によって作成されたコードを、ランタイム コストなしで連携させることができます。

そのため、部分メソッド (生成されたコードでは実装なしで定義されている) を呼び出すコードを生成している可能性があり、必要に応じてその部分クラスを自由に拡張し、その部分メソッドを実装できます。

于 2016-04-11T20:12:25.913 に答える
6

これは、私が自分のプログラミングで使用した例です... 教師として、私は仲間の学生にコードサンプルを提供することがよくあります。しかし、時間の経過とともに複雑になっていくコーディング プロジェクトを 1 つずつ実現してほしいと思います。より具体的には、メニューを実行して、実装する必要があるクラスをテストおよび駆動するためのコードを提供するとします。ステップ1では、メニューはシンプルです。そして、新しいステップごとに、より多くのクラス機能をテストするためのメニュー項目が追加されます。したがって、最初は単純なメニューを実行する 1 つのファイルを提供し、完全なソリューションに向かって進んだら、新しいプログラミングを実行して確認するためのファイルをさらに提供します。これは次のように行うことができます。

// --- File MenuStep1.cs ---
partial class Menu
{
    // This array is populated with more and more items at every new steps
    readonly List<MenuItem> MenuItems = new List<MenuItem>();

    public void Show()
    {
        // Code to show menu here
    }

    // Suppose we have a Main here, but that's not necessary
    public static void Main()
    {
        new Menu().Show();   
    }

    // These are hooking methods to add menu items later
    partial void InitStep2();
    partial void InitStep3();
    partial void InitStep4();

    public Menu()
    {
        InitStep1();
        InitStep2();
        InitStep3();
        InitStep4();
    }

    void InitStep1()
    {
        // Code that adds menu items, but only for step 1
    }
}

部分メソッド InitStep2、3、および 4 はまだ定義されていないため、呼び出されないことに注意してください (さらに、コンパイルもされません)。後で、次のようにメニューを自動的に拡張するファイルを提供します。

// --- File MenuStep2.cs ---
partial class Menu
{
    partial void InitStep2()
    {
        // Code that adds more menu items
    }
}

// --- File MenuStep3.cs ---
partial class Menu
{
    partial void InitStep3()
    {
        // Code that adds more menu items
    }
}

等。

于 2018-10-15T09:17:41.187 に答える