注意.NET中容易混淆的几组重要概念(3)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:如何在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段。以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密。因此需要解密数据的场合,这两种方法就不太适合了。当然你也可以自己编写

Lambda Expression / Expression Tree / 匿名方法

Lambda Expression从定义上讲是指带有“=>”符号的表达式,例如:

以下为引用的内容:
◆x => x 1
◆(x, y) => x > y
◆() => 5
◆(x, y) => { return x > y; }

Lambda Expreesion本身并不会在概念上引起混淆,不过由于在C# 3.0中Lambda Expression有两种截然不同的使用方式,有些朋友就会产生疑问,究竟Lambda Expression是做什么用的?

Lambda Expression的一个重要作用就是提供一种使用匿名方法的新语法,在《您善于使用匿名函数吗?》一文中您可以看到这种使用方式。利用Lambda Expression表示匿名函数的一个重要的缺点就是无法使用带out或ref关键字的参数,不过它比使用delegate关键字的表示法略为简单一点,因为无需提供参数类型,例如:

以下为引用的内容:
public static bool CallMethod(Func method)
{
return method(0);
}

static void Main(string[] args)
{
CallMethod(delegate(int a) { return false; });
CallMethod(a => { return false; });
}

可见,使用Lambda Expression表示的匿名方法无需指定参数类型,因为这一切都已经交给编译器来判断了。这一点在参数类型长而复杂的情况下(例如并行库中的方法)非常重要。因此现在要不是会涉及到out/ref参数,我都会使用Lambda Expression来表示匿名方法。

Lambda Expression的另一个作用自然就是构造一个LambdaExpression对象。任意一个Expression对象都表示了一个Expression Tree的根节点,而开发人员可以通过解析这个Expression Tree来实现特定的功能。我们编写的方法可以接受一个Lambda Expression作为参数,但是我们还必须对这个参数的形式进行限制,这个参数才能有意义。这时候我们就会使用Expression类型作为方法的参数类型,这样在使用这个方法时就必须使用满足TDelegate的签名及返回值的Lambda Expression才能编译通过。例如:

以下为引用的内容:
public static void CallMethod(Expression> prediect) { ... }

static void Main(string[] args)
{
CallMethod(a => a > 0);
}

解析一个Expression Tree并不是一件简单的事情,一定程度上这相当于在进行编译工作,只是最终生成的结果不是机器码或IL,而是一个执行结果,并且语法解析的过程已经由C#编译器帮我们完成了。我在《扩展LINQ to SQL:使用Lambda Expression批量删除数据》一文中曾经提到过这一点,并且给出了一个实例,感兴趣的朋友们可以参考一下。

需要注意的是,如果在构造一个Expression对象时,Lambda Expression的Body部分不能是Statement;而在表示一个匿名对象时Lambda Expression的Body既可以是Expression也可以是Statement。无论是使用Expression还是Statement作为Body,只要表示的含义相同,编译器都会生成一样的匿名函数。例如以下两种写法其实是等价的:

以下为引用的内容:
◆(x, y) => x > y
◆(x, y) => { return (x > y); }

最后,我留给大家一个问题:以下两个做法的结果是相同的,而代码也非常接近。不过它们其实有着非常大的区别,您能指出吗?

以下为引用的内容:
var intList = new List() { 1, 2, 3, 4, 5 };
foreach (int i in intList.Where(i => i % 2 == 1))
{
Console.WriteLine(i);
}

var intList = new List() { 1, 2, 3, 4, 5 }.AsQueryable();
foreach (int i in intList.Where(i => i % 2 == 1))
{
Console.WriteLine(i);
}

分享:怎样使ASP.NET实现页面传值
第一种方法 通过URL链接地址传递 以下为引用的内容: send.aspx: protected void Button1_Click(object sender, EventArgs e) { Request.Redirect(Default2.aspx?username=honge); } receive.aspx: string username = Request.QueryString[username];这样可

共3页上一页123下一页
来源:模板无忧//所属分类:.Net教程/更新时间:2009-06-27
相关.Net教程