8

最近、c#とイベントを頻繁に使用していますが、独自のイベントを作成して使用し始めたところです。なぜeventキーワードを使用するのか少し混乱していますが、デリゲートのみを使用しても同じ結果が得られました。

public partial class Form1 : Form
{
    ServerConnection connection = new ServerConnection();

    public Form1()
    {
        InitializeComponent();
        connection.ref = new del(MethOne);
        connection.ref += new del(MethTwo);
    }

    public void MethOne(object message)
    {
        MessageBox.Show((string)message);
    }

    public void MethTwo(object message)
    {
        MessageBox.Show((string)message);
    }

}


public delegate void del(string message);



public class ServerConnection
{
    private TcpListener tcpListener;
    public del ref;
    
    private List<NetworkStream> clientList = new List<NetworkStream>();

    public ServerConnection()
    {
        this.tcpListener = new TcpListener(IPAddress.Any, 3000);
        ThreadStart startListening = new ThreadStart(ListenForClients);
        Thread startThread = new Thread(startListening);
        startThread.Start();
    }


    public void ListenForClients()
    {
        tcpListener.Start();
        ParameterizedThreadStart handleClient = new ParameterizedThreadStart(HandleClient);

        while (true)
        {
            TcpClient newClient = tcpListener.AcceptTcpClient();
            Thread handleClientThread = new Thread(handleClient);
            handleClientThread.Start(newClient);
        }
    }


    public void HandleClient(object newClient)
    {
        NetworkStream clientStream = ((TcpClient)newClient).GetStream();
        clientList.Add(clientStream);

        BinaryFormatter formatter = new BinaryFormatter();
        string message;

        while (true)
        {
            message = (string)formatter.Deserialize(clientStream);
            ref((string)message);
        }
    }
4

5 に答える 5

8

見て

C#イベントとデリゲート

eventキーワードは、デリゲート宣言の修飾子であり、インターフェイスに含めることができ、宣言するクラス内からの呼び出しを制約し、カスタマイズ可能なアクセサーのペア(追加と削除)を提供し、の署名を強制します。デリゲート(.NET Framework内で使用される場合)。

于 2012-10-23T03:57:06.410 に答える
7

eventキーワードを使用すると、宣言に沿って操作を指定できますaddremove

private Action _myEvent;

public event Action MyEvent
{
    add
    {
        Console.WriteLine("Listener added!");
        _myEvent += value;
    }
    remove
    {
        Console.WriteLine("Listener removed!");
        _myEvent -= value;
    }
}
于 2012-10-23T04:00:43.353 に答える
3

目的は、イベントとは何か、単なるコールバックとは何かを識別することです。

どちらも同じように見えますが、意味が違います。

また、Visual Studioは、イベントを示すためにさまざまなアイコンを配置します。

私がよく覚えているなら、それはC#の初期の頃、代表団はこれをサポートしていませんでした:

this.mydelegatefield += somethingHere;

イベントだけ...でもそれは私の想像だけかもしれません。

編集

誤解を招かないように...add/removeメソッドには違いがあります。私はこれを他の答えの後に置きます(これを忘れたので)。したがって、クレジットは私のものではありません。

于 2012-10-23T03:56:32.710 に答える
0

イベントは単なるシュガーコートです。イベントを定義すると、3つのことが起こります。

単純なEG:

public event EventHandler alarm;

サンプルコンパイラ出力

private EventHandler alarm

public void add_alarm(EventHandler value)
{
}

public void remove_alarm(EventHandler value)
{
}

パブリックアクセサーprivateとは対照的に、問題が発生する可能性があることに注意してください。public del me;また、とを使用するgetset、より良いパターンです

于 2012-10-23T04:08:57.233 に答える
0

イベントは、クラスのプロパティと比較できます。

  • プロパティは、MemberField/Object状態へのインターフェイスです。
  • 同様に、イベントは基礎となるデリゲートへのインターフェースです。

イベントなしで最終結果を達成することはできますが、イベントなしでカプセル化を失うことになります。

保護されていない代理人は、悪用される傾向があります。

于 2012-10-23T04:16:31.363 に答える