.net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

1.自动属性 Auto-Implemented Properties

2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型

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

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

Person p = new Person(){ Name="aa",Age=18};//属性初始化器

List<Person> list = new List<Person>(){new Person(){ Name="aa",Age=18},new Person(){ Name="bb",Age=18}};//集合初始化器

5.匿名类 & 匿名方法

匿名类:

var cla = new {Name="aa",Age=18};

//匿名类编译后会生成一个泛型类,包含两个只读的变量和只读的属性,并重写了Object里的所有的方法

//如果另一个匿名对象的属性的(类型和位置)一样,那么会共用同一个匿名类,var cla1 = new {Name="aa",Age=18};

//如果另一个匿名对象的属性的类型一样,但是顺序不一样,那么会在编译后新增一个泛型类var cla2 = new {Age=18,Name="aa"};

//如果另一个匿名类对象的属性名称和顺序一样,但类型不一样,那么还是会使用相同的匿名类,不过,泛型参数改变而已,不会新增加一个泛型类 var cla3 = new{Name=2323,Age=“18”};

匿名方法:

匿名方法就是为委托准备的,匿名方法的本质就是委托

 public delegate void DGTest(string str);        

static void Main(string[] args) {            

DGTest dg = new DGTest(delegate(string str)   

{ Console.WriteLine(str+"  "+"哈哈哈哈");                

Console.ReadKey();                

});            

dg("我是传过来的参数");     

}

委托中的delegate(string str)                

{ Console.WriteLine(str+"  "+"哈哈哈哈");                

Console.ReadKey();                

});就是匿名方法

//使用委托语法糖直接将匿名方法“赋值”给委托对象

DGTest dg = delegate(string str)                

{                    

Console.WriteLine(str + "  " + "哈哈哈哈");                    

Console.ReadKey();                

};

//匿名方法编译后会生成一个编译器取名的私有的静态的方法和一个静态的委托对象

6.扩展方法 静态类,静态方法,this关键字

Dog g = new Dog(){Name="aa",Age=2};

//d.Pee(DateTime.Now);

//编译后就是直接调用这个静态方法 DogExtension.Pee(d,DateTime.Now)

7.系统内置委托 Func / Action

Action是系统委托,是无返回值的泛型委托  

List<Dog> dogs = new List<Dog>();            

dogs.Add(new Dog() {  Name="小花狗", Age=18});            

dogs.Add(new Dog() { Name = "小花狗1", Age = 18 });            

dogs.Add(new Dog() { Name = "小花狗2", Age = 18 });            

dogs.Add(new Dog() { Name = "小花狗3", Age = 18 });            

dogs.Add(new Dog() { Name = "小花狗4", Age = 18 });            

dogs.ForEach(new Action<Dog>(delegate(Dog d)            

{                

Console.WriteLine(d.Age + "  " + d.Name);                            

}            

));

new Action<Dog>可以省略不写

dogs.ForEach(delegate(Dog d)            

{                

Console.WriteLine(d.Age + "  " + d.Name);                            

}            

);

Predicate是系统委托,是有返回值的且返回bool类型的泛型委托    

dogs = dogs.FindAll(new Predicate<Dog>(delegate(Dog d) { return d.Name.Equals("小花狗"); }));           

dogs =  dogs.FindAll(delegate(Dog d) { return d.Name.Equals("小花狗"); });

Comparison是系统委托,是有返回值且返回int类型的泛型委托  

dogs.Sort(new Comparison<Dog>(delegate(Dog d1, Dog d2) { return d1.Age - d2.Age; }));            

dogs.Sort(delegate(Dog d1, Dog d2) { return d1.Age - d2.Age; });

Func是系统委托,返回类型自定义  dogs.Select(new Func<Dog, Dog1>(delegate(Dog d) { return new Dog1(){ Age=d.Age;} }));            

dogs.Select(delegate(Dog d) { return new Dog1(){ Age=d.Age;} });

Func返回匿名类型            

dogs.Select(delegate(Dog d) { return new { age=d.Age }; });

 

8.Lambda表达式

Lambda表达式本质就是匿名方法,是一种特殊的语法糖  

dogs.Sort((d1, d2) => d1.Age - d2.Age);            

dogs.Select(d => d.Age > 1);            

dogs.Select(d => { if (d.Age < 0) { return false; } else { return true; } });

标准查询运算符 Standard query operator

Join方法的使用:

//内连接 inner join  var list = students.Join(classes, s => s.ClassID, c => c.ID, (s, c) => new { StudentName=s.Name,ClassName=c.Name }).ToList();             list.ForEach(x=>Console.WriteLine(x.StudentName+"  "+x.ClassName));

9.LINQ查询表达式

posted @ 2013-10-13 09:27  学亮  阅读(578)  评论(0编辑  收藏  举报