回答
你不初始化你的事件,而你需要在你调用的方法来检查null:
public void Calling()
{
if (Message != null)
Message("Hello World!");
}
你不能。
事件是,因为你已经发现,空默认情况下,这就是为什么你在使用前确认他们好的做法要求:
public void Calling()
{
if (Message != null)
Message("Hello World");
}
您未使用的返回值出现;有点奇怪,但也许只是因为这是一个例证。
你也可以把它初始化为你构造一个空白的功能,但是那只是浪费资源:
public A()
{
Message += (s) => { return String.Empty; };
}
现在它调用一个什么都不做功能每次引发该事件的时候,当一个简单的null
检查解决了这个问题。肯定不是推荐,但它是“初始化”一个事件的唯一方法。
事件是初始化。价值null
。解决的办法是首先检查null。规范方法如下所示:
public void Calling()
{
Func<string, string> handler = Message;
if (handler != null)
{
handler("Hello world!");
}
}
请注意事件值复制到本地检查之前。这可以确保在检查null
和调用它的时间之间不会对事件进行并发更改。在很多程序中,这是不需要的(没有并发性),您可以安全地直接检查事件本身。
+1用于处理竞赛条件。 – juharr 2014-11-05 19:05:33
在课堂上调用您的活动之前检查null
以查看是否有人订阅了该活动。
public void Calling()
{
if (Message != null)
Message("Hello world!");
}
调用的事件:一旦一个类已经宣布的事件,它可以治疗 该事件就像指定的委托类型的字段。如果没有客户端将代理连接到 事件,则字段 将为空,否则它指的是在调用 事件时应该调用的代理。 因此,调用一个事件通常是由第一个 检查null并然后调用事件完成的。
虽然,这不是你的问题,我会把它扔在那里。您可以通过“空检查”来检查是否有人正在收听该事件。这确保它不会执行该方法(并随后抛出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表达式,而不是一个名为方法。
- 1. 差分<p>我想知道在主要方法<code>String[]</code>和<code>String</code>之间的差</p> <pre><code>public static void main(String[] args) { </code></pre> <p>VS</p> <pre><code>public static void main(String args) { </code></pre>
- 2. public static void <callbackMethodName>(IAsyncResult)
- 3. <!DOCTYPE HTML PUBLIC QUERYSTRING
- 4. <%$,<%@,<%=,<%#...这是怎么回事?
- 5. List <string> INotifyPropertyChanged事件
- 6. 有没有办法做> public void test <A,B,C,....,Z>(...)
- 7. 检查的产生磁场的属性后面给出下面的类定义</p> <pre><code>public class MyClass { [System.ComponentModel.Browsable(true)] [field:NonSerialized] public event EventHandler MyEvent; } </code></pre> <p>别的地方在我的代码字段般的事件
- 8. Java - 又称为:<String><>
- 9. public class Extra <BASE> extends BASE
- 10. 如何将引用对象压扁为引用者的两个json.net属性?使用newtonsofts json.net像这样</p> <pre><code>public class User { public virtual int Id {get;set;} public virtual string Name {get;set;} public virtual User Superior {get;set;} } </code></pre> <p>我的目标是这个序列化JSON作为:
- 11. 一类主动加入“礼”如果链接初始化具有这样</p> <pre><code><li> <a href="/home" class="active">Home</a> </li> <li> <a href="/service">Services</a></li> </code></pre> <p>菜单同样使用jQuery
- 12. 更改JSON属性名称,如果杰克逊决定使用ObjectIdentity进行提供类</p> <pre><code>@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class User { public int id; public User other; } </code></pre> <p>输出
- 13. <TR>标签未订阅事件
- 14. Hibernate不与@Id和@Convert或@Converter枚举(自动应用=真)与一些</p> <pre><code>public class SomeDao { @Id private MyEnum id; public MyEnum getId() { return id; } } @Converter(autoApply=true) public MyEnumConv { ... } </code></pre> <p>你会得到类似的东西工作
- 15. operator <<:std :: cout << i <<(i << 1);
- 16. <!DOCTYPE HTML PUBLIC “.....”>和<!DOCTYPE html>在Eclipse中
- 17. 如何<li><a></a></li>
- 18. 分配动作之间的区别<T>方法和订阅动作<T>事件
- 19. 在Hyperledger Fabric Composer中,如何发送事件?</p> <pre><code>stub.SetEvent("<event name>", "<payload>") </code></pre> <p>织物作曲(特别是在logic.js文件),我如何将类似的事件:
- 20. 如何与“onchange”事件联系<select><option>值
- 21. 将数据添加到我在它</p> <pre><code>namespace OMIv2._1KSWilson.Models { public class LegendClassVM { public List <string> legendValues { get; set; } } } </code></pre> <p>创建一个列表中的一个模型的模型
- 22. 如何JavaConfig</p> <pre><code>public class WebInitializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { // ?? } } </code></pre> <p>如何设置JSP的配置在JavaConfig设置JSP的配置在JavaConfig
- 23. 访问保护,子类成员:如果我尝试编译这在G ++,我得到一个错误</p> <pre><code>template <class T> class A{ protected: T i; }; template <class T> class B : public A<T>{ T geti() {return i;} }; </code></pre> <p>:GCC VS MSVC
- 24. 制作一个std :: funtion如果我有两个功能</p> <pre><code>void foo() { std::cout << 1 << std::endl; } void bar() { std::cout << 2 << std::endl; } </code></pre> <p>指向两个函数C++
- 25. 图片翻转由<img>和<a>事件
- 26. 绑定事件到<img />或<a />?
- 27. `public static <T> void main(String [] args)`代表什么?
- 28. 替换<与<元件
- 29. 事件EventHandler之间的区别<T> vs EventHandler <T>
- 30. 更改事件<select>
'public event Func Message = _ => null;' –
2014-11-05 19:22:44
关于事件的更深入的讨论可以在这里找到(http://stackoverflow.com/q/3102918/945456)和[这里](http://stackoverflow.com/q/786383/945456)。 – 2014-11-05 19:24:38