C#委托后果:不喜欢公共方法

时间:2015-10-11 00:58:58

标签: c# delegates

我正在学习C#。现在,我正在摆弄代表和活动。我的问题是关于代表:似乎我必须保持方法 public virtual bool IsPromotable(Employee e,PromotionDelegate pd) public。假设我希望它受到保护。现在我该怎么做?或者这个例子对委托的使用不好?或者我必须在使用委托时简单地接受公共方法?以下是完全可编辑的代码:

using System;

namespace Delegate_Tutorial_1
{

    public class EmployeeEventArgs : EventArgs
    {
        public Employee Employee { get; set; }
    }

    //--

    public class Employee
    {
        public string Name { get; set; }
        public int YearsOfService { get; set; }

        public event EventHandler<EmployeeEventArgs> HourlyRateChanged;

        private double hourlyRate;
        public double HourlyRate
        {
            get { return hourlyRate; }
            set
            {
                if (hourlyRate != value)
                {
                    hourlyRate = value;
                    OnHourlyRateChanged();
                }
            }
        }

        protected virtual void OnHourlyRateChanged()
        {
            if (HourlyRateChanged != null)
                HourlyRateChanged(this, new EmployeeEventArgs() { Employee = this});
        }


        public virtual bool IsPromotable(Employee e, PromotionDelegate pd)
        {
            return pd(e);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate_Tutorial_1
{
    public delegate bool PromotionDelegate(Employee emp);

    class Program
    {
        static void Main(string[] args)
        {

            PromotionDelegate promoDelegate = PromotionCheck;

            List<Employee> EmployeeList = new List<Employee>();
            EmployeeList.Add(new Employee() { Name = "John", YearsOfService = 5, HourlyRate = 15 });
            EmployeeList.Add(new Employee() { Name = "Mary", YearsOfService = 4, HourlyRate = 17 });

            foreach (Employee emp in EmployeeList)
            {
                emp.HourlyRateChanged += OnHourlyRateChanged; //Subscribe to the event of the Employee

                if (emp.IsPromotable(emp, promoDelegate))
                {
                    emp.HourlyRate *= 1.1;
                    Console.WriteLine(emp.Name + " : eligable for promotion. Salary now is: " + emp.HourlyRate);
                }
            }
            Console.ReadLine();
        }


        //--

        public static bool PromotionCheck(Employee emp)
        {
            return emp.YearsOfService >= 5 ? true : false;
        }

        public static void OnHourlyRateChanged(object source, EmployeeEventArgs args)
        {
            Console.WriteLine("Hourly salary has been changed for: " + args.Employee.Name);
        }

    }
}

1 个答案:

答案 0 :(得分:0)

您需要在班级IsPromotable的{​​{1}}课程上致电Employee,这是因为它需要Program。它与您是否使用代表无关。

成为public它具有public的所有优点。所有protected类后代都可以看到Employee并覆盖它(因为它也是IsPromotable)。

现在,还有其他一些提示。

使用virtual OnHourlyRateChanged方法,您应该构建如下代码:

Employee

原因是在多线程代码中,委托可能会在检查之后但在通话之前发生变化。它不会经常发生,但是当它发生时它会导致程序抛出异常并且调试变得非常困难。您的代码可能不是多线程的,但您应该始终将此模式用作习惯。

此外,在protected virtual void OnHourlyRateChanged() { var hrc = this.HourlyRateChanged; if (hrc != null) { hrc(this, new EmployeeEventArgs() { Employee = this }); } } 中,您已调用事件处理程序Program。通常的约定是对引发事件的方法使用OnHourlyRateChanged命名,但不对处理事件的方法使用On*命名。这种方法被称为Employee_HourlyRateChanged更为常见。再次,这是一个很好的习惯,以避免将来模棱两可。