Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托方法返回空值_C#_.net - Fatal编程技术网

C# 委托方法返回空值

C# 委托方法返回空值,c#,.net,C#,.net,在过去的两个小时里,我一直在尝试代理/事件——我的目标是在设置新书名称时,同时向用户告知以前的书名和新书 但是,在我的抽象类中,NameChanged(args.ExistingName,args.NewNames);返回null。我似乎不明白为什么,我尝试手动传递两个字符串参数,但VisualStudio抛出一个错误,指出NameChanged包含空值 internal interface Iinterface { void AddContact(string name

在过去的两个小时里,我一直在尝试代理/事件——我的目标是在设置新书名称时,同时向用户告知以前的书名和新书

但是,在我的抽象类中,NameChanged(args.ExistingName,args.NewNames);返回null。我似乎不明白为什么,我尝试手动传递两个字符串参数,但VisualStudio抛出一个错误,指出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; }
} }


要使用方法注册委托或事件,其语法如下:

book.NameChanged+= new NameChangedEventHandler(OnNameChanged); 
其次,您不应该在调用端盲目地调用它

您应该检查是否有人订阅了它或为它指定了任何方法,如:

if(NameChanged !=null)
    NameChanged(args.ExistingName, args.NewName); 
或者在c#6中:


希望它能帮助您。

看起来您使用的是
=
,而不是
+=
。必须像:
book.NameChanged+=newnamechangedeventhandler(OnNameChanged)。使用C#6,您可以编写
NameChanged?.Invoke(…)
以安全的方式进行检查,在旧版本中,您需要制作委托的本地副本,然后检查并调用副本。不幸的是,此答案仍然返回空值,但我将接受您的第二条评论!)
 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}");
        }
    }
book.NameChanged+= new NameChangedEventHandler(OnNameChanged); 
if(NameChanged !=null)
    NameChanged(args.ExistingName, args.NewName); 
NameChanged?.Invoke(args.ExistingName, args.NewName);