2016-12-15 5 views
0

로그를 작성할 클래스가 있습니다. 수업은 (아래에 명시되지 않은 특정 상황에서) 반응하는 학급에 의해 소집 될 이벤트를 제기해야합니다.맞춤 이벤트를 발생시킬 때 오류가 발생했습니다.

개체 참조가 개체

어떤을의 인스턴스로 설정하지 않는 것이, 나는 아래의 코드를 가지고 있지만 최대한 빨리 이벤트를 마련하려고, 나는이 표시된 라인에 오류가 내가 뭘 놓친 거지?

//1. Class where event is registered 
    public class LogEvent 
    { 
     public delegate void WriteLogEventHandler(object Sender, WriteLogEventArgs e); 
     public event WriteLogEventHandler WriteLog; 

     public class WriteLogEventArgs : EventArgs 
     { 
      public string Message { get; set; } 

      public WriteLogEventArgs(string message) : base() 
      { 
       Message = message; 
      } 
     } 

     //Raise the event. 
     internal void OnWriteLog(WriteLogEventArgs e) 
     { 
      WriteLog(this, e); //Error here. Seems like WriteLog is null 
     } 

//2. Class where event is raised. 
public class Logs 
{ 
    public static void WriteLog(string message) 
    { 
     LogEvent.WriteLogEventArgs args = new LogEvent.WriteLogEventArgs(message); 
     new LogEvent().OnWriteLog(args); 
    } 
} 

//3. Class where event should be consumed 
public class MyClass() 
{ 
    private LogEvent _logEvent; 
    public MyClass() 
     { 
      //Subscribe to event: 
      _logEvent = new LogEvent(); 
      _logEvent.WriteLog += (sender, args) => { DoSomething(args.Message); }; 
     } 

    public void DoSomething(string message) 
    { ... } 
} 
+1

당신이'새로운 LOGEVENT() OnWriteLog (인수) 할 때,. WRITELOG (문자열 메시지)'의를''당신은 WriteLog'이 최대 유선'가 없습니다 LogEvent''의 새 인스턴스를 만들 핸들러는 물론 null입니다. 또한'MyClass' 생성자에서'LogEvent'를 생성하고'WriteLog'를 연결하지만'LogEvent' 인스턴스를 아무 곳이나 저장하지 않습니다. –

+0

의미가 있습니다. 나는 그런 생각을하고 몇 가지 시나리오를 시도했지만 아직 성공하지 못했습니다. 나는 코드 예제를 요구하기에는 너무 어리 석다. 지금 당장 시도 할 것이다. –

+0

당신의 대답 중 2 편이 내 코드에 부분적으로 있지만 질문에는 없다. 질문을 업데이트합니다. 감사. –

답변

0

두 가지 문제 :

  • 당신은 누구가 가입 여부 이벤트를 제기하고 있습니다. 하지 마세요 WriteLog이 null 일 때 WriteLog(this, e)으로 전화하면 NullReferenceException이 표시됩니다. C# 6에서는이를 방지하기 쉽다 : 당신은 이벤트를 발생하는 것과 다른 LogEvent 인스턴스에서 이벤트에 가입하고

    WriteLog?.Invoke(this, e); 
    
  • . 이는 다른 어떤 것보다 설계 문제에 더 가깝습니다. 개별 로그 이벤트에 구독자 목록이있는 것은 의미가 없습니다. 대신, (이벤트를 통해) 구독자가있는 Logger 또는 유사 콘텐츠가 있어야하고 각 LogEvent이 구독자에게 전달됩니다. 하나를Logger으로 만들고 가입 한 다음 동일한 인스턴스에서 WriteLog으로 전화하십시오.

+0

포인트 1은 매우 편리합니다 (WriteLog? .Invoke 여야하고 WriteLine.Invoke가 아니어야 함). 포인트 2 아직 해결 방법을 모르겠습니다. 마이클에 대한 피드백마다 코드 예제를 요구하기에는 너무 어리 석다. 그래서 계속 시도 할 것이다 :). 답변 해주셔서 감사합니다. –