0

私はデリゲートの使用法を学ぼうとしています.私が見たすべてのコード例は、パラメータを使用して内部メソッドに渡します.

この例の目的は、フォームの起動時にパラメーターを渡さずに 2 つのメッセージ ボックスを開くことです。これは私が試したコードですが、内部関数を呼び出す方法がわかりません。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Messageboxes2
{
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        Delegation delegated = new Delegation();
        delegated.
    }

}
class Delegation
{    
    public delegate string mbox ();

    static void msgboz1(mbox d)
    {
        MessageBox.Show("1rstBox");
    }
    static void msbox2(mbox d)
    { 
        MessageBox.Show("2ndbox");
    }
}
}

助けてくれてありがとう

4

2 に答える 2

0

デリゲートをパラメーターとして渡すだけでは、メソッドは呼び出されません。デリゲートについてもっと学び、理解を深めるために以下を試すことができます。

public partial class MainForm : Form
{
public MainForm()
{
    InitializeComponent();
    Delegation.Invoke(Delegation.msgboz1);
    Delegation.Invoke(Delegation.msbox2);
}

}
class Delegation
{    
public delegate void mbox ();

public static void msgboz1()
{
    MessageBox.Show("1rstBox");
}
public static void msbox2()
{ 
    MessageBox.Show("2ndbox");
}
public static void Invoke(mbox method)
{ 
    method();
}
}

編集: BeginInvoke メソッドを使用してメソッドを非同期的に呼び出すことができます。

class Program
{
    static void Main(string[] args)
    {
        Delegation.MethodCaller mc1 = new Delegation.MethodCaller(Delegation.Method1);
        Delegation.MethodCaller mc2 = new Delegation.MethodCaller(Delegation.Method2);
        mc1.BeginInvoke(null, null);
        mc2.BeginInvoke(null, null);
        Console.ReadLine();
    }

    class Delegation
    {
        public delegate void MethodCaller();

        public static void Method1()
        {
            Console.WriteLine("Method 1 Invoked");
            Thread.Sleep(2000);
            Console.WriteLine("Method 1 Completed");
        }
        public static void Method2()
        {
            Console.WriteLine("Method 2 Invoked");
            Thread.Sleep(2000);
            Console.WriteLine("Method 2 Completed");
        }
    }
}
于 2012-06-08T10:16:43.537 に答える
0

まず、その 2 つのメソッドからパラメーターを削除します。ラムダ式について知っている場合は、次のようになります。

mbox myMboxDelegate = new mBox(() =>
{
   msgboz1();
   msbox2();
});

myMBoxDelegate();

または試してください:

mbox myMboxDelegate = new mBox();
myMboxDelegate += msgboz1();
myMboxDelegate += msbox2();
myMboxDelegate();
于 2012-06-08T10:22:34.940 に答える