为什么我有委托null异常

时间:2018-06-29 15:23:03

标签: c# delegates

我正在学习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;

    }


}

1 个答案:

答案 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文档。