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);
相关文章推荐
- C#3.0-新增加功能浅析(1)
- 为dedecms增加栏目文章统计功能代码
- 为Winform程序中DataGridView控件增加自动显示行号功能
- AngularJS实现数据列表的增加、删除和上移下移等功能实例
- 增加定时检测linux占用内存,及时清理功能
- .NET下为百度文本编辑器UEditor增加图片删除功能
- 为CKEditor增加上传图片的功能(转载)
- 如何增加Referer功能--反向链接插件
- 给CuteEditor5增加了高亮代码显示功能(C#版)
- 在 Web 应用中增加用户跟踪功能
- 蚂蚁分类信息系统 手机端增加会员自主升级功能
- CKEditor二次开发-替CKEditor增加添加水印的功能
- 十一.增加数据修改功能
- [RK3288][Android6.0] AT24C02驱动分析及功能增加小结
- 下一步CSDN Blog要增加和完善的功能
- 十五.增加一个项目协作留言板功能(一)----- 建立留言板的model
- 增加电量百分比功能
- 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!
- 解决了日志摘要的一个小bug,并增加了新功能
- 如何在Oracle 中实现类似自动增加 ID 的功能?