我是c#开发的新手。我只是想研究代表功能。根据我读到的关于代表的文章和说明,我尝试根据我从这些笔记和文章中理解的内容编写一个示例代码来实现委托。
但是我在运行示例时遇到错误
“对象引用未设置为对象的实例。”
这里有什么问题?或者我是否以正确的方式实施了代理?或者我关于委托的概念是错误的吗?..
请帮忙。提前谢谢。
我在下面发布了我的代码。
default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
TestClass myObject = new TestClass();
protected void Page_Load(object sender, EventArgs e)
{
myObject.MyDelegateEvent += new TestClass.MyDelegate(myObject_MyDelegateEvent);
}
void myObject_MyDelegateEvent(object sender, EventArgs e)
{
Console.WriteLine("Delegate event called");
}
}
识别TestClass
public class TestClass
{
public delegate void MyDelegate(object sender, EventArgs e);
public event MyDelegate MyDelegateEvent;
public TestClass()
{
MyDelegateEvent(this, null); // Here getting error "Object reference not set to an instance of an object."
}
}
答案 0 :(得分:6)
您正在尝试的是:在构造函数本身中提升事件,即在您的事件没有订阅者时,因此MyDelegateEvent为null。
最佳选择是在举起活动前进行空检查
//Check for not null
if(MyDelegateEvent != null)
{
MyDelegateEvent(this, null);
}
答案 1 :(得分:1)
在提升事件之前始终测试null:
if (this.MyDelegateEvent != null)
{
// Raises the event here
}
如果在引发事件时没有附加到事件的处理程序(这是在构造函数中引发的情况),则可以抛出空引用异常。
编辑:
为了完整起见,当没有使用事件参数时,您应该使用EventArgs.Empty
而不是null
:
if (this.MyDelegateEvent != null)
{
this.MyDelegateEvent(this, EventArgs.Empty);
}
此外,当您未指定任何事件参数时,可以使用EventHandler委托。这很有用,因为您不必每次都写自己的。
答案 2 :(得分:1)
声明事件时,事件初始化为null
。因此,在TestClass
构造函数中,您尝试触发事件,但事件为null
,这会导致您看到的NullReferenceException
。
为避免这种情况,您需要在引发事件之前注册事件处理程序或检查null:
if (MyDelegateEvent != null)
{
MyDelegateEvent(...)
}
另一个技巧是在创建事件时将事件初始化为空委托,这意味着您可以跳过null
检查。
public event MyDelegate MyDelegateEvent = delegate {}; // registers a delegate that does nothing
答案 3 :(得分:0)
关于上面的一些代码的一点点。 MyDelegateEvent 可以在被检查和使用之间进行更改。
是推荐的表格(框架设计指南)var del = MyDelegateEvent;
if (del != null) {
del(...);
}
hth,
艾伦。