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);