C#进阶之LINQ(1)必备基础知识

(一).NET新特性与LINQ基础

(1)推断类型var关键字的使用

var可以根据变量的初始值自动推断 局部变量 的类型

注意:
  1. var只能定义 局部变量,不能定义成员变量;
  2. 定义的时候必须同时完成 初始化,不能使用var定义变量为null;
  3. var本身不是一个新的类型;只是用来修饰一个可以推断出具体类型的局部变量;
与object类的区别
  1. object类是父类,或者祖先类,任何类型都可以转换为object类;
  2. var可以根据类型进行推断,但是一旦推断确定后,不能再次进行改变;
    在这里插入图片描述

(2)匿名类的使用

在这里插入图片描述

//直接匿名使用,在使用之前,并没有定义这个类
class Program
    {
        static void Main(string[] args)
        {
            var objPerson = new
            {
                Name = "张三",
                Age = 26,
                ClassName = "三班"                
            };
            Console.WriteLine("姓名:{0}, 年龄:{1}, 班级:{2}", objPerson.Name, objPerson.Age, objPerson.ClassName);


        }
    }
特点:
  1. 直接使用new关键字创建对象,使用var定义对象变量;
  2. 不需要提前编写类的类型;并且只能添加对象的属性,不能添加方法;
注意:

在这里插入图片描述

(3)简单拓展方法的使用

扩展方法必须在静态类中定义;
扩展方法是一种特殊的静态方法;
第一个参数前加关键字 this , int 表示为所有的 int类型添加扩展方法;
在这里插入图片描述

注意:是对类的进行扩展
namespace test
{
    //扩展方法类(必须是静态的)
    static class ExtendMethod
    {
    	//this 必须添加;int代表给int类添加扩展方法;sum不是参数,只是表示当前变量
        public static double GetAvg(this int mySum)       
        {
            return mySum *1.0 / 5;
        }
    }

	class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("chengji:");
            int sum = Convert.ToInt32(Console.ReadLine());
            //这里调用了扩展类,括号中没有参数,因为这个扩展类不需要参数,那个mySum是当前变量,实际上是这里的sum
            Console.WriteLine("{0}", sum.GetAvg());
        }
    }
}
拓展方法解决的一个问题
  1. 当一个类使用sealed关键字,这样这个类不能被继承;
  2. 这个时候,想要在这个类中增加一个方法,就要适应拓展方法;
    在这里插入图片描述
附加内容

在这里插入图片描述

扩展方法使用之中注意的问题(总结):
  1. 扩展方法必须定义在静态类中;扩展方法本身也是静态方法;
  2. 扩展方法和对应的类位于不同的命名空间,使用的时,应该引入扩展方法所在静态类的命名 空间;
  3. 当类本身的方法与扩展方法重名时,类本身的方法优先调用;
  4. 扩展方法不要过多使用;(静态方法占用内存)

(4)委托的基本使用

<1> 了解并理解委托(delegate)
  • 了解委托:
    • 委托是一种新的面向对象语言特性,运行于.NET 平台之上;
    • 基于委托,开发事件驱动的应用程序非常简单;
    • 使用委托可以大大简化多线程编程的难度;
  • 理解委托:
    • 委托,也可以看做是一种数据类型,可以用于定义变量,但是它是一种特殊的变量;
    • 委托定义的变量能接收的数值,只能是一个方法(函数),可以理解为委托就是一个方法的指针;

在这里插入图片描述
在这里插入图片描述

<2> 委托的使用
  • 委托一般定义在类的外部;
  • 委托代表的是方法,方法必须与委托吻合;
  • 委托是一种特殊的引用类型;
using System;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //【3】创建委托对象,关联具体方法
            CalculateorDelegate objCal = new CalculateorDelegate(Add);  //添加默认的方法
            //【4】通过委托调用方法,而不是直接调用方法
            int result = objCal(10, 20);
            Console.WriteLine(result);
			
			//【5】根据需要变换委托的指向
            objCal -= Add;  //断开当前委托所关联的方法(加法)
            objCal += Sub;  //重新关联一个方法(减法)
            result = objCal(10, 20);
            Console.WriteLine(result);
        }
        //【2】根据委托定义具体方法(加法、减法)
        static int Add(int a, int b)
        {
            return a + b;
        }

        static int Sub(int a, int b)
        {
            return a - b;
        }
    }
    //【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
    public delegate int CalculateorDelegate(int a, int b);
}

(5)匿名方法与Lambda表达式

<1> 匿名方法
匿名方法允许将代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法;在这里插入图片描述
using System;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            CalculateorDelegate objCal = delegate (int a, int b)
            {
                return a + b;
            };
            int result = objCal(20, 10);
            Console.WriteLine(result);
        }
    }
    //【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
    public delegate int CalculateorDelegate(int a, int b);
}

<2> Lambda 表达式
  • 引入Lambda 表达式可以更简练的编写代码块;
  • 下面的Lambda表达式实际上与上面的匿名方法等价;
    在这里插入图片描述
using System;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            CalculateorDelegate objCal = (int a, int b) => { return a + b; };
            int result = objCal(12, 45);
            Console.WriteLine(result);
        }
    }
    //【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
    public delegate int CalculateorDelegate(int a, int b);
}

  • Lambda 表达式定义规范与使用说明:
    * 参数列表中的参数类型可以是“明确”类型,也可以是“推断”类型;
    * 如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来;
    

在这里插入图片描述
在这里插入图片描述

using System;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            MathDelegate objDelegate = a => a * a;
            Console.WriteLine(objDelegate(4));
        }
    }
    //【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
    public delegate int MathDelegate(int a);
}

<3>Lambda表达式总结
  • 关于Lambda表达式中的符号

    • Lambda 运算符 =>,读作“goes to”;Lambda表达式 x => x*x,读作“x goes to x times x”;
    • 该Lambda运算符的左边是输入参数(如果有),右边包含表达式或者语句块;
  • Lambda 表达式与匿名方法比较:

    • Lambda表达式本身就是匿名方法;
    • Lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型;
    • Lambda表达式方法允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式;
发布了66 篇原创文章 · 获赞 2 · 访问量 6671

猜你喜欢

转载自blog.csdn.net/forever_008/article/details/104068750
今日推荐