今天时间有点早,所以上来在写一篇文章吧,继续上一篇的文章,在我们平时编程过程中有没有遇到过这样的一个情景,你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法、事件和其他自定义的功能。同时,这个类仅仅在当前的应用程序中使用,而不需要在项目间重用。你所需要的只是一个“临时的”类型,现在我们来看看这个传统类的定义:

 
 }

从上面代码构建上看,这个类虽然说不上有多难,但是如果这个类有很多数据成员的话,那么还是要消耗相当时间的。为了解决这个问题微软给我们提出来一个新的概念叫匿名类型。

匿名类型:匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。

以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。

 , Message =  
             Console.WriteLine(v.Amount + 
             Console.ReadLine();

从该例子可以看出来这个匿名类型看起来比传统类型要简单明了。

输出结果为:

匿名类型也可以嵌套使用,代码如下:

 
                 };

该类在这里就简单的说一下,该类在lambda表达式中用的比较多,在分享lambda表达式时在看会理解的更透彻一些。

使用它的限制条件:

1:匿名类型不支持事件、自定义方法和自定义重写

2:匿名类型是隐式封闭的(sealed)

3:匿名类型的实例创建只使用默认构造函数

4:匿名类型没有提供可供控制的类名称(使用var 定义的)

匿名方法:普通方法定义方式,因为方法的存在是为了 复用 一段代码,所以一般会给方法取个名字,这个方法的引用就可以通过 "方法名"调用。但是有的方法,不需要复用,仅仅是使用一次就够了,所以不需要方法名,这种方法就叫做匿名方法。匿名方法必须结合 委托使用。(潜在的意思就是:尽管没有方法名了,但方法的指针还是存放在了某个委托对象中)

C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托。 这对于 Lambda 表达式来说是不可能的。

看到这些估计大家都云里雾里吧,咱们直接晒代码来更深的理解一下:

首先我们写一个传统方式的一个简单例子:

 
         {
 
              
             Printer printer = SayHello;
 
             printer( 
         }
 
          
         {
 
             Console.WriteLine( 
         }
 
     }

比如下面的Sayhello方法只有在Ceshi方法体内调用,不再别的地方使用时该方法在外面单独写一个方法时给人感觉有点繁琐。下载我们再来看看匿名方法的写法:

 
         {
 
              
             printer =  
                 {
 
                     Console.WriteLine( 
                 };
 
             printer(          }
 
     }

从上面可以看出把输出内容的方法写到方法Ceshi里了,这样对于该方法是属于受保护的外界是没有办法调用的。

在下两次课分享lambda表达式时在举个更具体的例子,并对比一下,其实lambda表达式在某种程度上就是匿名方法。匿名方法的简写!

注意:

1.在编译后,会为每个匿名方法创建一个 私有的静态方法,然后将此静态方法传给 委托对象使用。

2.匿名方法:编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给 声明的委托变量。

3.匿名方法可以省略参数:编译的时候 会自动为这个方法 按照 委托签名的参数 添加参数

最新文章

  1. Linux-4.4-x86_64 内核配置选项简介【转】
  2. Web Worker 是什么鬼?
  3. TIJ——Chapter One:Introduction to Objects
  4. 绑定本地Service并与之通信-----之二
  5. POJ 2253 Frogger(最小生成树)
  6. Why Creating a Meaningful Morning Routine Will Make You More Successful
  7. NOI题库1799 最短前缀
  8. javascript小数相减会出现一长串的小数位数的原因
  9. 如何动态修改grid的列名
  10. 【Egret】里使用video标签
  11. VS 中 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
  12. GB GBRT XgBoost
  13. ssh-keygen -t rsa 生成密钥对后如何校验
  14. HihoCoder1192 简单的树嵌入 dfs、构造
  15. Suricata在ubuntu14.04环境下安装
  16. Layer文件上传操作
  17. 【转】Mysql两种存储引擎的异同【MyISAM和InnoDB】
  18. Dapper的简单使用(初学者归纳)
  19. Golddata如何采集需要登录/会话的数据?
  20. iphone6 iPhone6 Plus的导航栏等高度

热门文章

  1. Android日期时间格式国际化
  2. 【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)
  3. VirtualBox设置共享文件夹和镜像访问的方法
  4. m2e使用问题——发布web项目时lib目录下的jar包未发布
  5. POJ_3104_Drying_(二分,最小化最大值)
  6. BZOJ3323: [Scoi2013]多项式的运算
  7. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法
  8. 初次运行 Git 前的配置
  9. 在MyEclipse配置自己安装的Tomcat(2014.08.18)
  10. 动态规划---最长公共子序列 hdu1159