53226


partialメソッドはvoid privateでないといけませんがこれだと戻り値で非公開メソッドで  
あまりメリットを感じられないのですが実際はどうやって運用するのでしょうか？  
別のソースファイルで書くことができようが使い方に制限が多く使いづらいと思います。  
初心者ですがご教授お願い致します。

質問ですがpartial
はそのクラスすべてにpartialをつけてそのメソッドでもpartialをつけるという使い方でいいのでしょうか？またpartial関数は使えませんよね自分で試しましたがエラーになるので

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp3
    {       
        partial class Program
        {       
            partial class sample
            {
                public void print()
                {
                    f();
                }
    
                partial void f();            
            }
    
            static void Main(string[] args)
            {
                sample sa = new sample();
                sa.print();
    
                Console.ReadKey();
            }
        }
    }
    
[/code]

//別ソースファイル

[code]

    namespace ConsoleApp3
    {
        partial class Program
        {
            partial class sample
            {
                partial void f()
                {
                    Console.WriteLine("partial method");
                }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2019-03-06T00:48:47.020
53222
2019-03-06T02:54:48.890
2019-03-06T01:59:57.277
3060
question
c#
C# partial メソッドのメリットが知りたい。


C#言語は原則として１クラス１ファイルとなっています。しかし、この原則はプログラムによるコード自動生成が困難です。実際、C#
1.1までのWinFormsでは、開発者も編集を行うクラスファイルをデザイナープログラムがコード書き換えしていましたし、ASP.NETではそれすらもできないためトリッキーなクラス継承を行っていました。  
この問題を解決するために、C# 2.0でPartial ClassとPartial Methodが導入されました。Partial
Classの方は分かり易く、１クラスを自動生成ファイルと開発者による手書きファイルとに分離可能にします。WinFormsでも`.cs`ファイルと`.Designer.cs`ファイルに分離されています。

Partial Methodは分かりづらいですが同様の目的があります。自動生成ファイル内に拡張ポイントを設けたい場合に、コード生成ツールがPartial
Methodを宣言します。開発者による手書きファイル側でPartial
Methodの実体が定義されなければコンパイル時にメソッドそのものが消去されますし、開発者が定義すれば、呼び出し関係が成立します。  
安全に呼び出しを削除するための条件として、スコープを`private`とし戻り値を`void`にする必要があるわけです。

このような導入経緯ですので、もちろん、Partial Class・Partial
Method共に開発者が手書きしても問題はありませんが、基本的には使われることはないと思われます。


CC BY-SA 4.0
2019-03-06T02:02:00.443
53226
2019-03-06T02:02:00.443
4236
53222
answer


partial関連は、極めて限定的な目的を持った機能です。

前提となるpartialクラスの目的は、  
Formデザイナ機能に代表されるような「自動生成ソース」と「開発者が作る部分」を分離することです。

partialメソッドの主な使用目的は、自動生成ソースを作成する人たちが、  
そのソースに対してコールバックするポイントを用意しておくことです。

[code]

    // partialメソッド機能がなかった場合
    public partial class Class1
    {
        protected void DoProcess()
        {
            OnFooCalling?.Invoke(this, EventArgs.Empty);
            Foo();
            OnFooCalled?.Invoke(this, EventArgs.Empty);
    
            OnBarCalling?.Invoke(this, EventArgs.Empty);
            Bar();
            OnBarCalled?.Invoke(this, EventArgs.Empty);
        }
    
        protected event EventHandler OnFooCalling;
        protected event EventHandler OnFooCalled;
        protected void Foo()
        {
            // ... いろんな処理
        }
    
        protected event EventHandler OnBarCalling;
        protected event EventHandler OnBarCalled;
        protected void Bar()
        {
            // ... いろんな処理
        }
    }
    
[/code]

↓

[code]

    // partialメソッド機能を使った場合
    public partial class Class2
    {
        protected void DoProcess()
        {
            OnFooCalling();
            Foo();
            OnFooCalled();
    
            OnBarCalling();
            Bar();
            OnBarCalled();
        }
    
        partial void OnFooCalling();
        partial void OnFooCalled();
        protected void Foo()
        {
            // ... いろんな処理
        }
    
        partial void OnBarCalling();
        partial void OnBarCalled();
        protected void Bar()
        {
            // ... いろんな処理
        }
    }
    
[/code]

partialメソッドのメリット  
・実装しなかった場合、そもそも宣言されてなかったことになる。

partialメソッドのデメリット  
・EventHandler版と異なり、protectedにできないため継承クラスでハンドラ登録できない

<https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/keywords/partial-method>


CC BY-SA 4.0
2019-03-06T02:54:48.890
53229
2019-03-06T02:54:48.890
25396
53222
answer