我开始阅读Visual Studio附带的C#语言规范:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033
在1.6.7.4 Events
一章中,我发现了以下内容:
事件是允许类或对象提供的成员 通知。事件被声明为字段,除了 声明包含一个事件关键字,类型必须是委托 类型。
在声明事件成员的类中,事件的行为 就像委托类型的字段一样(前提是事件不是 抽象,不声明访问者)。该字段存储引用 到代表已添加的事件处理程序的委托 参加活动。如果没有事件句柄,则该字段为空。
在
List<T>
类声明一个名为Changed的事件成员 表示已将新项目添加到列表中。改变了 事件由OnChanged虚拟方法引发,该方法首先检查 事件是否为null(表示不存在处理程序)。该 提出事件的想法恰恰等同于引用事件 由事件代表的代表 - 因此,没有特殊的语言 用于举办活动的结构。客户通过事件对事件做出反应 处理程序。事件处理程序使用+ =运算符和 使用 - =运算符删除。以下示例附加事件 处理
List<string>
的更改事件。using System; class Test { static int changeCount; static void ListChanged(object sender, EventArgs e) { changeCount++; } static void Main() { List<string> names = new List<string>(); names.Changed += new EventHandler(ListChanged); names.Add("Liz"); names.Add("Martha"); names.Add("Beth"); Console.WriteLine(changeCount); // Outputs "3" } }
对于控制底层存储的高级方案 事件是期望的,事件声明可以明确地提供添加和 删除访问器,它有点类似于a的set访问器 属性。
当我发现List.Changed
事件时,我感到非常惊讶,所以我在Visual Studio 2012中创建了一个新的控制台应用程序,并将目标框架设置为.NET 4.5。
当我尝试编译应用程序时(使用Visual Studio和Developer命令提示符),我收到以下错误:
错误CS1061:&#39; System.Collections.Generic.List&#39;才不是 包含&#39;已更改&#39;的定义并且没有任何扩展方法&#39;已更改&#39; 接受第一个类型的参数 &#39; System.Collections.Generic.List&#39;可以找到(是你 缺少using指令或程序集引用?)
我在这里遗漏了什么吗?我使用ILSpy来查看课程定义,但我没有看到Changed
事件。
答案 0 :(得分:2)
班级List<T>
在规范的前面部分,标题为其他功能成员的部分中定义:
下表显示了一个名为List的泛型类 实现可增长的对象列表。
此List<T>
类与类System.Collections.Generic.List<T>
没有关系,只是它们具有相同的名称。
答案 1 :(得分:1)
您没有遗漏任何内容,System.Collections.Generic.List<T>
没有任何Changed
事件。
我认为这仅仅是一个例子,而不是说明List<T>
类应该是什么样的规范。 (这没有多大意义,C#规范只指定了库的一小部分,当然不是任何特定的集合类。)
另请注意,规范会讨论一些常规List<T>
类,而不是特定的System.Collections.Generic.List<T>
类。