第八节:语法总结(2)(匿名类、匿名方法、扩展方法)

一. 匿名类

 1. 传统的方式给类赋值,需要先建一个实体类→实例化→赋值,步骤很繁琐,在.Net 3.0时代,微软引入匿名类的概念,简化了代码编写,提高了开发效率。

   匿名类的声明语法:  var obj=new {字段赋值};

   代码如下:

复制代码

1  // 匿名类(匿名类通过new关键字实现)
2  Console.WriteLine("------------------------------匿名类(匿名类通过new关键字实现)------------------------------");
3  var test1 = new
4      {
5          id = "1",
6          name = "maru1"
7      };
8  Console.WriteLine("id为{0},name为{1}", test1.id, test1.name);

复制代码

  运行结果如下:

 2. 匿名类的属性都是只读的

1  {
2      // test1.id = "2";   //报错
3  }

  3. 匿名类的属性共享机制

  A:属性的名称、类型和顺序一致,那么它们共享一个泛型类。

  B:属性的名称和顺序一致,但是属性类型不同,那么它们还是共享一个泛型类,只是泛型参数改变了,所以运行时,会生成不同的类。

  C:如果数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类。

 代码如下:

复制代码

    {var test1 = new{id = "1",name = "maru1"};          //1.属性名称、类型和顺序都一致,那么默认共享前一个泛型类Console.WriteLine("------------------------------1.属性类型和顺序都一致,那么默认共享前一个泛型类------------------------------");var test2 = new{id = "2",name = "maru2"};Console.WriteLine(test1.GetType() == test2.GetType());//2.如果属性名称和顺序一致,但属性类型不同,那么还是共同使用一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的类Console.WriteLine("---2.如果属性名称和顺序一致,但属性类型不同,那么还是共同使用一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的类-----");var test3 = new{id = 2,name = "maru2"};Console.WriteLine(test1.GetType() == test3.GetType());//3.如果数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类Console.WriteLine("------------------------------3.如果数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类------------------------------");var test4 = new{name="maru4",id = "1"};Console.WriteLine(test1.GetType() == test4.GetType());}

复制代码

 运行结果:

   

二. 匿名方法

  1. 这里主要介绍匿名方法在委托中的使用,匿名方法的关键字为:delegate。

  2. 传统委托的使用和.Net3.0时代匿名方法引入后的使用

复制代码

 1  public class MyDelegate2     {3         //1. 委托的声明4         public delegate void NoReturnNoPara();5         public delegate int WithReturnNoPara();6         public delegate void NoReturnWithPara(int id, string name);7         public delegate MyDelegate WithReturnWithPara(DateTime time);8 9         //2. 委托的使用(在show方法中调用)
10         public void Show()
11         {
12             //以“有参无返回值委托”为例,介绍委托的各种用法
13             //2.1 用法一
14             {
15                 NoReturnWithPara methord = new NoReturnWithPara(this.Test1);
16                 methord.Invoke(1, "唐马儒1");
17             }
18             //2.2 用法二
19             {
20                 NoReturnWithPara methord = this.Test1;
21                 methord.Invoke(2, "唐马儒2");
22             }
23             //2.3 用法三 DotNet 2.0 时代
24             {
25                 NoReturnWithPara methord = new NoReturnWithPara
26                     (
27                     delegate(int id, string name)
28                     {
29                         Console.WriteLine("{0} {1}", id, name);
30                     }
31                     );
32                 methord.Invoke(3, "唐马儒3");
33             }
34             //2.4 用法四 DotNet 3.0 时代
35             {
36                 NoReturnWithPara methord = new NoReturnWithPara
37                     (
38                         (int id, string name) =>
39                         {
40                             Console.WriteLine("{0} {1}", id, name);
41                         }
42                     );
43                 methord.Invoke(4, "唐马儒4");
44             }
45             //2.5 用法五 委托约束
46             {
47                 NoReturnWithPara methord = new NoReturnWithPara
48                     (
49                         (id,name) =>
50                         {
51                             Console.WriteLine("{0} {1}", id, name);
52                         }
53                     );
54                 methord.Invoke(5, "唐马儒5");
55             }
56             //2.6 用法六 (如果方法体只有一行,可以去掉大括号和分好)
57             {
58                 NoReturnWithPara methord = new NoReturnWithPara((id, name) => Console.WriteLine("{0} {1}", id, name));
59                 methord.Invoke(6, "唐马儒6");
60             }
61             //2.7 用法七
62             {
63                 NoReturnWithPara methord = (id, name) => Console.WriteLine("{0} {1}", id, name);
64                 methord.Invoke(7, "唐马儒7");
65                 methord(7, "唐马儒7");
66             }
67 
68         }
69         private void Test1(int id, string name)
70         {
71             Console.WriteLine("{0} {1}", id, name);
72         }
73 
74         private void Test2()
75         {
76             Console.WriteLine("DoNothing");
77         }
78 
79         private void Test3()
80         {
81             Console.WriteLine("DoNothing");
82         }
83     }

复制代码

三. 扩展方法

  扩展方法即对一些类型进行方法的扩展,扩展方法的三要素为:静态类、静态方法、this关键字。

  使用方法:this后面的那个扩展类型.方法名。

  下面对string类型扩展,使其可以将string类型转换成int类型,将MyExtend.ToInt(p1) 改装成 p1.ToInt()。

  演示重载,并对lambda中的where进行模拟

   代码如下

复制代码

 1  /// <summary>2     /// 扩展方法的三要素:静态类、静态方法、this关键字3     /// 使用方法:this关键后面对应的参数类型.扩展方法名4     /// </summary>5     public static class MyExtend6     {7         /// <summary>8         /// 1.对string类型进行扩展9         /// 将MyExtend.ToInt(p1) 改装成 p1.ToInt()
10         /// </summary>
11         /// <param name="p1">需要转换的string对象</param>
12         /// <returns></returns>
13         public static int ToInt(this string p1)
14         {
15             return Convert.ToInt32(p1);
16         }
17         
18         /// <summary>
19         /// 2.对string类型进行扩展
20         /// 将p1这个string类型转换成int类型,然后加上p2,最后输出
21         /// 将MyExtend.ToInt(p1,p2) 改装成 p1.ToInt(p2)
22         /// </summary>
23         /// <param name="p1">需要转换的string对象</param>
24         /// <param name="p2">被加的数</param>
25         /// <returns></returns>
26         public static int ToInt(this string p1,int p2)
27         {
28             return Convert.ToInt32(p1)+p2;
29         }
30         /// <summary>
31         /// Lambda模式的where方法自己实现
32         /// </summary>
33         /// <typeparam name="TSource"></typeparam>
34         /// <param name="source"></param>
35         /// <param name="func"></param>
36         /// <returns></returns>
37         public static IEnumerable<TSource> YpfWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> func)
38         {
39             List<TSource> studentList = new List<TSource>();
40             foreach (TSource item in source)
41             {
42                 bool bResult = func.Invoke(item);
43                 if (bResult)
44                 {
45                     studentList.Add(item);
46                 }
47             }
48             return studentList;
49         }
50     }

复制代码

     方法调用:

复制代码

 1  Console.WriteLine("------------------------------ 三. 扩展方法----------------------------------");2             {3                 {4                     //3.1 对string类型两个扩展方法的调用5                     Console.WriteLine("------------------------------ 3.1 对string类型两个扩展方法的调用----------------------------------");6                     string msg1 = "123";7                     //通过静态方法调用8                     Console.WriteLine(MyExtend.ToInt(msg1));9                     //通过扩展方法调用
10                     Console.WriteLine(msg1.ToInt());
11                     Console.WriteLine(msg1.ToInt(1));
12                 }
13 
14             }

复制代码

   运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 里面matches什么意思_Java Regex中的matches()和find()之间的区别

如果完整string匹配&#xff0c; matches()将只返回true。 find()会尝试find匹配正则expression式的子string中的下一个匹配项。 注意强调“下一个”。 这意味着&#xff0c;多次调用find()的结果可能不一样。 另外&#xff0c;通过使用find()你可以调用start()来返回子string匹…

第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

一. 委托的发展历史和基本用法 说起委托&#xff0c;每个人可能都会对他有不同的理解&#xff0c;结合实战中委托的使用&#xff0c;我对其理解是&#xff1a;委托和类一样&#xff0c;是用户的一个自定义类型&#xff0c;委托可以有参数、有返回值&#xff0c;委托的关键字是d…

java为什么不使用odbc_java jdbc和odbc的区别是什么?jdbc和odbc的关系是怎样的?

对于jdbc和odbc你都了解多少呢?今天要给大家讲到的就是jdbc和odbc之间的内容&#xff0c;一起来了解一下jdbc和odbc的区别以及关系是怎样的吧!下面先来给大家介绍一下jdbc和odbc之间的区别。总的来说&#xff0c;jdbc和odbc的区别可以划分成三大部分&#xff0c;一起来看看。一…

第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

一. 泛型委托 所谓的泛型委托&#xff0c;即自定义委托的参数可以用泛型约束&#xff0c;同时内置委托Func和Action本身就是泛型委托。 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。 1 public class Calculator22 {3 //传统解决方案一&am…

java中sql之count_按SQL Server中的count()子句分组

我正在尝试编写一个SQL查询&#xff0c;它将返回聚合值列表;但是&#xff0c;我想通过其中一个聚合值(计数)对查询进行分组&#xff1a;select t.Field1, count(distinct(t.Field2), SUM(t.Value1)from MyTable tgroup by t.Field1, count(t.Field2)我已经尝试将计数放入子查询…

java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密

https://www.cnblogs.com/miaoziblog/p/9040473.html近期由于项目需要使用SM4对数据进行加密&#xff0c;然后传给Java后台&#xff0c;Java后台使用的也是SM4的加密算法但是就是解密不正确&#xff0c;经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比…

用java设计节拍器_具有高速的Java节拍器

关于Thread.sleep()不可靠的答案是正确的&#xff1a;你不能指望它完全返回你指定的时间.事实上,我很惊讶你的节拍器可以使用,特别是当你的系统负载不足时.阅读Thread.sleep()的文档以获取更多详细信息.关于MIDI的Max Beikirch的答案是一个很好的建议&#xff1a;MIDI处理时机非…

java隐藏密钥_java – 在Android中隐藏密钥库密码的最佳方法是什么?

我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.这是客户端的一些代码.如您所见,我将密码硬编码到本地var中.是否有更好的方法加载密钥库密码,所以我…

DotNet进阶系列

一. 回顾历史 回顾个人发展历程&#xff0c;自2012年初次接触开发至今(2018年)已经有六个年头&#xff0c;这期间陆陆续续学习并掌握了不少技术&#xff0c;C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等&#xff0c;每种技术随着多次使用&#xff…

美团科技 Java工程师_美团Java工程师面试题(2018秋招)

第一次面试1.小数是怎么存的2.算法题&#xff1a;N二进制有多少个13.Linux命令(不熟悉4.JVM垃圾回收算法5.C或者伪代码实现复制算法6.volatile7.树的先序中序后序以及应用场景8.Mysql存储记录的数据结构9.索引数据结构10.为什么不用AVL和红黑树存&#xff1f;11.说实习项目12.r…

第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

一. 基本概念 1. 什么是特性? MSDN官方给出的定义时&#xff1a;公共语言运行时允许添加类似关键字的描述声明&#xff0c;叫做特性&#xff0c;它对程序中的元素进行标注&#xff0c;如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据&#xff…

java不建议用全局变量吗_不要使用全局变量, ThreadLocal也不行

不要使用全局变量的道理大家都懂&#xff0c;基本上在大家学习编程过程中很早就会被教育到&#xff0c;但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量&#xff0c;只不过这些全局变量会穿上马甲&#xff0c;让你不会一下看穿它的巨大危害&#xff0c;这里就讲一下我…

第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀 Lambda、Linq、SQL伴随着我的开发一年又一年&#xff0c;但它们三者并没有此消彼长&#xff0c;各自占有这一定的比重&#xff0c;起着不可替代的作用。 相信我们最先接触的应该就是SQL了&#xff0c;凡是科班出身的人&#xff0c;大学期间都会学习SQL Server数据库…

php java 共享session_PHP 实现多服务器共享 SESSION 数据

一、问题起源稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0c;即一套用户名、密码在整个网站的各个模块中都是可以登录…

第十三节:Lambda、linq、SQL的相爱相杀(2)

一. Linq开篇 1.Where用法 linq中where的用法与SQL中where的用法基本一致。 1 #region 01-where用法2 {3 //1. where用法4 //1.1 查询账号为admin的用户信息5 Console.WriteLine("------------…

asp 调用java文件上传_用asp实现文件浏览、上传、下载的程序

可以放在服务器上&#xff0c;对服务器上的文件进行浏览、上传、下载&#xff0c;可下载文件源码。把下所有代码入在一个文件里即可&#xff0c;文件的后缀要为asp。thedir request("thedir")if thedir "" thenfolderini server.mappath(".")…

第十四节:Lambda、linq、SQL的相爱相杀(3)

一. SQL 开篇 1. where用法 1    #region 封装EF调用SQL语句查询 2 public static List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars) 3 { 4 return db.Database.SqlQuery<T>(sql, pars).ToList(); 5 …

hive mysql windows_Java-从MySQL到Hive导入,其中MySQL在Windows上运行,而Hive在Cent OS上运行(Horton Sandbox)...

在任何答案和评论之前.我尝试了在Stackoverflow中找到的几个选项,但均以失败告终.以下是这些链接-我通过命令行在Horton Sandbox中进行了尝试并成功.sqoop import --connect jdbc:mysql://192.168.56.101:3316/database_name --usernameuser --passwordpwd --table table_name …

第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

一. 基本介绍 回忆&#xff1a; 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候&#xff0c;发现where方法里的参数是Expression<Func<T,bool>>这么一个类型&#xff0c;当初不是很理解&#xff0c;只是知道传入lambda表达式使用即可&…

Php7 mongodb explain,【代码片-1】 php7 mongoDB 简单封装

/*** mongoDB 简单 封装* 注意&#xff1a;支持 mongoDB 3.2** author color_wind*/finalclassm_mgdb {privatestatic$ins [];privatestatic$def"default";private$_conn null;private$_db null;privatestatic$_config ["default"> ["url">…