ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#(008):C# 3.0 新特性1 ( NET Framework 3.5 与 Visual Studio 2008 )自动实现属性、扩展方法、Lambda,Linq,表达式树

2022-05-15 08:05:05  阅读:182  来源: 互联网

标签:Console C# 扩展 Framework var new public 表达式 Lambda


C# 3.0 版和 Visual Studio 2008 一起发布于 2007 年下半年,但完整的语言功能是在 .NET Framework 3.5
版中发布的。 此版本标示着 C# 发展过程中的重大更改。 C# 成为了真正强大的编程语言。

一、自动实现的属性

当属性访问器中不需要其他逻辑时,自动实现的属性声明更为简洁。

1、自动实现的属性必须同时声明get和set访问器。

public int One{get;set;}

2、使用private set设置只读的自动属性,在定义此属性的类本身中还是可以初始化赋值的。

public string Name{get;private set;}

3、自动实现的属性不允许具有Attribute属性。

二、扩展方法

使您能够向现有类型“添加”方法,而无需创建新的派生类型。

1、最常见的扩展方法是LINQ标准查询运算符。

扩展方法向IEnumerable和IEnumerable类型添加查询功能。

int[] ints={10,45,15,39};
var result=ints.OrderBy(g=>g);//扩展方法是一种特殊的静态方法,但可像扩展类型上的实例方法一样进行调用。
foreach(var i in result)
{
   Console.Write(i);
}

2、对已有的类型进行扩展。

所有的扩展方法写在一个静态类中,相当于存放扩展方法的容器。

所有的扩展方法为静态方法。

扩展方法的第一个参数this后跟着的类表示要扩展的类型。扩展方法第一个参数后才是真正的参数列表。

void Main()
{
    string s = "Hello Extension";
    int i = s.WordCount();
    Console.WriteLine(i.ToString());
}

public static class MyExtensions //所有的扩展方法写在一个静态类中,相当于存放扩展方法的容器。
{
    public static int WordCount(this String str)//this String表示要扩展的类型。扩展方法第一个参数后才是真正的参数列表
    {
        return str.Split(new char[] { ' ', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
    }
}

三、Lambda表示式

(详细见https://www.cnblogs.com/springsnow/p/9441946.html

Lambda表示式是一个匿名函数,它可以包含表达式和语句,可用于创建委托或表达式目录树类型。

从 C# 1.0 - 3.0委托示例

/// 
/// C# 1.0 - 3.0 委托的发展过程
/// 
public class DelegateEvlove
{
    //方法1 定义委托
    public delegate void TestDelegate(string s);

    static void ConsoleStr(string s)
    {
        Console.WriteLine(s);
    }

    public static void Main(string[] args)
    {
        //方法1 实例化委托
        TestDelegate iDelegate = new TestDelegate(ConsoleStr);
        //方法1 调用委托
        iDelegate("1 instance delgate");

        //方法2 匿名委托
        TestDelegate aDelegate = delegate (string s) { Console.WriteLine(s); };
        aDelegate("2 anonymous delegate");

        //方法3 lambda 表达式
        TestDelegate lDelegate = (s) => { Console.WriteLine(s); };
        lDelegate("3 lambda delegate");

    }
}

1、简单应用

将λ表达式分配给委托类型,同delegate(int x){retun x*x}(匿名函数)

delegate int del(int i);
void Main()
{
    del myDel = x => x * x;//或 x=>{return x*x };
    int j = myDel(5);
    Console.Write(j);
}

2、事件处理程序

当λ表达式有一个输入参数时,括号是可选的。使用空括号指定0个输入参数。也可以显示指定参数类型

public static event EventHandler myEvent;
void Main()
{
    myEvent += (s, e) => { Console.Write(s); };
    //即myEvent += delegate(object s,EventArgs e) => { Console.Write(s); };
    myEvent(this, null);
}

3、创建表达式树类型

using  System.Linq.Expressions;
Expression ~~= x=>x*x;~~

四、Linq表达式

1、简单应用:

检索所有Sex为false的人,查询结果放到results变量中,results变量与数组persons类型相同

using System.Linq;

var persons = new[] { new { Name = "var", Sex = false }, 


                      new { Name = "var2", Sex = false } };
var results = from p in persons//              


              where p.Sex == false
              select p;


foreach (var person in results)
{
     Console.Write(person.Name);
 }

2、嵌套成员:

检索所有城市为伦敦,且订单日期为2018年以后的所有记录,查询结果是一个匿名类型的数组。

var customers = new[] { new { Name = "var",City="China" ,Orders  = new []{new{OrderNO=0,OrderDate=new DateTime(2017,1,1)},
                                                                         new{OrderNO=1,OrderDate=new DateTime(2018,1,1)},  }},
                        new { Name = "Vicky",City="London" ,Orders  = new []{new{OrderNO=2,OrderDate=new DateTime(2019,9,1)},
                                                                             new{OrderNO=3,OrderDate=new DateTime(2018,1,1)}, } }
                        };


var someCustomers = from c in customers 
                    where c.City == "London"
                      from o in c.Orders
                      where o.OrderDate.Year > 2018
                    select new { c.Name, o.OrderNO };
                    
foreach (var customer in someCustomers)
{
    Console.Write(customer.Name + customer.OrderNO);
}

五、表达式树

一种有效的数据表达方式,以树的形式显示λ表达式。这些所有数据表达方式可以同时进行编译。

1、如果操作符被声明为可以接受一个方法委托,则编译器将生成IL代码。

public  static IQueryable Where(this IEnumerable source,Func predicate);

2、如果操作符被声明为可以接受一个方法委托“表达式”,则编译器将生成一个表达式树。

public  static IQueryable Where(this IQueryable source,Expression > predicate);

标签:Console,C#,扩展,Framework,var,new,public,表达式,Lambda
来源: https://www.cnblogs.com/springsnow/p/16272216.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有