C# 简单委托不工作

C# 简单委托不工作,c#,delegates,C#,Delegates,执行时,我得到以下输出: 过程开始 进程结束 按任意键继续 实际上应该是: 过程开始 进程结束 过程开始 进程结束 按任意键继续 我无法找出错误:(我想这就是正在发生的事情 class SimpleDelegate { public delegate void LogHandler(string message); public void Process(LogHandler logHandler) { if (logHandler != null) {

执行时,我得到以下输出:
过程开始
进程结束
按任意键继续

实际上应该是:
过程开始
进程结束
过程开始
进程结束
按任意键继续


我无法找出错误:(

我想这就是正在发生的事情

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);
  }
}

也就是说,
handler
为null,因此代码永远不会执行。由于调用了
cp.Process(null)

您只调用了一次
SimpleDelegate.Process
为什么希望看到两次输出


你从来没有真正调用委托…只是测试它是否为空。你测试了两次,一次是在写“流程开始”之前,一次是在写“流程结束”之前,但仅此而已。

我不确定我是否理解了要点

但您从未在以下代码中调用logHandler:

    SimpleDelegate cp = new SimpleDelegate();

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

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

我相信您的困惑在于您调用了“LogHandler+=…”两次,但只得到了两个输出。请注意,您调用的进程函数没有使用LogHandler进行循环!这就是您没有得到预期结果的原因

另外,您正在使用的模型稍微有点偏离。与其直接使用委托,不如创建一个事件并订阅它

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

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

再次感谢。现在我在cp.Process中调用Invoke(字符串s),输出与控制台中的行和MyLog.log文件中的行一样
public delegate void LogHandler(string message);
public event LogHandler OnLog;
...
OnLog += ...