c#.net中Delegate-Event的超级简单示例?

时间:2009-11-23 12:13:55

标签: c# .net c#-3.0

我需要一个非常简单的例子来了解这些事件。我感觉很难理解互联网或书籍中可用的例子。

4 个答案:

答案 0 :(得分:6)

这是一个公开事件的类的简单实现。

public class ChangeNotifier
{
    // Local data
    private int num; 

    // Ctor to assign data
    public ChangeNotifier(int number) { this.num = number; } 

     // The event that can be subscribed to
    public event EventHandler NumberChanged;

    public int Number
    {
        get { return this.num; }
        set
        {
            // If the value has changed...
            if (this.num != value) 
            {
                // Assign the new value to private storage
                this.num = value;

                // And raise the event
                if (this.NumberChanged != null)
                    this.NumberChanged(this, EventArgs.Empty);
            }
        }
    }
}

这个类的用法如下:

public void SomeMethod()
{
    ChangeNotifier notifier = new ChangeNotifier(10);

    // Subscribe to the event and output the number when it fires.
    notifier.NumberChanged += (s, e) => Console.Writeline(notifier.Number.ToString());

    notifier.Number = 10; // Does nothing, this is the same value
    notifier.Number = 20; // Outputs "20" because the event is raised and the lambda runs.
}

关于控制流程,执行流程为SomeMethod()。我们创建一个新的ChangeNotifier,从而调用它的构造函数。这会将10的值分配给私人num成员。

然后我们使用+=语法订阅该事件。此运算符在右侧接受委托(在我们的示例中,该委托是lambda)并将其添加到事件的委托集合中。此操作不会执行我们在ChangeNotifier中编写的任何代码。如果您愿意,可以通过活动的addremove方法对其进行自定义,但很少需要这样做。

然后我们对Number属性执行几个简单的操作。首先,我们分配10set方法在Number属性上运行value = 10方法num。但10成员的值已经20,因此初始条件的计算结果为false,没有任何反应。

然后我们对num做同样的事情。这次值不同,因此我们将新值分配给Console.WriteLine()并触发事件。首先,我们验证事件不是null。如果没有订阅它,它就为null。如果它不为null(即,如果某些 订阅了它),我们使用标准方法/委托语法来激活它。我们只需使用事件的参数调用事件。这将调用已订阅该事件的所有方法,包括将执行Number的lambda。


如果一个线程可以在if (this.NumberChanged != null) this.NumberChanged(this, EventArgs.Empty); 的setter中,而另一个线程取消订阅一个侦听器,那么Henrik已经成功地挑选了存在的潜在竞争条件。对于那些尚不了解事件如何运作的人来说,我不认为这是一个常见的案例,但是如果你担心这种可能性,请修改以下几行:

var tmp = this.NumberChanged;
if (tmp != null)
    tmp(this, EventArgs.Empty);

是这样的:

{{1}}

答案 1 :(得分:2)

class Program
    {
        static void Main(string[] args)
        {
            Parent p = new Parent();
        }
    }

    ////////////////////////////////////////////

    public delegate void DelegateName(string data);

    class Child
    {
        public event DelegateName delegateName;

        public void call()
        {
            delegateName("Narottam");
        }
    }

    ///////////////////////////////////////////

    class Parent
    {
        public Parent()
        {
            Child c = new Child();
            c.delegateName += new DelegateName(print);
            //or like this
            //c.delegateName += print;
            c.call();
        }

        public void print(string name)
        {
            Console.WriteLine("yes we got the name : " + name);
        }
    }

答案 2 :(得分:1)

Class A {
    public delegate void EventHandler();

    public static event EventHandler workComplete();

    void doWork(){
        // DO WORK  
    }

    void onWorkComplete(){
        // Raise event
        workComplete();
    }
}

Class Main {
    A a = new A();
    a.workComplete += new () -> {
        // On Class Complete Work
        Console.WriteLine("Work Complete");
    };
}

答案 3 :(得分:0)

如果你有C背景,你可以看到委托作为指向功能的指针。