简单代表不起作用

时间:2009-11-02 14:26:59

标签: c# delegates

class SimpleDelegate
{
  public delegate void LogHandler(string message);

  public void Process(LogHandler logHandler)
  {
    if (logHandler != null)
    {
      Console.WriteLine("Process begin");
    }

    if (logHandler != null)
    {
      Console.WriteLine("Process end");
    }
  }
}

class FileLogger
{
  FileStream fileStream;
  StreamWriter writer;

  public FileLogger(string fileName)
  {
    fileStream = new FileStream(fileName, FileMode.Create);
    writer = new StreamWriter(fileStream);
  }

  public void Logger(string s)
  {
    writer.WriteLine(s);
  }

  public void Close()
  {
    writer.Close();
    fileStream.Close();
  }
}

class Program
{
  static void Main(string[] args)
  {
    SimpleDelegate cp = new SimpleDelegate();

    FileLogger fl = new FileLogger(@"C:\TEMP\MyLog.log");

    SimpleDelegate.LogHandler handler = null;
    handler += new SimpleDelegate.LogHandler(Logger);
    handler += new SimpleDelegate.LogHandler(fl.Logger);

    cp.Process(handler);

    fl.Close();
  }

  static void Logger(string s)
  {
    Console.WriteLine("writing s " + s);
  }
}

执行时我得到以下输出:
流程开始 流程结束
按任意键继续 。 。点。

实际应该是:
流程开始 流程结束
流程开始 流程结束
按任意键继续 。 。

我无法弄清楚错误:(

4 个答案:

答案 0 :(得分:4)

您只需拨打SimpleDelegate.Process 一次 - 为什么您希望看到输出两次?

你永远不会实际调用委托......只是测试它是否无效。您正在测试两次,一次是在编写“Process begin”之前,一次是在编写“Process end”之前,但这就是全部。

答案 1 :(得分:4)

我不确定我是否明白了......

但是你永远不会在这段代码中调用logHandler:

    public void Process(LogHandler logHandler)
    {
        if (logHandler != null)
        {
            Console.WriteLine("Process begin");
        }

        if (logHandler != null)
        {
            Console.WriteLine("Process end");
        }
    }

答案 2 :(得分:1)

我相信你的混乱是因为你两次调用“LogHandler + = ...”,但只获得两个输出。请注意,您调用的Process函数不会执行使用LogHandler的循环!这就是为什么你没有得到你期望的结果。

此外,您使用的模型稍微偏离。而不是直接使用委托,最好创建一个事件并订阅它。

public delegate void LogHandler(string message);
public event LogHandler OnLog;
...
OnLog += ...

答案 3 :(得分:0)

我认为这就是正在发生的事情

    SimpleDelegate cp = new SimpleDelegate();

    FileLogger fl = new FileLogger(@"C:\TEMP\MyLog.log");

    cp.Process(null);
    fl.Close();

handler为空,因此代码永远不会被执行。由于调用cp.Process(null)

,您会看到一次消息