Простой делегат не работает - PullRequest
0 голосов
/ 02 ноября 2009
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 ]

4 голосов
/ 02 ноября 2009

Вы звоните только SimpleDelegate.Process один раз - почему вы ожидаете увидеть результат дважды?

Вы никогда не вызываете делегата ... просто проверяете его на недействительность. Вы проверяете это дважды, один раз перед тем, как написать «Начало процесса», и один раз перед тем, как написать «Окончание процесса», но это все.

4 голосов
/ 02 ноября 2009

Я не уверен, понял ли я точку ...

Но вы никогда не вызываете logHandler в этом коде:

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

        if (logHandler != null)
        {
            Console.WriteLine("Process end");
        }
    }
1 голос
/ 02 ноября 2009

Я полагаю, что ваша путаница связана с тем, что вы дважды вызывали «LogHandler + = ...», но получаете только два выхода. Обратите внимание, что вызываемая вами функция Process не выполняет цикл, в котором используется LogHandler! Вот почему вы не получаете ожидаемых результатов.

Кроме того, модель, которую вы используете, просто слегка отключена. Вместо непосредственного использования делегата лучше создать событие и подписаться на него.

public delegate void LogHandler(string message);
public event LogHandler OnLog;
...
OnLog += ...
0 голосов
/ 02 ноября 2009

Я думаю, что это то, что происходит

    SimpleDelegate cp = new SimpleDelegate();

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

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

То есть handler равно нулю, поэтому код никогда не выполняется. Вы видите свое сообщение один раз из-за звонка на cp.Process(null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...