代码之家  ›  专栏  ›  技术社区  ›  Eric

在C中是否有任何快捷/简单(VB)风格的方式来引发事件?

  •  1
  • Eric  · 技术社区  · 16 年前

    在VB中,我有一个工人类

    Public Class worker
        Public Event EventNumber1(ByVal messages As Dictionary(Of Integer, String))
        Public Event EventNumber2(ByVal message As String)
    
        Public Sub CallEventNumber1()
            Dim dict As New Dictionary(Of Integer, String)
            dict.Add(1, "EventNumber1 First message")
            dict.Add(2, "EventNumber1 Second message")
            RaiseEvent EventNumber1(dict)
        End Sub
    
        Public Sub CallEventNumber2()
            RaiseEvent EventNumber2("I am an EventNumber2 Message")
        End Sub
    End Class
    

    在另一节课上用

    AddHandler _worker.EventNumber1, AddressOf EventNumber1Handler
    AddHandler _worker.EventNumber2, AddressOf EventNumber2Handler
    

    在C工人阶级

    class Worker
        {
            public delegate void EventNumber1Handler(Dictionary<int, string> messages);
            public delegate void EventNumber2Handler(string message);
            public event EventNumber1Handler EventNumber1;
            public event EventNumber2Handler EventNumber2;
    
            public void CallEventNumber1()
            { 
                Dictionary<int, string> dict = new Dictionary<int, string>();
                dict.Add(1, "EventNumber1 First message");
                dict.Add(2, "EventNumber1 Second message");
                if (EventNumber1 != null)
                    EventNumber1(dict);
            }
    
            public void CallEventNumber2()
            { 
                if (EventNumber2 != null)
                    EventNumber2("I am an EventNumber2 Message");
            }
        }
    

    然后用电线连接起来

    worker.EventNumber1 += new Worker.EventNumber1Handler(worker_EventNumber1);
    worker.EventNumber2 += new Worker.EventNumber2Handler(worker_EventNumber2);
    

    所以我想我的问题是,我是否总是需要在C中添加代表以及事件?C 3.0/4.0有新的语法吗?

    当做

    埃里克

    1 回复  |  直到 16 年前
        1
  •  3
  •   Henk Holterman    16 年前

    还有一个强烈的建议就是一个事件应该总是有签名:

    delegate void MyEvent(objectr sender, MyEventArgs e);
    

    因此,您还必须编写一个从EventArgs派生的类来封装您的字典。

    好消息是,您通常可以避开EventHandler和Action类。

    public event Action<Dictionary<int,string>> EventNumber1;