++/CLI

2012-05-05 3 views
0

나는 C#에서 이러한 클래스 및 대리자를 가지고 :++/CLI

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

나는 C++/CLI에서 다시 작성해야합니다. 이 activate() 호출에 문제 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(); 
     } 
}; 

-하지만 난 오류가있어?

+1

는 만약 있다면 (! = nullptr 활성화)'때문에'구체적'activate'는 데이터 값 –

+0

하지 않다 불행 그래서 C에서 같은 일을하는 방법 +/cli C에서 #? –

답변

3

IIRC, C++/CLI에서 널 테스트가 필요하지 않으면 컴파일러에서 자동으로 삽입합니다.

는 다음 코드 예제는 사소한 이벤트의 인상 방법을 생성하는 데 사용되는 논리를 보여줍니다 : 그냥

activate(); 

MSDN이 확인 호출 이벤트는 raise 메소드를 호출, 하나 이상의 가입자가있는 경우 암시 적 또는 명시 적으로 대리인을 호출합니다. 대리자의 반환 형식이 void이 아니고 이벤트 구독자가없는 경우 raise 메서드는 대리자 형식의 기본값을 반환합니다. 이벤트 구독자가없는 경우 raise 메서드를 호출하면 반환되며 예외가 발생하지 않습니다. 대리자 반환 형식이 void이 아닌 경우 대리자 형식이 반환됩니다.

C#은 경쟁 조건 (게시 한 코드에 하나씩 있음)을 권장하기 때문에 매우 좋습니다. C++/CLI 컴파일러는 Null 검사와 호출 사이의 backing 필드를 다시 읽지 않으므로 추가 작업없이 스레드로부터 안전합니다. 는 C++/CLI 컴파일러가 생성하는 것과 동등한 정확한 C# 1 버전이다 :

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