c#3.0增加的功能:
- 隐含类型局部变量(var):用于解决变量声明需要重复写两次类型的麻烦
var不是一个Object类型,可以理解为一个占位符,在编译完成以后会被替代为强类型,而不是弱类型Object;(var x = 5; //推断为int类型)
var在赋值的时候是表达式,可以供编译器理解解析,且赋值的表达式不能为null(编译器不能对null推断类型)
应用场景:
var仅限于局部变量,不能用于参数、字段(可以避免var的乱用而引起的代码不易阅读的问题)
var可以用于foreach()语句中,提高复用度
问题:
不能到处乱用,导致代码不易阅读理解
例子:
var x = new []{ "gfjiang", "rshiping", "houkun", "xiaoxuan" }; //根据编译器推断为string[]
- 扩展方法:用于解决不能访问源码的类进行方法的扩展(在不修改源代码的情况下)
例子:
public static class Extensions{ public static void Foo(this String s){ .... } } string s = "hello world"; s.Foo();
由编译技术把实例方法的调用转化成静态类的静态方法调用:s.Foo() 转换成 Extensions.Foo(s); [ 即使不是扩展方法,针对编译器,方法都是全局函数,通过传递实例完成调用,类似于实例方法调用的时候,编译也会进行转换(String s = “helow world", s.length(); 编译成:length(s))]
应用场景:
能够针对需要实例化后进行的方法调用的扩展(语法糖的效果,编译时技术,效果不错),其他扩展方式可以采用:组合方式、继承方式(多态)、反射(运行时的方式添加方法,运行时技术)
继承:可以更改基类方法,扩展方法不能(如果遇到相同签名的话,则扩展方法失效,优先级为实例方法,其次为namespace最近的静态方法,然后为较远的namespace的静态方法)
问题:
容易乱用影响程序设计,容易引起问题,设计上不能依赖扩展,只能用于弥补的方式(类似于Adapter模式,是在原有代码不适用的情况下才采用的模式,如果可以修改源代码,就不用采用该模式)
- 对象与集合初始化器
例子:
public class Program { private class Point { public int X { get; set; } public int Y { get; set; } } public static void Main(string[] args) { var x = new Point { X = 3, Y = 4 }; Console.WriteLine(x); } }
相当于编译器转换为new Point(); x.X = 3; x.Y = 4;
- 匿名类型:不断的节省无用东西的写
new p1 = new{Name = "gfjiang", price=450.00}
new p2 = new{Name = "rshiping", price=470.00}
也是由编译器推断,直接继承于System.Object; 当该类的跨度不大的时候,就没有必要新建一个类型,由编译器临时新建一个类型即可。
编译器推断p1和p2属于同一个类型,如果p2里面的字段顺序改变,则编译器推断为不同类型
- Lambda表达式
var list = new List<string> { "abcd", "abce", "ab", "xyz", "abcdefg" }; //c#2.0 提供的匿名委托方法 var select = list.FindAll(delegate(string s){return s.StartsWith("abc");}); foreach (var term in select) Console.WriteLine(term); //c#3.0 提供的Labmda表达式,代替匿名委托方法 //提供更自然的方式,更接近人的思维,更高级 var select1 = list.FindAll(s=>s.StartsWith("abcd")); foreach (var term in select1) Console.WriteLine(term);
Lambda格式:(参数列表a,b,c...)=> 表达式或者语句块(可以有多个参数,一个参数,或者无参数,参数类型可以隐式或显示,无参数的时候直接()=> ...)
- LINQ
IEnumerable<string> list = from str in names
where str.Length > 3 && str.StartsWith("gf")
orderby str
select str.ToUpper();
foreach(var str in list)
Console.WriteLine(str);
IEnumerable<string> list2 = names
.Where(str => str.Length > 3 && str.StartsWith("gf"))
.OrderBy(str => str)
.Select(str => str.ToUpper());
foreach (var str in list2)
Console.WriteLine(str);