Net学习日记_ASP.Net_MVC_新语法笔记

01.新语法

本章中主要讲解.Net框架性语法。开发者可以使用新语法提高编程的效率以及代码的运行效率;其本质都是“语法糖”,由编译器在编译时转成原始语法。

1 自动属性 Auto-Implemented Properties

2  隐式类型 var

3  对象初始化器 与 集合初始化器 { }

4  匿名类 & 匿名方法

5  扩展方法

6  系统内置委托 Func / Action  Predicate (bool (T)) / Comparison (int (T,T))

7  Lambda表达式

8  标准查询运算符 Standard query operator

9  LINQ查询表达式

 

Mvc框架简介:

浏览器请求 服务器的 某个控制器类 的 Action方法,方法中可以调用业务层等代码处理业务,并产生数据Model,交给视图引擎,视图引擎会找到对应视图,并将数据 “填充到“视图上对应的位置,最终产生整个页面的Html代码,返回给浏览器。

 

关于编译器:

编译器会在编译的时候,按照C#语法检查代码,C#语法规定变量只能调用其声明类型的成员,如果声明是父类,则只能调用对象里的父类成员

自动属性

回顾传统属性概念

属性的目的:封装字段,控制 1.读写权限 及 2.字段的访问规则(如:年龄范围)。

但平时,主要是用来封装 读写权限。

 

回顾 语法:缺点,臃肿,代码难看!麻烦!

int id; //字段
public int Id //属性
{get { return id; }set { id = value; }
}

自动属性 语法:只需要定义 无实现的属性语法 即可,不需要定义字段。

public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }

查看源码:

编译后,也生成了对应的属性语法(get和set方法)

但同时,帮我们生成了一个私有变量

总结:

自动属性主要用在对 字段的 读写权限的封装,帮助减少程序员代码,让代码更好看;但实质上在编译时,还是会自动生成一个对应的字段的。

所以,从这个意义上说,自动属性就相当于是微软提供的一个“语法糖”了。

 

思考:

用自动属性程序员写的代码少了,机器做的事情就多了,那我们到底要不要使用它?

如果 是针对 读写权限的封装,就推荐使用,因为它是在编译的时候产生了负担,并不是在运行的时候。(不会影响客户运行程序时的效率!)

但是编译生成的代码也有一个显而易见的缺点,语法太完整,编译后的程序集会比较大。

 

隐式类型var

回顾,传统变量定义方式:

int age = 11;//传统方式

 

 隐式类型:在初始化时,就已经根据 = 右边的 值 确定了 var变量的类型了。

var age1 =12;
//age1="123";
var name = "哈哈哈";
var dog = new Dog();age1 = 123;
name = "刘德华";
dog.Id = 11;

编译时,已经 把var 转成了 相应的类型了。

注意:

1.声明的同时必须初始化,因为编译时要根据初始化值类型来推断var;

2.声明后不能修改数据类型,因为初始化时已经确定了var类型了;

3.只能作为方法局部变量使用。类的成员字段、方法的形参和返回值都不能使用!因为无法编译时确定他们的类型!

4.初始化表达式不能是匿名函数和null。

 

查看源码:var 已经不存在了,都被替换成了 初始化值 的 类型。

 

对象/集合初始化器

List<Dog> InitList()
{List<Dog> list = new List<Dog>();for (int i = 0; i < 10; i++){Dog d = new Dog();d.Id = i;d.Name = "Ruiky" + i;d.Age = i * 2;d.Toy = new DogToy();d.Toy.ToyId = i;d.Toy.ToyName = "狗狗玩具" + i;list.Add(d);}return list;
}

对象集合初始化器语法:

用法1List<Dog> InitList(){List<Dog> list = new List<Dog>();for (int i = 0; i < 10; i++){Dog d = new Dog{Id = i,Name = "Ruiky" + i,Age = i * 2,Toy = new DogToy()//使用属性初始化器
                    {ToyId = i,ToyName = "狗狗玩具" + i}};list.Add(d);}return list;}//用法2List<Dog> InitList(){List<Dog> list = new List<Dog>{new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = { ToyId=1, ToyName="小球"}}};return list;}

用初始化器,创建数组!

Dog[] dogs = {new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}},new Dog(){ Id=1, Name="Ruiky", Age=1, Toy = new DogToy{ ToyId=1, ToyName="小球"}}
};

 

查看源码:可以看到,编译器帮我们实例化的集合或者数组,并创建了元素对象,设置给数组或集合。

 

匿名类

回顾:

匿名类语法:

  a.避免过度的数据累积
  b.为一种情况特别进行的数据封装
  c.避免进行单调重复的编码

var obj = new{Id = 1,Name = "Ruiky",Age = 2};

 

查看源码:

1.编译器自动为 这个 【匿名类】 创建了一个无命名空间的类型。

2.在new 关键字处,创建该匿名类对象

3.编译器创建的匿名类结构

 

注意:

1. 当出现“相同”的匿名类的时候,编译器只会创建一个匿名类

2. 编译器如何区分匿名类是否相同?

   根据:

          属性名,属性值(因为这些属性是根据值来确定类型的),

          属性个数,属性的顺序。

 

匿名方法

回顾:普通方法定义方式,因为方法的存在是为了 复用 一段代码,所以一般会给方法取个名字,这个方法的引用就可以通过 "方法名"调用。

void Test(){Console.WriteLine("哈哈哈~!");}

 

匿名方法:但是有的方法,不需要复用,仅仅是使用一次就够了,所以不需要方法名,这种方法就叫做匿名方法。

匿名方法必须结合 委托 使用。(潜在的意思就是:尽管没有方法名了,但方法的指针还是存放在了某个委托对象中)

如,现在为线程指定要执行的方法的时候,就可以使用匿名方法了。

注意:

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

 

扩展方法

为什么要有扩展方法?      就是为了在不修改源码的情况下,为某个类 增加新的方法。

语法:

定义静态类,并添加public的静态方法,第一个参数 代表 扩展方法的扩展类。

a)       它必须放在一个非嵌套、非泛型的静态类中(的静态方法);

b)       它至少有一个参数;

c)       第一个参数必须附加 this 关键字;

d)       第一个参数不能有任何其他修饰符(out/ref)

e)       第一个参数不能是指针类型

 

public static class DogExtention{public static string SayHi(this Dog dogObj){return string.Format("哈哈哈哈~~~我叫{0}!", dogObj.Name);}
}
//-----------------------
//使用扩展方法
Dog d = new Dog() { 
Id = 1, Name = "0094", Age = 11, 
Toy = new DogToy() { ToyId=1, ToyName="小骨头" } 
};
string str = d.SayHi();//调用扩展方法,此时的对象d就作为第一个参数传到了扩展方法中
编译后: string str = DogExtention.SayHi(d);

 

注意:

1.当我们把扩展方法定义到其它程序集中时,一定要注意调用 扩展方法的环境中包含 扩展方法所在的命名空间。如,在Extention下为String类添加一个扩展方法

然后在页面中使用时,要记得导入命名空间,否则调用不到扩展方法:

2.扩展方法需要使用特性ExtensionAttribute,当前程序中必须包含程序集ComplilerServices,否则报错如下:

注:此程序集默认在FrameWork3.5开始自动包含。

3.因为扩展方法的本质是被编译后替换成静态方法,所以 对象本身 可以为 null,但是在这个扩展方法中,如果访问了第一个参数,则会报“空指针异常”。

查看源码:

1.通过源码看到,在执行 string str = d.SayHi();的地方,编译后变成了 这个扩展方法通过静态类的调用方式代码。由此可见,扩展方法并没有被"扩展"到Dog类中,只不过是在编译的时候替换成了静态类里的静态方法而已。d.SayHi()就是一个语法糖!

思考:如果 Dog类中本身就包含 SayHi方法,那会怎么样?

但同时包含同名的 实例方法 和 扩展方法时,优先调用实例方法。

 

泛型委托

 回顾通过【比较接口】方式:

让 Dog集合 根据Dog的id排序,需要写一个IComparer<Dog>接口的实现类,在类中重写 接口的 Compare方法,来返回 正整数/0/负整数。

接口:

实现类(比较器):

然后将实现类对象传入集合的Sort方法:

使用泛型委托 + 匿名方法实现:

List<T>集合类中包含 新的排序方法,根据 泛型委托Comparison<T> 完成比较过程。

public void Sort(Comparison<T> comparison);

看看这个Comparison<T> 泛型委托:

public delegate int Comparison<in T>(T x, T y);

修改调用的方法:

常用系统泛型委托:

1.System.Func 代表有返回类型的委托
public delegate TResult  Func<out TResult>(); 
public delegate TResult  Func<in T, out TResult>(T arg); 
......
注:输入泛型参数-in 最多16个,输出泛型参数 -out 只有一个。
2.System.Action 代表无返回类型的委托 //list.ForEach
public delegate void Action<in T>(T obj);    
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2); 
......
注:参数最多16个
3.System.Predicate<T> 代表返回bool类型的委托   //list.Find
public delegate bool Predicate<in T>(T obj);  
4.System.Comparison<T> 代表返回int类型的委托  - 用作比较两个参数的大小
public delegate int Comparison<in T>(T x, T y); //list.Sort

 

关于泛型委托的泛型参数列表 in out

//泛型委托 的 in 泛型参数 代表 可以被作为 参数列表的类型
//           out 泛型参数 代表 可以被作为 返回值的类型
public delegate T2 DgSay<in T,out T2>(T t1);

 

 

Lambda表达式

回顾,发现上面的代码,需要传一个 匿名方法 ,写起来特别别扭。

能否有简化的语法呢?有!Lambda表达式。

概念:

Lambda表达式有两种:

语法:

List<Dog> list = InitList();
//list.FindAll(delegate(Dog d) { return d.Id > 2; });
//1.表达式 Lambda
list.FindAll(d => d.Id > 2);// goes to
list.ForEach(d => Response.Write(d.ToString() + "<br/>"));//2.语句 Lambda
list.ForEach(d => { if (d.Id > 2) Response.Write(d.ToString() + "<br/>"); });

语法进化史:

查看源码:

C#语法:list.FindAll(d => d.Id > 2);

编译成中间代码后,代码太多,简而言之如下:

编译器帮我们 :

1.声明一个 Predicate<Dog>委托变量;

2.创建一个私有的符合委托签名的静态方法;

3.实例化委托变量,并将方法 传入;

4.调用list.FindAll方法,并传入委托变量。

 

转载于:https://www.cnblogs.com/lisong-home/p/8207086.html

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

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

相关文章

Mybatis_接口编程

Mybatis参考使用文档&#xff1a;http://www.mybatis.org/mybatis-3/zh/index.html 1.项目结构 2.新增EmployeeMapper.java接口代码 package com.atguigu.mybatis.dao;import com.atguigu.mybatis.bean.Employee;public interface EmployeeMapper {public Employee getEmpById(…

iconv 判断字符编码_GBK 和 UTF8编码

相关学习内容&#xff1a;https://study.163.com/course/courseMain.htm?courseId1210747815&share2&shareId480000002227524​study.163.com9节课征服「字符编码」 - 网易云课堂9节课征服「字符编码」 - 网易云课堂​study.163.com首先来看一下常用的编码有哪些&…

完美粉红噪声及各种声波测试软件,粉红噪声的测试原理

粉红噪声。既然是噪声就绝对不是单纯的纯音&#xff0c;它是一种频率覆盖范围很宽的声音。低频能下降到接近0Hz(不包括0Hz)高频端能上到二十几千赫&#xff0c;而且它在等比例带宽内的能量是相等的(误差只不过0.1dB左右)。比如用1/3oct带通滤波器去计算分析&#xff0c;我们会发…

catia怎么进入装配_CATIA教程之常见去参方法

Catia去除参数常用于以下几种情形&#xff1a;1)模型比较大&#xff0c;通过邮件发送不方便&#xff0c;去除模型参数可以减小模型数据大小。2)有时候需要将模型给别人使用&#xff0c;不希望对方知道你的建模过程或者更改你的模型&#xff0c;为了保密或者保护自己&#xff0c…

beeline执行sql文件_MyBatis的SQL执行流程不清楚?看完这一篇就够了

前言MyBatis可能很多人都一直在用&#xff0c;但是MyBatis的SQL执行流程可能并不是所有人都清楚了&#xff0c;那么既然进来了&#xff0c;通读本文你将收获如下&#xff1a;1、Mapper接口和映射文件是如何进行绑定的2、MyBatis中SQL语句的执行流程3、自定义MyBatis中的参数设置…

Git 下载、安装与SSH配置

一、Git学习笔记&#xff08;基于Github&#xff09; Git简介 Git是目前流行的分布式版本管理系统。它拥有两套版本库&#xff0c;本地库和远程库&#xff0c;在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行&#xff0c;所以在断网的…

windows7未能启动怎么修复计算机,win7系统提示windows无法启动这个硬件设备怎么办...

‍‍最近有很多深度技术win7用户在打开视频、光驱很有usb的时候&#xff0c;电脑出现了“图像处理设备由于其配置信息不完整或已损坏Windows 无法启动这个硬件设备(代码19)”的提示&#xff0c;这该怎么办呢&#xff1f;对于设备管理器中设备不正常的问题&#xff0c;下面由小编…

将视图转为image_使用视图绑定替代 findViewById

从 Android Studio 3.6 开始&#xff0c;视图绑定能够通过生成绑定对象来替代 findViewById&#xff0c;从而可以帮您简化代码、移除 bug&#xff0c;并且从 findViewById 的模版代码中解脱出来。本文梗概在 build.gradle 中就可以方便快捷地开启视图绑定且无须额外引入依赖库视…

第二专业 计算机考试成绩查询系统,2021年上半年信息系统项目管理师成绩查询时间公布(7月12日),查询入口已开通!...

2021年上半年信息系统项目管理师成绩查询时间公布!2021年7月12日上午11点3分48秒&#xff0c;软考办官网发布了2021年上半年计算机技术与软件专业技术资格(水平)考试成绩查询通知。2021年上半年信息系统项目管理师成绩查询入口开通!赶快来查成绩吧!2021年上半年信息系统项目管理…

本周数据与上周对比应如何表达_互联网运营中的数据分析方法

在大数据分析和产品、运营优化方面&#xff0c;大数据分析方法是其核心&#xff0c;那么如何做好数据分析呢&#xff0c;今天我们来讲讲互联网运营中的数据分析方法。1.细分分析细分分析是分析的基础&#xff0c;单一维度下的指标数据的信息价值很低。细分方法可以分为两类&…

惠斯通电桥信号调理芯片_elmos推出专为汽车应用开发的传感器信号调理芯片E520.47...

——符合标准ISO26262 &#xff0c;达到ASIL C等级2019年3月&#xff0c;德国巴伐利亚州慕尼黑讯&#xff0c;elmos日前宣布推出E520.47&#xff0c;这是一款带有SENT接口的传感器信号调理IC&#xff0c;支持两路电阻式传感器电桥的同步信号处理。该IC专为汽车应用的需求而开发…

lab 2 EIGRP Default Route

EIGRP发布默认路由的四种方式Redistributed default route #R1# router eigrp 100redistribute static network 10.1.1.1 0.0.0.0no auto-summary ip route 0.0.0.0 0.0.0.0 202.100.1.10By using ip summary-address command #interface FastEthernet1/0ip address 10.1.1.1 2…

今天英雄联盟服务器维护要到好久,lol今天维护时间是多久 lol维护公告2020最新...

英雄联盟今天维护到几点?今日维护时间是多久?lol维护公告2020最新消息来啦!英雄联盟在4月16日凌晨1点进行了游戏的停机更新。下面&#xff0c;就和小编一起来了解一下最新的维护内容吧!lol10.8版本维护到几点LOL将在4月16日凌晨1点关闭排位赛入口(不影响已经在进行中的对局)&…

开关怎么使用_水龙头漏水怎么办?使用时把控开关力度很重要

水龙头漏水是家居生活中器件中常见的故障之一&#xff0c;导致水龙头漏水的原因有很多&#xff0c;严重就需要我们更换新的水龙头了。水龙头漏水怎么办呢?其实&#xff0c;我们掌握一些家居生活的知识也是对我们很有帮助的&#xff0c;下面是水龙头漏水的解决办法以及预防措施…

fast路由器服务器未响应,win7系统下fast路由器进不了设置界面如何解决

最近有不少win7纯净版系统用户到本站反馈说碰到这样一个问题&#xff0c;就是在使用fast路由器的时候&#xff0c;进不了设置界面&#xff0c;导致无法进行一系列设置&#xff0c;该怎么办呢&#xff0c;接下来给大家讲解一下win7系统下fast路由器进不了设置界面的具体解决方法…

xshell堡垒机_Jumpserver开源堡垒机管理

此篇文章主要介绍jumpserver开源堡垒机管理&#xff0c;安装请移至&#xff1a;Jumpserver开源堡垒机安装一、用户管理1)添加用户1输入要添加的用户名&#xff0c;姓名&#xff0c;权限&#xff0c;Mail&#xff0c;并且发送邮件 —> 确认保存23查看添加的用户4查看用户邮件…

vnc连接服务器怎么配置文件,vnc服务器和客户端怎么配置文件

vnc服务器和客户端怎么配置文件 内容精选换一换用户通过psycopy2连接GaussDB(for openGauss)服务器时&#xff0c;可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时&#xff0c;默认用户已经获取了服务端和客户端所需要的证书和私钥文件&#xff0c;关于证书等文件的…

Linux学习(一)

从零开始学习linux&#xff0c;这里不多写虚拟机的安装以及centos的设置&#xff0c;简单粗暴从命令行开始&#xff1b; 一、目录介绍 /bin  存放必要的命令 /boot  存放内核以及启动所需的文件 /dev  存放设备文件 /etc  存放系统配置文件 /home  普通用户的宿主目录…

打印机服务器ip修改,怎么样更改打印机服务器的ip地址

怎么样更改打印机服务器的ip地址 内容精选换一换实例常用端口如表1所示。您可以通过配置安全组规则放通实例对应的端口&#xff0c;详情请参见配置安全组规则。无法访问公有云某些端口问题现象&#xff1a;访问公有云特定端口&#xff0c;在部分地区部分运营商无法访问&#xf…

66319d电源使用说明书_电热水壶怎么使用?电热水壶烧不开水的问题是什么?

电热水壶可在最短的时间里面给人们煮出热水&#xff0c;是目前人们见到的最为常见的小家电产品&#xff0c;但是电热水壶怎么使用?在使用电热水壶时&#xff0c;有遇到烧不开水的问题&#xff0c;这就影响到正常使用水壶了&#xff0c;电热水壶烧不开水的问题是什么?一、电热…