回答
你不初始化你的事件,而你需要在你調用的方法來檢查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