C#下の依頼

2810 ワード

ここ数日迷ったので、心を静めて本をかじることにした.
以下の内容は『C#in depth』第2版から来ており、主に私個人のまとめです.
依頼(delegate)とは何ですか.
C++の面から言えば,依頼すなわち関数ポインタ
だから、依頼は以下のことができます.
  • は、関数
  • を指す.
  • 指向関数
  • を実行する.
    しかし、関数ポインタというタイプなのか、実際の関数ポインタの例なのかを明らかにすることを忘れないでください.また,依頼には依頼タイプと依頼インスタンスの違いもある.
    実際、依頼を使用するには、2つのステップが必要です.
  • は、委任タイプ
  • を宣言する.
  • 宣言された委任タイプで委任インスタンス
  • を作成する.
    必ず依頼タイプと依頼インスタンスの違いをはっきりさせなければなりません!
    異なる関数には異なる署名と方法があり,委任指向関数も基本法に従わなければならない.
    たとえば、次の委任タイプを宣言します(最初のステップ)delegate void MyDelegate(int arg1);
    次の依頼例を再宣言します(ステップ2)MyDelegate test;
    では、委任インスタンスtestは、intパラメータの関数を持つ戻り値voidを指すことができます.
    依頼タイプはタイプだけで、実際のインスタンスではなく、実際の用途があるはずがありません.依頼例を作成するしかありません
    依頼の呼び出し
    依頼をインスタンス化すると、Invoke()メソッドを使用してその指向関数を呼び出すことができます.
    また、C#は文法糖も提供しており、依頼例を直接関数として直接実行することができます.(コンパイル後はこの2つの書き方に違いはありません)
    class Program
    {
        delegate String StringProcess(String a);    //        (         ,       class Program{} ,
                                                    //         )
        static String Plus(String a){
            return a+"world";
        }
        public static void Main(string[] args)
        {
            StringProcess func=new StringProcess(Plus); 
            Console.WriteLine(func("hello "));      //Console.WriteLine(func.Invoke("hello "));     
            //  hello world
            Console.Read();
        }
    }

    上記の例ではStringProcess func = new StringProcess(Plus);が依頼インスタンスfuncのインスタンス化を行ったStringProcess func = Plusと略記することもできます
    連結依頼
    依頼は関数ポインタとは異なる大きな特徴であり,依頼が複数の関数を同時に指して呼び出すことができることである.+=+演算子により,同一の委任タイプの異なる委任インスタンスを統合し,新しい委任を得ることができる.
    また,+=は直接関数に作用し,直接関数を依頼に加えることもできる.会いましょう.-=演算子は、1つのメソッドを依頼から削除することができる.(-=演算子が2つの依頼に作用すると、Delegate subtraction has unpredictable resultという警告が表示され、コンパイルによって実行後にエラーが報告され、何が起こっているのかよく分かりません.本には関連内容は記載されていません)
    class Program
    {
        delegate void MyDelegate();
        static void func(){
            Console.Write("Hello");
        }
        static void func2(){
            Console.WriteLine(" World");
        }
        public static void Main(string[] args)
        {
            MyDelegate t1=func;
            MyDelegate t2=func2;
            t1+=t2;             //    
            t1();
            Console.Read();
        }
    }

    2つ目:
    public static void Main(string[] args)
    {
        MyDelegate t1=func;
        MyDelegate t2=func2;
        MyDelegate t3=t+t2;     //          
        t3();
        Console.Read();
    }

    3つ目:
    public static void Main(string[] args)
    {
        MyDelegate t=func;
        t+=func2;               //             
        t();
        Console.Read();
    }

    以上の3つの書き方の最後の出力結果はすべてHello Worldです
    依頼例は変わりにくい(immutable)
    Stringタイプと同様に、委任された+、+=操作、-=操作は、元のインスタンスを変更せずに新しいインスタンスを返します.