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);
}
}
执行时我得到以下输出:
流程开始
流程结束
按任意键继续 。 。点。
实际应该是:
流程开始
流程结束
流程开始
流程结束
按任意键继续 。 。
我无法弄清楚错误:(
答案 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)