专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » linqtosql体验:LINQ体验(3)——C# 3.0新语言特性和改进(下篇) »正文

linqtosql体验:LINQ体验(3)——C# 3.0新语言特性和改进(下篇)

来源: 发布时间:星期五, 2009年1月9日 浏览:23次 评论:0
  上篇我们介绍了C# 3.0新语言特性和改进上部分这篇我们继续介绍剩下部分

  C# 3.0新语言特性和改进包括:

  自动属性(Auto-Implemented Properties)

  隐含类型局部变量(Local Variable Type Inference)

  匿名类型(Anonymous Types)

  对象和集合化器(Object and Collection Initializers)

  扩展思路方法(Extension Methods)

  Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

  扩展思路方法(Extension Methods)  往往我们需要对CLR类型进行些操作但苦于无法扩展CLR类型思路方法只能创建些helper思路方法或者继承类我们来修改上面User类:

public User
{
  public Id { get; ; }
  public Name { get; ; }
  public Age { get; ; }
  public Read
  {
     "Id:" + Id + "姓名:" + Name + "年龄:" + Age;
  }
}
  然后

var user = { Id = 1, Name = "YJingLee", Age = 22 };
var str = user.Read;
  现在有了扩展思路方法就方便多了

  扩展思路方法允许开发人员往个现有CLR类型公开契约(contract)中添加新思路方法而不用生成子类或者重新编译原来类型扩展思路方法有助于把今天动态语言中流行对duck typing支持的灵活性和强类型语言的性能和编译时验证融合起来——引用Scott博文

  扩展思路方法是可以通过使用例子思路方法语法静态思路方法效果上使得附加思路方法扩展已存在类型和构造类型成为可能他可以对现有类功能进行扩充从而使该类型例子具有更多思路方法(功能)

  扩展思路方法允许我们在不改变源代码情况下扩展(即添加不能修改)现有类型中例子思路方法

  扩展思路方法给我们个怎样思路呢?我们步做下!

  首先声明扩展思路方法:通过指定关键字this修饰思路方法个参数注意扩展思路方法仅可声明在静态类中扩展思路方法具备所有常规静态思路方法所有能力可以使用例子思路方法语法来接着就可以扩展思路方法了下面通过个具体例子分析下:

  例如我们要检查串变量是否是合法电子邮件地址?在.Net2.0框架下像这样:

var email = "[email protected]";
(EmailValidator.IsValid(email))
{
  Response.Write("YJingLee提示:这是个正确邮件地址");
}
  而使用扩展思路方法我可以添加“IsValidEmailAddress”思路方法到类本身中去该思路方法返回当前串例子是否是个合法

(email.IsValidEmailAddress)
{
  Response.Write("YJingLee提示:这是个正确邮件地址");
}
  我们是如何把这个IsValidEmailAddress思路方法添加到现有类里去呢?先定义个静态类再定义“IsValidEmailAddress”这个静态法来实现

public Extensions//静态类
{
  public bool IsValidEmailAddress(this s)
  //静态思路方法和this
  {
    Regex regex = Regex(@"^[w-.]+@([w-]+.)+[w-]{2,4}$");
     regex.IsMatch(s);
  }
}
  注意上面静态思路方法在第个类型是参数变量前有个“this”关键词这告诉编译器这个特定扩展思路方法应该添加到类型为“对象中去然后在IsValidEmailAddress思路方法实现里我可以访问该思路方法实际例子所有公开属性/思路方法/事件取决于它是否是合法电子邮件地址来返回true/false

  扩展思路方法不仅能够应用到个别类型上也能应用到.NET框架中任何基类或接口上即可用于整个.NET框架丰富可组合框架层扩展

  扩展思路方法要点  扩展思路方法本质为将例子思路方法在编译期改变为静态类中静态思路方法事实上它确实拥有静态思路方法所具有所有功能

  扩展思路方法作用域是整个可见并且可以通过using 来导入其它命名空间中扩展思路方法

  扩展思路方法优先级:现有例子思路方法优先级最高其次为最近静态类静态思路方法最后为较远静态类静态思路方法

  扩展思路方法是种编译时技术注意和反射等运行时技术进行区别并慎重使用

  Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)Lambda表达式  我们从“所有串查找包含YJingLee子串”说起在C# 2.0中匿名思路方法允许我们以内联方式来实现委托例子它提供强大式编程语言但是标记显得相当冗长和带有强制性我们使用C# 2.0 中匿名思路方法查找代码如下:

var inString = list.FindAll(delegate( s)
{ s.Indexof("YJingLee") >= 0; });
  现在可以使用C# 3.0带来Lambda表达式允许我们使用种更接近人思维、更自然方式来实现类似于匿名思路方法同样效果看下面代码多么简洁:

var inString = list.FindAll(s => s.Indexof("YJingLee") >= 0);  Lambda表达式格式:(参数列表)=>表达式或语句块

  具体意义:定义Lambda接受参数列表运行表达式或语句块返回表达式或语句块值传给这个参数列表

  Lambda表达式参数类型可以是隐式类型或显式类型在显式列表中每个参数类型是显式指定在隐式列表中参数类型由Lambda表达式出现语境自动推断类型

  Lambda表达式参数列表可以有个或多个参数或者无参数在有单隐型参数lambda表达式中圆括号可以从参数列表中省略

  例如:

(x, y) => x * y;//多参数隐式类型=>表达式
x => x * 10;//单参数隐式类型=>表达式
x => { x * 10; }; //单参数隐式类型=>语句块
( x) => x * 10;//单参数显式类型=>表达式
( x) => { x * 10; };//单参数显式类型=>语句块
=> Console.WriteLine; //无参数
  下面看这个例子:

  在前面帖子中我们写了个User类及增加了2个人接下来我们使用由LINQ提供Where和Average思路方法来返回集合中个子集以及计算这个集合中平均年龄:

List<User> user = List<User>{
   User{Id=1,Name="YJingLee",Age=22},
   User{Id=2,Name="XieQing",Age=25},
};
//获取特定人时所用过滤条件p参数属于User类型
var results = user.Where(p => p.Name "YJingLee").ToList;
//用User对象Age值计算平均年龄
var average = user.Average(p => p.Age);
  效果图如下:





  Lambda表达式和Lambda表达式树要点  Lambda表达式参数类型可以忽略可以根据使用上下文进行推断

  Lambda表达式主体(body)可以是表达式也可以是语句块

  Lambda表达式传入实参将参和类型推断以及思路方法重载辨析

  Lambda表达式和表达式体可以被转换为表达式树

  表达式树允许lambda表达式能够代表数据结构替代表示为执行代码

  好了我在这里简单把C# 3.0新语言特性和改进说了接下来正式进入这个系列主题部分——LINQ为 了让大家了解我换种手法来写条LINQ to SQL语句分析来贯穿LINQ知识点起体验LINQ带给我们乐趣



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: