我正在学习C#中的主题委托。下面的代码是一个非常基本的示例,但是在我注释掉的行中给出了null异常错误。
任何建议表示赞赏。
using System;
using System.Collections.Generic;
namespace ConsoleAppCSharpPlayGround
{
class Program
{
static void Main(string[] args)
{
BiseylerYap biseyler = new BiseylerYap();
biseyler.Baskabisey = "baskabisey";
biseyler.BiseyOldu = new BiseylerYap.BiseyOlduDelegate(OnBiseyOldu);
}
static void OnBiseyOldu()
{
Console.WriteLine("bisey oldu");
}
}
class BiseylerYap
{
public BiseylerYap()
{
}
private string _baskabisey;
public string Baskabisey
{
get
{
return _baskabisey;
}
set
{
BiseyOldu(); // NULL EXCEPTION ERROR OCCURS HERE
_baskabisey = value;
}
}
public delegate void BiseyOlduDelegate();
public BiseyOlduDelegate BiseyOldu;
}
}
答案 0 :(得分:0)
您应该反转以下两行:
biseyler.Baskabisey = "baskabisey";
biseyler.BiseyOldu = new BiseylerYap.BiseyOlduDelegate(OnBiseyOldu);
它变成:
biseyler.BiseyOldu = new BiseylerYap.BiseyOlduDelegate(OnBiseyOldu);
biseyler.Baskabisey = "baskabisey";
为什么,因为设置Baskabisey
属性时,您需要属性BiseyOldu
不是null
。如果您查看Baskabisey
属性设置器,则会像下面这样调用:
set
{
BiseyOldu();
_baskabisey = value;
}
一种更好的方法是在调用委托之前检查该委托是否为空:
set
{
var myVarDelegate = BiseyOldu;
if(myVarDelegate != null) {
myVarDelegate();
}
_baskabisey = value;
}
您还需要查看C# events文档。