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