delegate方法返回null值

时间:2018-02-07 19:27:41

标签: c# .net

在过去的两个小时里,我一直在尝试代表/活动 - 我的目的是通过设置新书名来告知用户以前的书名和新书。

但是,在我的Abstract类的所有情况下,NameChanged(args.ExistingName,args.NewNames);返回null。我似乎无法弄清楚为什么,我已经尝试手动传递两个字符串参数但是visual studio抛出一个错误,指出NameChanged包含一个空值。

internal interface Iinterface
    {
        void AddContact(string name, string number);
        void RemoveContact(string name);
        void RetrieveContacts();
        void RetrieveByName(string name);
        void RetrieveByNumber(string number);
        string Name { get; set; }

}

public abstract class Abstract : Iinterface
    {
        public abstract void AddContact(string name, string number);
        public abstract void RemoveContact(string name);
        public abstract void RetrieveContacts();
        public abstract void RetrieveByName(string name);
        public abstract void RetrieveByNumber(string number);

        public string Name{
            get
            {
                return _name;
            }
            set
            {
                    NameChangedEventArgs args = new NameChangedEventArgs();
                    args.ExistingName = _name;
                    args.NewName = value;
                    NameChanged(args.ExistingName, args.NewName); // this refers to the abstract class? 
                    _name = value;
            }
        }

        public NameChangedEventHandler NameChanged; // I presume here we're taking an instance of the delegate method. 

        protected string _name;

}

public class PhoneBook : Abstract
    {
        public PhoneBook()
        {
            _name = "phone book name";
        }

        public override void AddContact(string name, string number)
        {
            contacts.Add(name, number);
        }

        public override void RemoveContact(string name)
        {
            contacts.Remove(name);
        }

        public override void RetrieveContacts()
        {
            foreach (KeyValuePair<string, string> entry in contacts)
            {
                Console.WriteLine("Name : {0} Number : {1}", entry.Key, entry.Value); 
            }
        }

        public override void RetrieveByName(string name)
        {
            foreach(KeyValuePair<string, string> entry in contacts)
            {
                if(entry.Key == name)
                {
                    Console.WriteLine("Name : {0} Number : {1}", entry.Key, entry.Value);
                }
            }

        }

        public override void RetrieveByNumber(string number)
        {
           foreach(KeyValuePair<String,string> entry in contacts)
            {
                if (entry.Value == number)
                {
                    Console.WriteLine("Name : {0} Number : {1}", entry.Key, entry.Value);
                }
            }
        }
        Dictionary<string, string> contacts = new Dictionary<string, string>();
    }
 public class NameChangedEventArgs : EventArgs
    {
        public string ExistingName { get; set; }
        public string NewName { get; set; }
    }
{
    // public delegate void NameChangedEventHandler(object sender, NameChangedEventArgs args);
    public delegate void NameChangedEventHandler(string existingName, string newName);
}
 class Program
    {
        static void Main(string[] args)
        {
            PhoneBook book = new PhoneBook();
            setName(book);
            addContact(book);
            retrieveByName(book);
            retrieveByNumber(book);
            book.NameChanged = new NameChangedEventHandler(OnNameChanged); // call OnNameChanged whenever someone invokes this delegate


            Console.ReadLine();
            /* book.retrieveContacts(); */
        }
        private static void setName(PhoneBook book)
        {
            book.Name = "book name";
            Console.WriteLine(book.Name);
        }
        private static void retrieveByNumber(PhoneBook book)
        {
            book.RetrieveByNumber("0323242389");
        }

        private static void retrieveByName(PhoneBook book)
        {
            book.RetrieveByName("james");
        }

        private static void addContact(PhoneBook book)
        {
            book.AddContact("james", "0151289");
            book.AddContact("Bob", "0323242389");
            book.AddContact("Hannah", "34234");
        }


    static void OnNameChanged(string existingName, string newName)
        {
            Console.WriteLine($"Gradebook changing name from {existingName} to {newName}");
        }
    }

1 个答案:

答案 0 :(得分:0)

对于使用方法注册委托或事件,以下是其语法:

book.NameChanged+= new NameChangedEventHandler(OnNameChanged); 

其次,你不应该盲目地调用它。

你应该检查某人是否订阅了它,或者是否有任何方法分配给它:

if(NameChanged !=null)
    NameChanged(args.ExistingName, args.NewName); 

或在c#6中:

NameChanged?.Invoke(args.ExistingName, args.NewName); 

希望它对你有所帮助。