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 += ...