(.NET进阶一).NET新特性和Linq基础

本文深入探讨了C#中的高级特性,包括类型推断、匿名类、扩展方法及委托等概念的应用。通过实例讲解了var关键字的使用限制、匿名类的特性与使用场景、扩展方法的定义与注意事项,以及委托的基础使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.推断类型var关键字

二.匿名类的使用

三.简单扩展方法的应用

四、委托的基本使用


一.推断类型var关键字

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

 注意:  1.只能定义局部变量,而不能定义成员变量;

           2.定义的同时必须同时完成初始化,而不能使用var定义变量为null;

           3.var本身不是一种新的类型,只是用来修饰可以推断出具体类型的局部变量.

            var的本质:var类型和普通类型在代码编译过程的IL完全一样

b.var定义变量与object类型定义的区别

            var定义的类型,一旦确定类型,就无法更改

 

二.匿名类的使用

var student = new 
{
    Name = "张三",
    Age = 21,
    Project = "科学"
};

Console.WriteLine("姓名{0},年龄{1},课程{2}",student.Name,student.Age,student.Project);

上述中,student就是匿名类,该类在使用时同样可以使用智能感应,即可以通过变量点出属性。

特点:直接使用new关键字创建对象,使用var定义对象变量,而不需要提前编写类的成员,并且只能添加对象的属性

本质:编译器自动为匿名类生成名称

使用var注意的问题:
var a;//必须进行初始化-->  var a = 11;
var b = {1,2,3};//无法用数组数组初始值初始化隐式类型的局部变量   -->  var b = new int[]{1,2,3};
var c = null;//无法将null赋予隐式的局部变量   -->  var c = "李四";

三.简单扩展方法的应用

扩展方法必须定义在静态类中定义,第一个参数前加关键字this,其中的num和name为当期那变量,而非参数

//定义
namespace Linq
{

    static class ExtendMethod 
    {
        //定义int类型的扩展方法
        public static int GetAvg(this int num)
        {
            return num/2;
        }

        public static string Info(this string name)
        {
            return string.Format("{0},平均数为:",name);
         }
    }
}


//使用
static void Main(string[] args)
{
    string name = "张三";
    int totalScore = 500;
    Cosole.WriteLine("{0}{1}",name.Info(),totalScore.GetAvg());
}

//结果:
输出为:张三,平均数为250

用处:如果需要给第三方的类新增方法,但是该类型已被sealed修饰,可以通过扩展方法解决,克服了继承的局限性

 扩展方法的定义详解:

不带参数的扩展方法定义

static 方法名 (this 目标类型 目标类型参数)

带参数的扩展方法定义:

static 方法名 (this 目标类型 目标类型参数,参数类型1,参数类型1的参数名,...)

扩展方法使用中应该注意的问题:

1.扩展方法必须定义在静态类中,扩展方法本身也是静态方法

2.如果扩展方法和对应的类位于不同的命名空间,使用时应该引用扩展方法所在静态类的命名空间

3.当类本身的方法与扩展方法重名时,类本身的方法被优先调用

4.扩展方法不要过多使用(静态方法,占用内存)

 

四、委托的基本使用

1.了解委托

    *委托是一种新的面向对象语言特性,运行于.NET平台之上

    *基于委托,开发事件驱动的应用程序非常简单

    *使用委托可以大大简化多线程编程的难度

2.理解委托

    a.委托,也可以看成是一种数据类型,可以用于定义变量,但他是一种特殊的变量(只能接受一个方法)

    b.委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(方法)的指针

方法调用-->委托对象-->方法1,方法2,..(可以联想成律师,当事人的关系来进行理解,委托对象就是律师,方法调用为法院,方法为当事人),通过委托对象处理更加灵活

委托一般定义在类的外面

1.申明委托(定义函数的原型:返回值+参数类型和个数,定义在类的外面)

public delegate int CalculatorDelegate(int a,int b);//没有方法体

2.根据委托定义具体方法(方法定义在类中)

static int Add(int a,int b){return a+b;}

static int Sub(int a,int b){return a-b;}

3.创建委托对象,关联具体方法

CalculatorDelegate objcal = new CalculatorDelegate(Add);

4.通过委托调用方法,而不是直接使用方法

int result = objcal (10,20);

5.根据需要变换委托指向

objCal -= Add;//断开当前委托所关联的方法
objCal += Sub;//重新关联新方法

五、匿名方法与Lambda表达式

1.匿名方法

匿名方法没有具体名称,只有委托关键字、方法参数、方法体

匿名方法的特点:允许将代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法

static void Main(string[] args)
{
    //objCal为委托变量
    CalculatorDelegate objCal = delegate(int a,int b)
    {
        return a+b;//方法体
    };
    int result = objCal(5,10);
}

2.Lambda表达式

1.C#3.0引入Lambda表达式,利用它们可以更简练的编写代码块

(参数列表) => {方法体} goes to

static void Main(string[] args)
{
    //委托变量接收一个Lambda表达式
    //(int a,int b) =>{return a+b;};为Lambda表达式
    CalculatorDelegate objCal = (int a,int b) =>{return a+b;};
    int result = objCal(5,10);
}

2.Lambda表达式定义规范与使用说明

a.参数列表中的参数类型可以是“明确”类型或者是“推断”类型

b.如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来

//a,b为推断类型参数
Calculator objCal = (a,b) => {return a+b;};
static void Main(string[] args)
{
    MathDelegate objMath = a =>a*a;//如果参数只有一个可以省略();如果方法体只有一行代码乐意省略{}
    int result = objMath(10);
}
public delegate int MathDelegate(int a);

3.Lambda表达式符号

    a.Lambda运算符 => 读作"goes to"

    b.Lambda运算符的左边是输入参数(如果有),右边为表达式或语句块。Lambda表达式 x => x*x读作"x goes to x times x"

4.Lambda表达式与匿名方法比较

   a.lambda表达式本身就是匿名方法

   b.lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型

   c.lambda表达式方法允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值