代码之家  ›  专栏  ›  技术社区  ›  Razor

在分配给活动期间是否复制了代理?

  •  2
  • Razor  · 技术社区  · 16 年前

    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);
            }
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  0
  •   codingbear    16 年前

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

    public event DirListEvent<string> FileRetrieved;
    

    上面的代码创建了一个名为fileretried的委托类型(如您所知)。 此委托类型现在有一个调用列表,该列表保存使用+=operator或delegate.Combine方法注册的所有委托实例。

    obj.FileRetrieved += printFilename;
    obj.FileRetrieved += printFilename;
    

    调用列表允许重复实例。 因此,当调用fileretrieve时,它会遍历其调用列表,发现添加了2个方法(都是printFilename),并按照预期将调用委托给printFilename。

    试着换一条线 obj.FileRetrieved += printFilename; FileRetrieved应该调用printFilename 3次。

        2
  •  3
  •   reinierpost    16 年前

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