委派事件和null引用



在以下代码中,当程序执行时,WorkPerformed始终为空

if (WorkPerformed != null)
            {
                WorkPerformed(hours, wt);
            } 

在学习代表和活动时,有人能帮我哪里做错了吗

namespace DelegateDemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            DoSomethingElse();
        }

        public void DoSomethingElse()
        {
            DelegateTest dt = new DelegateTest();
            dt.DoWork(10, WorkType.Permanent);
        }
    }
}

namespace DelegateDemoApp
{
    public delegate void WorkPerformedHandler(int hours, WorkType workType);
    public enum WorkType
    {
        Permanent = 1,
        Contract = 2
    }
   public class DelegateTest
    {
        public event WorkPerformedHandler WorkPerformed;
        public event EventHandler WorkCompletedEvent;
        public void DoWork(int hours, WorkType wt)
        {
            for (int i = 0; i < hours; i++)
            {
                 //raise Progress Event 
                OnWorkPerformedProgress(hours , wt);
            }
        }
        protected virtual void OnWorkPerformedProgress(int hours, WorkType wt)
        {
           if (WorkPerformed != null)
            {
                WorkPerformed(hours, wt);
            }
        }
        public DelegateTest()
        {
        }

        public void Supervisor_WorkPerformed(int shiftHours, WorkType WType)
        {
            string.Format(" WorkHours {0} WorkType {1} ", shiftHours, WType);
        }
        public string Manager_WorkPerformed(int workHours, WorkType WType)
        {
            return string.Format (" WorkHours {0} WorkType {1} ", workHours, WType);
        }
    }
}

必须订阅事件才能使其变为非空:

delegateTestInstance.WorkPerformed += new WorkPerformedHandler(OnWorkPerformed);
...
void OnWorkPerformed(...)
{
    ....
}

当您不想再处理任何事件时,请始终记住取消订阅该事件,以确保资源被清除:

delegateTestInstance.WorkPerformed -= OnWorkPerformed;

最新更新