1.自动属性 Auto-Implemented Properties

2.隐式类型 var

3.参数默认值 和 命名参数

4.对象初始化器 与 集合初始化器 { }

5.匿名类 & 匿名方法

6.扩展方法

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

7.1.Action<T>(无返回类型)

7.2.Predicate<T>(返回boolen类型)

7.3.Comparison<int (T,T)> 返回int类型

7.4.Func<T,TResult>  返回自定义TResult类型

7.5 Func<T,TResult> + 匿名类

8.Lambda表达式

9.标准查询运算符 Standard query operator

9.1.标准查询运算符: 定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选.

9.2.标准查询运算符 - 分页 Skip().Take()

10.LINQ查询表达式

 

1.自动属性

回顾传统属性概念

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

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

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

  1. int id; //字段
  2.  
  3. public int Id //属性
  4.  
  5. {
  6.  
  7.   get { return id; }
  8.  
  9.   set { id = value; }
  10.  
  11. }

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

  1. public int Id { get; set; }
  2.  
  3. public int Age { get; set; }
  4.  
  5. public string Name { get; set; }

2.隐式类型 var

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

  1. int age = 11;//传统方式

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

  1. var age1 =12;
  2.  
  3. //age1="123";
  4.  
  5. var name = "哈哈哈";
  6.  
  7. var dog = new Dog();
  8.  
  9. age1 = 123;
  10.  
  11. name = "刘德华";
  12.  
  13. dog.Id = 11;

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

注意:

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

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

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

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

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

3.参数默认值 和 命名参数

参数默认值

  1. static void TestDefault(int age = 25, string name = "TangSan")
    {
    Console.WriteLine(string.Format("{0}的年龄为{1}", name, age));
    }

测试值

  1. TestDefault(); //TangSan的年龄为25
    TestDefault(27); //TangSan的年龄为27
    TestDefault(22, "Liu"); //Liu的年龄为22
 
问题:不给age赋值,直接给name赋值。
 

命名参数

  1. TestDefault(name: "命名参数");//命名参数的年龄为25
 
4.对象初始化器 与 集合初始化器 { }
  1. /// <summary>
    /// 集合初始化器
    /// </summary>
    static void TestInitialCollection()
    {
    List<Dog> list = new List<Dog>{
    new Dog(){ Id=1, Name="Ruiky1", Age=11, },
    new Dog(){ Id=2, Name="Ruiky2", Age=12, },
    new Dog(){ Id=3, Name="Ruiky3", Age=13, },
    new Dog(){ Id=4, Name="Ruiky4", Age=14, },
    new Dog(){ Id=5, Name="Ruiky5", Age=15, }
    };
  2.  
  3. foreach (var item in list)
    {
    Console.WriteLine(
    string.Format("ID号:{0},名称Name:{1},年龄Age:{2}.",item.Id,item.Name,item.Age));
    }
    }

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


5.匿名类 & 匿名方法

匿名类

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

在编译后会生成一个【泛型类】,包含:

a. 获取所有初始值的构造函数,顺序与属性顺序一样;

b.公有的只读属性,属性不能为null/匿名函数/指针;

c.属性的私有只读字段;

d.重写的Equals,GetHashCode,ToString()方法

用处

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

注意:匿名类的属性是只读的 –可放心传递,可用在线程间共享数据

匿名方法

函数式编程的最大特点之一:把方法作为参数和返回值。 DGShowMsg -> MulticastDelegate(intPtr[]) -> Delegate(object,intPtr)

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

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

  1. delegate void DGTest(string str);
    static void InvokeMethod(DGTest dg)
    {
    dg("匿名方法!");
    }

测试

  1. InvokeMethod(delegate(string str)
    {
    Console.WriteLine("参数:" + str );
    }); //匿名方法

6.扩展方法

另外写一个类,(扩展方法)

调用TestExtensionMethod

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

7.1.Action<T>(无返回类型)

7.2.Predicate<T>(返回boolen类型)

  1. static List<Dog> GetDogList()

  1. {

  1. return new List<Dog>(){

  1. new Dog(){Age=1,Name="小白1"},

  1. new Dog(){Age=2,Name="小黑2"},

  1. new Dog(){Age=3,Name="小花3"}

  1. };

  1. }

先给List<T>定义一个扩展方法

  1. public static void DeleteItem<T>(this List<T> list, Predicate<T> predicateWhere)

  1. {

  1. List<T> updateitems = new List<T>();

  1. //遍历数据集合,根据条件找到要修改的元素 添加到元素集合中

  1. foreach (T item in list)

  1. {

  1. //根据传入的条件,找到要删除的元素

  1. if (predicateWhere(item))

  1. {

  1. updateitems.Add(item);

  1. }

  1. }

  1.  

  1. //遍历要删除的元素,在集合中删除

  1. foreach (T updates in updateitems)

  1. {

  1. list.Remove(updates);

  1. }

  1. }

然后调用

  1. List<Dog> list = GetDogList();

  1. //list.ForEach(new Action<Dog>( d => { Console.WriteLine(d.Name + "," + d.Age); }));

  1. //list.ForEach(new Action<Dog>(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); }));

  1. //Console.WriteLine("----");

  1. //直接传方法

  1. list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });

  1. Console.WriteLine("----");

  1. list.DeleteItem<Dog>(delegate(Dog d) { return d.Age > 1; });

  1. list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });

调用扩展方法 DeleteItem<T>过程

7.3.Comparison<int (T,T)> 返回int类型

  1. static void SortByInterface()

  1. {

  1. List<Dog> list = GetDogList();

  1. list.Sort(new Comparison<Dog>(

  1. delegate(Dog x, Dog y){ return y.Age - x.Age; })

  1. );

  1. list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });

  1. }

7.4.Func<T,TResult>  返回自定义TResult类型

7.4.1 定义一个SmallDog,只有Name参数

  1. class SmallDog
    {
    public string Name { get; set; }
    }

7.4.2 将Dog转换成SmallDog.

  1. static void TestFunc()
    {
    List<Dog> list = GetDogList();
    //将Dog转换成SmallDog.
    IEnumerable<SmallDog> list2 = list.Select(new Func<Dog, SmallDog>(
    delegate(Dog d) { return new SmallDog() { Name = d.Name }; }
    ));//.ToList();
  2.  
  3. foreach (var item in list2)
    {
    Console.WriteLine(item.Name);
    }
  4.  
  5. //list2.ForEach(delegate(SmallDog d) { Console.WriteLine(d.Name); });
    }

7.5 Func<T,TResult>+匿名类

  1. /// <summary>
    /// Func + 匿名类<in T,out TResult>
    /// </summary>
    static void TestFuncAnonyClass()
    {
    List<Dog> list = GetDogList();
    //将Dog转换成SmallDog.
    var list2 = list.Select(
    delegate(Dog d) { return new { Name = d.Name, Date = DateTime.Now }; }
    );
    foreach (var item in list2)
    {
    Console.WriteLine(item.Name + "," + item.Date);
    }
    }

8.Lambda表达式

语句Lambda 和 表达式Lambda 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)
Lambda本身无类型,所以不能赋值给 var 变量。 编译时会生成一个静态方法,然后再实例化成委托传递使用.

  1. List<Dog> list = GetDogList();
    //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.  
  3. //2.语句 Lambda
    list.ForEach(d => { if (d.Id > 2) Response.Write(d.ToString() + "<br/>"); });

演化过程

9.标准查询运算符 Standard query operator

9.1.标准查询运算符: 定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选.

筛选集合Where:需要提供一个带bool返回值的“筛选器”,从而表明集合中某个元素是否应该被返回。
查询投射,返回新对象集合 IEnumerable<TSource> Select()

统计数量int Count()

多条件排序 OrderBy().ThenBy().ThenBy()

集合连接 Join()

......

重新写一个GetDogList

  1. static List<Dog> GetDogList()
    {
    return new List<Dog>(){
    new Dog(){ Id=1, Age=10,Name="小白1", Gender=false},
    new Dog(){Id=2,Age=9,Name="小黑2", Gender=true},
    new Dog(){Id=3,Age=14,Name="小花3", Gender=false},
    new Dog(){Id=4,Age=3,Name="小黄4", Gender=true},
    new Dog(){Id=5,Age=7,Name="小白5", Gender=true}
    };
    }

在Dog类添加

  1. using System;
  2.  
  3. namespace NewGrammar
    {
    public class Dog
    {
    public int Id { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
  4.  
  5. /// <summary>
    /// 性别
    /// </summary>
    public bool Gender { get; set; }
  6.  
  7. public override string ToString()
    {
    return Id + "," + Name + "," + Age + "," + Gender;
    }
  8.  
  9. }
    }

Where和Select

  1. /// <summary>
    /// 标准查询运算符 - Select 投射方法(返回一个 新的集合)
    /// </summary>
    static void testSQOSelect()
    {
    List<Dog> list = GetDogList();
    List<SmallDog> small = list.Where(d => d.Gender == false)
    .Select(d => new SmallDog() { Name = d.Name }).ToList();
  2.  
  3. small.ForEach(d=> Console.WriteLine(d.Name));
    }

orderby

  1. /// <summary>
    /// 标准查询运算符 - OrderBy 投射方法(返回一个 新的集合)
    /// </summary>
    static void testSQOOrderBy()
    {
    List<Dog> list = GetDogList();
    List<Dog> small = list.OrderBy(d => d.Age).ToList();
  2.  
  3. small.ForEach(d => Console.WriteLine(d.ToString()));
    }

在GetDogList方法里添加一条数据,年龄和ID2相同

  1. new Dog(){Id=6,Age=9,Name="小黑2", Gender=true},

加一个ThenBy
  1. /// <summary>
    /// 标准查询运算符 - OrderBy 投射方法(返回一个 新的集合)
    /// </summary>
    static void testSQOOrderBy()
    {
    List<Dog> list = GetDogList();
    List<Dog> small = list.OrderBy(d => d.Age).ThenBy(d=>d.Id).ToList();
  2.  
  3. small.ForEach(d => Console.WriteLine(d.ToString()));
    }

9.2.标准查询运算符 - 分页

  1. /// <summary>
    /// 标准查询运算符 - 分页
    /// </summary>
    static void TestPage()
    {
    var pageOne = GetPageListByIndex(1, 2);
    Console.WriteLine("第一页数据:");
    pageOne.ForEach(d=>Console.WriteLine(d.ToString()));
    var pageTwo = GetPageListByIndex(2, 2);
    Console.WriteLine("第二页数据:");
    pageTwo.ForEach(d => Console.WriteLine(d.ToString()));
    var pageThree = GetPageListByIndex(3, 2);
    Console.WriteLine("第三页数据:");
    pageThree.ForEach(d => Console.WriteLine(d.ToString()));
    }
  2.  
  3. /// <summary>
    /// 分页
    /// </summary>
    /// <param name="pageIndex">页数</param>
    /// <param name="pageSize">每页行数</param>
    /// <returns></returns>
    static List<Dog> GetPageListByIndex(int pageIndex,int pageSize)
    {
    List<Dog> list = GetDogList().OrderBy(d => d.Id).ToList();
    return list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
    }

10.LINQ查询表达式

MVC基础知识 – 2.新语法的更多相关文章

  1. MVC基础知识 – 2.新语法

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和 命名参数 4.对象初始化器 与 集合初始化器 { } 5.匿名类 & 匿名方法 ...

  2. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

  3. 基础知识(C#语法、数据库SQL Server)回顾与总结

    前言 已经有大概一个多月没有更新博客,可能是开始变得有点懒散了吧,有时候想写,但是又需要额外投入更多的时间去学习,感觉精力完全不够用啊,所以为了弥补这一个多月的潜水,决定写一篇,衔接9月未写博客的空缺 ...

  4. MVC 基础知识

    一. MVC架构1.MVC模式是一种严格实现应用程序各部分隔离的架构模式.隔离:分离关注点,松耦合2.模型(Model) 代表着核心的业务逻辑和数据.模型封装了域实体的属性和行为3.视图(View) ...

  5. Python基础知识1-基础语法

    pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类  低级语言到高级语言 高级语言 程序Pr ...

  6. Spring MVC基础知识整理➣拦截器和自定义注解

    概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...

  7. Spring MVC基础知识整理➣环境搭建和Hello World

    概述 Spring MVC属于SpringFrameWork的产品,采用Model-View-Controller进行数据交互,已经融合在Spring Web Flow里面.Spring 框架提供了构 ...

  8. mvc基础知识(1)

    复制大佬的,侵权请联系我主动删除 1.js/css合并 在之前的crud例子中,我们引入js/css脚本的方式和平常的web开发一样 <script src="~/Scripts/jq ...

  9. 【Python基础知识】【语法】【入门】

    一.Python概述 Python是一门面向对象的编程语言,拥有强大丰富的库,没有操作系统的限制,是一种优美.清晰的编程语言. 二.Python基础语法 1.Python标识符 标识符就是程序中定义的 ...

随机推荐

  1. 【树状数组】【P3902】 递增

    传送门 Description 给你一个长度为\(n\)的整数数列,要求修改最少的数字使得数列单调递增 Input 第一行为\(n\) 第二行\(n\)个数代表数列 Output 输出一行代表答案 H ...

  2. PID控制算法的C语言实现十 专家PID与模糊PID的C语言实现

    本节是PID控制算法的C语言实现系列的最后一节,前面8节中,已经分别从PID的实现到深入的过程进行了一个简要的讲解,从前面的讲解中不难看出,PID的控制思想非常简单,其主要问题点和难点在于比例.积分. ...

  3. 【CodeForces】578 C. Weakness and Poorness

    [题目]C. Weakness and Poorness [题意]给定含n个整数的序列ai,定义新序列为ai-x,要使新序列的最大子段和绝对值最小,求实数x.n<=2*10^5. [算法]二分| ...

  4. 通用标签、属性(body属性、路径、格式控制)

    通用标签.属性 一.body属性 1.bgcolor属性:网页背景颜色 2.text属性:规定文档中所有文本的颜色. 3.background属性:规定文档的背景图像. 二.路径 1.绝对路径: 从根 ...

  5. div遮罩实现禁用鼠标(click、hover等)事件

    这两天在帮老师做网页,今天想实现在一块区域内禁止鼠标的各种事件,本来是想在框架模板的js文件里去修改,但是改代码的时候有点凌乱...感觉应该自己把问题想复杂了. 所以想了想要是能实现在一个区域内(如: ...

  6. JS 判断是否是微信浏览器 webview

    原理很简单,就是判断 ua 中是否有字段 “micromessenger" 代码如下: function isWechat () { var ua = window.navigator.us ...

  7. 深入理解Spring系列之四:BeanDefinition装载前奏曲

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483835&idx=1&sn=276911368d4 ...

  8. 生产环境手把手部署ERC20智能合约

    工具 rimex http://remix.ethereum.org/ metamask https://metamask.io/ ERC20 代码 https://github.com/OpenZe ...

  9. 一文掌握关于Java数据结构所有知识点(欢迎一起完善)

    在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...

  10. 高性能优秀的服务框架-dubbo介绍

    先来了解一下这些年架构的变化,下面的故事是我编的.... "传统架构":很多年前,刚学完JavaWeb开发的我凭借一人之力就开发了一个网站,网站 所有的功能和应用都集中在一起,方便 ...