C#4.0语法糖之第五篇: 匿名类 & 匿名方法

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

1 internal class oneClass
 2 
 3 {
 4 
 5      //定义若干私有数据成员
 6 
 7      //通过属性来封装每个数据成员
 8 
 9      //…
10 
11 }

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

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

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

1 var v = new { Amount = 108, Message = "Hello" };

3             Console.WriteLine(v.Amount +"  "+ v.Message);

5             Console.ReadLine();

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

输出结果为:

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

1 var Aemployee = new
 2 
 3                 {
 4 
 5                     joinDate = "2007-7-31",
 6 
 7                     Apeople = new {Sex = "male", Name = "Linc", Age = "26"},
 8 
 9                     title = "projManager"
10 
11                 };

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

使用它的限制条件:

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

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

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

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

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

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

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

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

1 public class NNFF
 2 
 3     {
 4 
 5         //定义委托签名
 6 
 7         public delegate void Printer(string s);
 8 
 9         public static void Ceshi()
10 
11         {
12 
13             //传统方式
14 
15             Printer printer = SayHello;
16 
17             printer("你好");
18 
19         }
20 
21         public static void SayHello(string s)
22 
23         {
24 
25             Console.WriteLine("我是普通方法:" + s);
26 
27         }
28 
29     }

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

1 public class NNFF
 2 
 3     {
 4 
 5         //定义委托签名
 6 
 7         public delegate void Printer(string s);
 8 
 9         public static void Ceshi()
10 
11         {
12 
13             //匿名方法
14 
15             printer = delegate(string s)
16 
17                 {
18 
19                     Console.WriteLine("我是匿名方法:" + s);
20 
21                 };
22 
23             printer("你好");      
24          }
25 
26     }

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

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

注意:

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

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

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

C#4.0语法糖之第五篇: 匿名类 & 匿名方法

时间: 2024-10-08 19:22:16

C#4.0语法糖之第五篇: 匿名类 & 匿名方法的相关文章

C#语法糖之第五篇: 泛型委托- Action<T>

因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到的语法给大家分享给大家,希望能起到帮助的作用,但是本人也是个菜鸟,不是什么大神,所以 学习中也有不足的地方和没有扫到的地方,这里对上次扩展方法语法糖的问题,扩展方法确实是3.0开始就有了,或许是我以前没有用到,也没有查询欠缺,若要给大家带来不便,请大家原谅,现在把标题也修改为C#语法糖了,这里给大家

C#4.0语法糖之第三篇: 参数默认值和命名参数 对象初始化器与集合初始化器

今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完善以及自我提高,给各位园友们带来更好,更高效的文章. 废话就说到这里,下面正式进入我们的今天的C#4.0语法糖,今天给大家分享一下参数默认值.命名参数.对象初始化器和集合初始化器. 参数默认值和命名参数:方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合

C#4.0语法糖之第四篇: 扩展方法

今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到这个知识点之前做的方法: 最笨的办法就是修改原来的类型,然后添加一个方法来达到需求的变更,如下代码所示: 1 public class KuozFF 2 3 { 4 5 public void NormalMethod() 6 7 { 8 9 Console.WriteLine("我是原始方法&qu

C#4.0语法糖之第一篇:自动属性&隐式类型

今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象. get and set accessors." id="mt3">如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问. 我们C#4.0以前的传统方式的属性是用来封装字段的,这里我简单的对比一下这两种方

C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用

【OC语法快览】五、设计类接口

Designing a Class Interface     设计类接口 The Objective-C syntax for creating a class is very simple. It typically comes in two parts. 创建类的语法是很简单的,通常包括两部分. The class interface is usually stored in the ClassName.h file, and defines instance variables and

探索C#之6.0语法糖剖析

阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和finally代码块内的Await nameof表达式 扩展方法 总结 自动属性默认初始化 使用方法: public string Name { get; set; } = "hello world"; 为了便于理解使用2.0语法展示,编译器生成代码如下: public class Custom

C#6.0语法糖剖析

1.自动属性默认初始化 使用代码 public string Id { get; set; } = "001"; 编译器生成的代码: public class Customer { [CompilerGenerated] private string kBackingField = "hello world"; public Customer() { this.kBackingField = "hello world"; } public str

由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

**类装饰器** @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): def __call__(self,cls): return self.newfunc(cls) def good(self): print("新增的方法!") def newfunc(self,cls): def in_newfunc(): cls.addpty = "新增的属性&q