C#语言规范ver 5.0和List

时间:2013-06-20 18:21:57

标签: list specifications c#-5.0

我开始阅读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事件。

2 个答案:

答案 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>类。

相关问题