簡體   English   中英

用C ++ / CLI重寫此行

[英]Rewrite this line in C++/CLI

我在C#中有這樣的類和委托:

public delegate void Super();
public class Event
{
    public event Super activate ;
    public void act()
    {
       if (activate != null) 
           activate();
    }
}

我需要用C ++ / CLI重寫它。 但是我有一個錯誤- usage requires Event::activate to be data member

public delegate void Super();
public ref class Event
{
    public:
        event Super ^activate;
        void act()
        {
            if (activate!=nullptr) 
                activate();
        }
};

activate()調用中有問題嗎?

IIRC,在C ++ / CLI中,您不需要null測試,編譯器會為您插入它。 剛打電話

activate();

MSDN確認:

下面的代碼示例演示了用於生成瑣碎事件的提高方法的邏輯:如果事件有一個或多個用戶,調用raise方法或明或暗地調用委托。 如果委托的返回類型不為void並且事件訂閱者為零,那么raise方法將返回委托類型的默認值。 如果沒有事件訂閱者,則只調用raise方法即可,並且不會引發異常。 如果委托返回類型不為void ,則返回委托類型。

這是一件非常好的事情,因為C#鼓勵競爭條件(您發布的代碼包含一個)。 C ++ / CLI編譯器不會在空檢查和調用之間重新讀取后備字段,因此它是線程安全的,無需付出額外的努力。 與C ++ / CLI編譯器生成的等效的C#版本是:

var activate_copy = activate;
if (activate_copy != null) 
    activate_copy();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM