您的位置:首页 > 编程语言 > C#

c#3.0增加的功能

2012-01-17 15:22 113 查看

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


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息