以下代码似乎多次执行FileRetrieved事件。我认为代表是一个参考类型。我期待这个执行一次。我将采取猜测,说参考被按值传递,因此复制,但我不喜欢猜测:-)委托是否在分配给事件期间被复制?
public delegate void DirListEvent<T>(T dirItem);
void Main()
{
DirListEvent<string> printFilename = s => {
Console.WriteLine (s);
};
var obj = new DirectoryLister();
obj.FileRetrieved += printFilename;
obj.FileRetrieved += printFilename;
obj.GetDirListing();
}
public class DirectoryLister {
public event DirListEvent<string> FileRetrieved;
public DirectoryLister() {
FileRetrieved += delegate {};
}
public void GetDirListing() {
foreach (var file in Directory.GetFiles(@"C:\"))
{
FileRetrieved(file);
}
}
}
老实说,我不明白“委托是否是引用类型”应该以任何方式连接到“被执行一次”。您已经使用事件处理程序注册了相同的委托两次,因此它被调用了两次 - 为什么不呢? – 2010-04-26 07:36:36