2014-11-05 51 views
2

我有一个类,它是空,抛出异常。与事件这样</p> <pre><code>public class A { public event Func<string, string> Message; public void Calling() { Message("Hello world!"); } } </code></pre> <p>如果我称之为<code>Calling()</code>方法,没有人订阅了<code>Message</code>事件又如何初始化事件

如何初始化我的事件?

+0

'public event Func Message = _ => null;' – 2014-11-05 19:22:44

+0

关于事件的更深入的讨论可以在这里找到(http://stackoverflow.com/q/3102918/945456)和[这里](http://stackoverflow.com/q/786383/945456)。 – 2014-11-05 19:24:38

回答

4

你不初始化你的事件,而你需要在你调用的方法来检查null:

public void Calling() 
{ 
    if (Message != null) 
     Message("Hello World!"); 
} 
1

你不能。

事件是,因为你已经发现,默认情况下,这就是为什么你在使用前确认他们好的做法要求:

public void Calling() 
{ 
    if (Message != null) 
     Message("Hello World"); 
} 

您未使用的返回值出现;有点奇怪,但也许只是因为这是一个例证。

你也可以把它初始化为你构造一个空白的功能,但是那只是浪费资源:

public A() 
{ 
    Message += (s) => { return String.Empty; }; 
} 

现在它调用一个什么都不做功能每次引发该事件的时候,当一个简单的null检查解决了这个问题。肯定不是推荐,但它是“初始化”一个事件的唯一方法。

3

事件初始化。价值null。解决的办法是首先检查null。规范方法如下所示:

public void Calling() 
{ 
    Func<string, string> handler = Message; 

    if (handler != null) 
    { 
     handler("Hello world!"); 
    } 
} 

请注意事件值复制到本地检查之前。这可以确保在检查null和调用它的时间之间不会对事件进行并发更改。在很多程序中,这是不需要的(没有并发性),您可以安全地直接检查事件本身。

+0

+1用于处理竞赛条件。 – juharr 2014-11-05 19:05:33

2

在课堂上调用您的活动之前检查null以查看是否有人订阅了该活动。

public void Calling() 
{ 
    if (Message != null) 
     Message("Hello world!"); 
} 

参见:Events Tutorial

调用的事件:一旦一个类已经宣布的事件,它可以治疗 该事件就像指定的委托类型的字段。如果没有客户端将代理连接到 事件,则字段 将为空,否则它指的是在调用 事件时应该调用的代理。 因此,调用一个事件通常是由第一个 检查null并然后调用事件完成的。

1

虽然,这不是你的问题,我会把它扔在那里。您可以通过“空检查”来检查是否有人正在收听该事件。这确保它不会执行该方法(并随后抛出NullReferenceException)。

public void Calling() 
{ 
    if (Message != null) 
    Message("Hello World"); // Why are you ignoring the return value? 
} 

至于你的实际问题,东西必须具有到A类型的对象的引用(如在示例中定义。

public class B 
{ 
    A MyA; 

    public B() 
    { 
    MyA = new A(); 
    } 
} 

然后,它具有订阅消息的事件。

public class B() 
{ 
    A MyA; 

    public B() 
    { 
    MyA = new A(); 
    MyA.Message += MessageHandler; 
    } 

    public string MessageHandler(string s) 
    { 
    // Do other code here and ensure you're returning a string as defined in your Message event. 
    return s; 
    } 
} 

注意,MessageHandler可以任意取名。我只是用,为清楚起见,也可以匿名方法或lambda表达式,而不是一个名为方法。

相关问题