回答
你不初始化你的事件,而你需要在你調用的方法來檢查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. public static void <callbackMethodName>(IAsyncResult)
- 2. 差分<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>
- 3. 實現一個方法public static String nameOfBestCustomer(ArrayList <Double> sales,ArrayList <String <customers)
- 4. 反思:在DLL</p> <pre><code>public class class_a { public static class_b name_b = new class_b(); } public class class_b { public void method(string data) { } } </code></pre> <p>調用方法靜態字段
- 5. <!DOCTYPE HTML PUBLIC QUERYSTRING
- 6. 實體類型EntityBase不是以下</p> <pre><code>public class Title : EntityBase { public short Id { get; set; } public string TitleName { get; private set; } } public abstract class EntityBase { public DateTime CreatedDate { get; set; } } </code></pre> <p>型號爲當前上下文
- 7. <%$,<%@,<%=,<%#...這是怎麼回事?
- 8. public <T extends Animal> void addAll(List <T> animals)and public void addAll(List <Animal> animals)有什麼區別?
- 9. List <string> INotifyPropertyChanged事件
- 10. 有沒有辦法做> public void test <A,B,C,....,Z>(...)
- 11. 檢查的產生磁場的屬性後面給出下面的類定義</p> <pre><code>public class MyClass { [System.ComponentModel.Browsable(true)] [field:NonSerialized] public event EventHandler MyEvent; } </code></pre> <p>別的地方在我的代碼字段般的事件
- 12. Java - 又稱爲:<String><>
- 13. HTML <!DOCTYPE HTML PUBLIC 「」>
- 14. public class Extra <BASE> extends BASE
- 15. onclick事件(<a>)
- 16. 改造:</p> <pre><code>public Class Attachment{ public String id; public File imageFile; } // Service @Multipart @POST("attachments") Call<Void> upload(@Part("attachment") Attachment attachment); </code></pre> <p>我怎樣才能成功上傳的圖片文件:鑑於我有這些上傳模型
- 17. 如何將引用對象壓扁爲引用者的兩個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作爲:
- 18. 一類主動加入「禮」如果鏈接初始化具有這樣</p> <pre><code><li> <a href="/home" class="active">Home</a> </li> <li> <a href="/service">Services</a></li> </code></pre> <p>菜單同樣使用jQuery
- 19. 更改JSON屬性名稱,如果傑克遜決定使用ObjectIdentity進行提供類</p> <pre><code>@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class User { public int id; public User other; } </code></pre> <p>輸出
- 20. 鑄造其上包含類構件通過以下方式</p> <pre><code>public class ArrayLinearList<T> implements LinearList<T>, Iterable<T> </code></pre> <p>「<T延伸可比<T>>」
- 21. <TR>標籤未訂閱事件
- 22. IE事件<input>或<textarea>或<textarea>
- 23. Java語法:public class Me extends Thing <String,Integer,Character>
- 24. 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>你會得到類似的東西工作
- 25. <!DOCTYPE HTML PUBLIC 「.....」>和<!DOCTYPE html>在Eclipse中
- 26. operator <<:std :: cout << i <<(i << 1);
- 27. 如何初始化一個:set <pair <string,string >>?
- 28. 單擊事件爲<p:outputLabel>與<p:ajax>裏面<p:datatable>
- 29. 如何<li><a></a></li>
- 30. CppUnit的:</p> <pre><code>class TT_Common : public CPPUNIT_NS::TestFixture ...... class TT_Container : public CPPUNIT_NS::TestFixture ...... </code></pre> <p>並號召anoter類:如何使用其名稱
'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