c#匿名方法的静态数据成员和实例数据成员用法

匿名方法总是以一个delegate关键字开始,后面跟着用在方法和方法体(the method body)本身中的参数。正如从上面示例中所见,用户不需要确定匿名方法的返回类型。它(译注:指返回类型)由方法体中的return语句推断而来。.NET CLR不能执行像匿名方法一样的自由流(free flowing)代码块。CLR要求:它执行的每个方法是一个类型的一部分,并且应该是一个静态(static)方法或实例(instance)方法(译注:若一个方法声明中含有 static 修饰符,则称该方法为静态方法。若其中没有 static 修饰符时,则称该方法为实例方法。静态方法不对特定实例进行操作,在静态方法中引用 this 是编译时错误。实例方法对类的某个给定的实例进行操作,而且可以用 this来访问该实例)。因此当你在一个类的代码中写匿名方法并编译这个代码时,C#编译器默默地在你定义匿名方法的相同的类中创建了一个静态或实例方法。所以匿名方法只是一个在类中定义你自己方法以传递到委托(委托处理器/事件处理器)的方便的语法。

当你编译上面的示例时,C#编译器在类''Program''内部即我们定义匿名方法的地方创建了两个private static方法。它此时用这些static方法的地址取代了匿名方法。编译器决定如何创建静态方法或实例方法取决于匿名方法被定义的类中的静态或实例数据成员的用法。在我们的示例中,我们没有用到任何类''Program''的数据成员,因为调用一个静态方法而不是一个实例方法将是高效的,因此C#编译器创建一个static方法来封装我们的匿名方法的代码。下面是这个示例程序集''Program'' 类的ILDASM视图。高亮部分显示了由C#编译器默默添加到''Program''类的新的静态方法。

如果我们已经使用了用匿名方法的''Program'' 类的任何静态数据,C#编译器将仍然在''Program'' 类里创建一个静态方法来包装匿名方法。

匿名方法的实例数据成员用法

让我们在我们的示例中的''Program''类中定义一个新的实例方法,并使用示例类(译注:即''Program''类)一个实例数据成员。下面的代码显示了修改后的示例:

public class Program
{
  public delegate void MyDelegate();
  public static void Main(string[] args)
  {
   //实例数据成员测试
   Program p = new Program();
   for(int i=1;i<=5;i++)
    p.TestInstanceDataMembers();
  }
  public void TestInstanceDataMembers()
  {
   MyDelegate d = delegate
   {
    Console.WriteLine("Count: {0}",++m_iCount);
   };
   d();
  }
  public int m_iCount = 0;
}

我们定义了一个新的实例方法:TestInstanceDataMembers,在''Program''类中这个方法定义了一个匿名方法,匿名方法使用了实例数据成员:隶属''Program''类的m_iCount。当这个示例编译时,C#编译器将创建一个private实例方法来包装这个在TestInstanceDataMembers中定义的匿名方法。C#编译器必须创建一个实例方法因为该方法需要访问''Program''类的实例数据成员。下面是这个示例程序集''Program''类的ILDASM视图。在图的下部选中部分显示了由C#编译器默默添加到''Program''类的新的private实例方法。

时间: 2024-12-03 19:39:36

c#匿名方法的静态数据成员和实例数据成员用法的相关文章

Visual C# 2.0匿名方法揭密

visual 匿名方法基础 匿名方法是C#2.0的一个新的语言特性.本文的主要内容是提供给读者关于匿名方法的内部实现和工作方式的一个更好的理解.本文无意于成为匿名方法的完全语言特性参考. 匿名方法允许我们定义委托对象可以接受的代码块.这个功能省去我们创建委托时想要传递给一个委托的小型代码块的一个额外的步骤.它也消除了类代码中小型方法的混乱.让我们看看:比方说,我们有一个字符串集合命名为MyCollection.这个类有一个方法:获得集合中满足用户提供的过滤准则的所有项,调用者决定在集合中的一个特

C#2.0语言规范(三)匿名方法

规范 第三章 匿名方法原著:Microsoft Corporation原文:http://msdn.microsoft.com/vcsharp/team/language/default.aspx (SpecificationVer2.doc)翻译:lover_P出处: -------------------------------------------------------------------------------- [内容] 3.1 匿名方法表达式 3.2 匿名方法签名 3.3 匿

C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码

程序|创建 本文基于 Microsoft Visual Studio 2005 的预发布版本,它以前的代码名称为"Whidbey".此处所包含的任何信息都可能会改变. 本文讨论: • 遍历集合 • 跨文件类定义 • 与委托一起使用的匿名方法 • Visual Studio 2005 中的其他 C# 新功能 本文使用下列技术: • C# 和 Visual Studio 可以在此下载代码: • C20.exe (164KB) 本页内容 迭代程序 迭代程序实现 递归迭代 局部类型 匿名方法

艾伟:警惕匿名方法造成的变量共享

匿名方法 匿名方法是.NET 2.0中引入的高级特性,"匿名"二字说明它可以把实现内联地写在一个方法中,从而形成一个委托对象,而不用有明确地方法名,例如:   static void Test() { Action<string> action = delegate(string value) { Console.WriteLine(value); }; action("Hello World"); } 但是匿名方法的关键并不仅于"匿名&quo

C# 委托 事件 匿名方法

(*) 委托 delegate 从最简单的例子开始: namespace ConsoleApplication1 { class Program { // 委托其实就相当于一个类型.这里,类型的名字叫BinaryOp public delegate int BinaryOp(int x, int y); static public int Add(int x, int y) { return x + y; } static void Main() { // 创建一个BinaryOp类型的实例,用

c#-C#静态变量重新赋值 旧数据还是会占用内存么

问题描述 C#静态变量重新赋值 旧数据还是会占用内存么 如题 如果我的程序中有30个静态变量 而且频繁的对其进行赋值(几乎3秒一次) 那么之前的值(数据) 还是会占用内存么 这样挂起 会导致cpu飙高么? 解决方案 旧数据不会占用内存. 解决方案二: 看什么类型,如果是引用类型,会消耗一些内存.值类型直接覆盖. 引用类型,如果之前的对象没有其它引用,会被gc回收,但是如果你的内存比较大,未必会马上回收. 解决方案三: 如果你不断生成新的datatable,datatable又很大,不断赋值,那么

从.NET中委托写法的演变谈开去(上):委托与匿名方法

在<关于最近面试的一点感想>一文中,Michael同学谈到他在面试时询问对方"delegate在.net framework1.1,2.0,3.5各可以怎么写"这个问题.于是乎,有朋友回复道"请问楼主,茴香豆的茴有几种写法","当代孔乙己",独乐,众乐.看了所有的评论,除了某些朋友认为"的确不该不知道这个问题"之外,似乎没有什么人在明确支持楼主. 不过我支持,为什么?因为我也提过出这样的问题. 这样,我们暂且不提应

一起谈.NET技术,从.NET中委托写法的演变谈开去(上):委托与匿名方法

在<关于最近面试的一点感想>一文中,Michael同学谈到他在面试时询问对方"delegate在.net framework1.1,2.0,3.5各可以怎么写"这个问题.于是乎,有朋友回复道"请问楼主,茴香豆的茴有几种写法","当代孔乙己",独乐,众乐.看了所有的评论,除了某些朋友认为"的确不该不知道这个问题"之外,似乎没有什么人在明确支持楼主. 不过我支持,为什么?因为我也提过出这样的问题. 这样,我们暂且不提应

Access与Office其他成员轻松交流数据

access|数据 Access是Office组件的重要成员,其主要功能是数据库的管理和应用.由于其普及率和易用性都不及其他成员,所以大家常常会觉得Access的操作不太方便.比如,在Access的表中,要想在中间插入一条记录就比较困难,而在Word表格和Excel的工作表中要做同样的操作则易如反掌:再比如,当我们在Access的表中重复输入相同或有一定规律的字段内容时,就自然会联想到Excel的复制和自动填充功能,但Access却无能为力.显然,如果我们能够实现Access与Office组件其