C# 在分配活动期间是否复制了代表?

C# 在分配活动期间是否复制了代表?,c#,events,delegates,C#,Events,Delegates,下面的代码似乎多次执行FileRetrieved事件。我认为代表是一种参考类型。我原以为这会执行一次。我想猜测一下,引用是通过值传递的,因此被复制了,但我不喜欢猜测:-) 公共委托无效目录事件(T目录项); void Main() { DirListEvent printFilename=s=>{ Console.WriteLine(s); }; var obj=new DirectoryLister(); obj.FileRetrieved+=打印文件名; obj.FileRetrieved+

下面的代码似乎多次执行FileRetrieved事件。我认为代表是一种参考类型。我原以为这会执行一次。我想猜测一下,引用是通过值传递的,因此被复制了,但我不喜欢猜测:-)

公共委托无效目录事件(T目录项);
void Main()
{
DirListEvent printFilename=s=>{
Console.WriteLine(s);
};
var obj=new DirectoryLister();
obj.FileRetrieved+=打印文件名;
obj.FileRetrieved+=打印文件名;
obj.GetDirListing();
}
公共类目录列表器{
检索到公共事件目录事件文件;
公共目录列表器(){
FileRetrieved+=委托{};
}
public void GetDirListing(){
foreach(目录.GetFiles(@“C:\”)中的var文件)
{
检索到的文件(文件);
}
}
}

实际上,FileRetrieved是一个委托的集合,同一个委托可以多次出现在此集合中。并非所有集合都是集合…

基本上,每个委托实例都有一个调用列表,它本质上只是与您关联的目标事件的所有引用的列表。比如说,

public event DirListEvent<string> FileRetrieved;
这段代码基本上向FileRetrieved调用列表添加了两个相同的委托实例调用列表允许重复实例。因此,调用FileRetrieve时,它会遍历其调用列表,发现添加了2个方法(都是printFilename),只需按预期将调用委托给printFilename即可


尝试使用另一行
obj.FileRetrieved+=printFilename
和FileRetrieved应该调用printFilename 3次。

老实说,我不认为“委托是引用类型”应该以任何方式连接到“正在执行一次”。您已经向事件处理程序注册了同一委托两次,因此它被调用了两次-为什么不呢?正确,
obj.FileRetrieved
最终包含对同一委托的多个引用。
public event DirListEvent<string> FileRetrieved;
obj.FileRetrieved += printFilename;
obj.FileRetrieved += printFilename;