第八节:语法总结(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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

DotNet进阶系列

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

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

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

第十二节: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("------------…

第十四节: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 …

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

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

IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

前言&#xff1a; 记录 IIS 相关的笔记还是从公司笔试考核题开始的&#xff0c;问 Application Pool 与 AppDomain 的区别&#xff1f; 促使我对进程池进了知识的学习&#xff0c;所以记录一下学习的笔记。 我们知道现在 .NET 就业来看&#xff0c;80% 的 .NET 程序员都是从事 …

Http请求处理流程

从一个页面比如www.xuxiaoyu.net的请求开始如何就能打开blogs页面的呢&#xff1f;这其中发生了什么样的东西&#xff1f; Http请求(Http Request) 当服务器&#xff08;IIS&#xff09;接受到一个Http请求的时候进行以下步骤的处理&#xff1a; 1)服务器获取所请求的页面的后缀…

iis到w3wp的数据流及工作原理

HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析

演示地址&#xff1a;如有演示站请以演示为准&#xff0c;无演示站以截图为准,源码太多服务器有限&#xff0c;无法搭建所有源码演示站&#xff0c;请谅解&#xff01;新手购买指导&#xff1a;1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

php version.,PHP_VERSION指什么

PHP_VERSION (string)当前的PHP版本&#xff0c;以字符串形式“ major.minor.release [extra]”表示。 (推荐学习&#xff1a;PHP视频教程)例如&#xff1a;<?php // PHP_VERSION_ID 自 PHP 5.2.7 起有效&#xff0c;// 如果我们的版本低于该版本&#xff0c;则用以下代码来…

C# async 和 await 理解

先假设如下场景&#xff1a; 主函数 Main&#xff0c;循环等待用户输入&#xff1b; 计算函数 Cal&#xff0c;耗时计算大量数据&#xff1b; class Test {static int Main(string[] args){while(true){// 等待用户输入}}public static int Cal() {int sum 0;for (int i …

C# 彻底搞懂async/await

前言 Talk is cheap, Show you the code first&#xff01; private void button1_Click(object sender, EventArgs e) {Console.WriteLine("111 balabala. My Thread ID is :" Thread.CurrentThread.ManagedThreadId);AsyncMethod();Console.WriteLine("222 …

c#之task与thread区别及其使用

1.什么是thread 当我们提及多线程的时候会想到thread和threadpool&#xff0c;这都是异步操作&#xff0c;threadpool其实就是thread的集合&#xff0c;具有很多优势&#xff0c;不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程&#xff0c;主程序必须等…

java内存分配和垃圾回收,Java内存分配与垃圾回收

1.JVM管理的内存包含下图所示的几个运行时数据区域&#xff0c;其中方法区和堆为线程共享的数据区域&#xff0c;程序计数器&#xff0c;虚拟机栈以及本地方法栈为线程私有的数据区域。程序计数器&#xff1a;可以看做是当前线程所执行的字节码的行号指示器&#xff0c;告诉字节…

谈谈你对闭包的理解?

闭包这个概念好难理解&#xff0c;身边朋友们好多都稀里糊涂的&#xff0c;稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下&#xff0c;如果在一个函数的内部定义了另一个函数&#xff0c;外部的我们叫他外函数&#xff0c;内部的我们…