【问题标题】:Subscribe eventhandler to reference that is null订阅事件处理程序以引用为空
【发布时间】:2016-02-24 23:18:47
【问题描述】:

我目前正在编写一个应用程序,在该应用程序中我反序列化相对较大的对象(其大小也可以增长,具体取决于用户添加到它们的内容)。我不想将它们全部加载到 RAM 中,因为当它们很多时,这可能会导致问题。

无论如何,如果有一个事件已经是我的问题,我想处理该类的加载实例引发的事件。

如何为仍然为 null 的对象订阅事件处理程序?

我想到了类似“如果有一个对象并且它引发了该事件并使用该方法处理它”。



这是一些示例代码,也是我能想到的唯一方法,尽管我已经认为它行不通了..

public class MyClassA
{
    public event EventHandler PropertyChanged;

    private string someProperty
    public string SomeProperty
    {
        set
        {
            someProperty = value;
            PropertyChanged?.Invoke(this, EventArgs.Empty);
        }
    }

    public static MyClassA Load(string path)
    {
        /*...*/
    }
}

public class MyClassB
{
    public MyClassA InstanceOfA { get; private set; }        

    public MyClassB
    {
        //InstanceOfA.PropertyChanged += MyEventHandler; Not working, NullReference
    }

    // Handle InstanceOfA.PropertyChanged here...
    public void MyEventHandler(object sender, EventArgs e)        
    {
        /*...*/
    }
}

【问题讨论】:

  • "我怎样才能为仍然为空的对象订阅事件处理程序?" - 你不能。

标签: c# event-handling null-pointer


【解决方案1】:

当然,您不能将事件处理程序订阅到仍然为 null 的对象,但您可以在为它分配非 null 值时订阅。
只需使用属性和支持字段:

public class MyClassB
{
    private MyClassA myVar;

    public MyClassA InstanceOfA
    {
        get { return myVar; }
        private set
        {
            myVar = value;
            if (myVar != null)
                myVar.PropertyChanged += MyEventHandler;
        }
    }

    public void MyEventHandler(object sender, EventArgs e)
    {

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多