C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第三部分
源贴地址:
C#: Yesterday, today, and tomorrow
作者:John Osborn
<chsdate year="2005" month="10" day="17" islunardate="False" isrocdate="False" w:st="on"></chsdate>10/17/2005
翻译:我要去桂林
Osborn:关于增加的匿名方法有什么特点吗?我记得当匿名方法刚被人介绍出来的时候,我和其作者聊过,他说你不得不在语言中支持这样的功能,但是为什么要这么做,却说不出个所以然来。我肯定匿名方法有他的实际用处,看我们这篇报道的人也有同样的问题吧。尽管如此,在C# 3.0中支持匿名方法的特色,和泛型一样,还是很吸引人的。
Hejlsberg:那绝对是。老实说,首先,你知道我们应该把荣誉放到他应该放的地方。我并没有在这里创造什么新的东西出来。这一切都是基于 lambda 表达式或者 lambda 微积分 的,他们已经在基于函数的编程方法里存在几十年了。然而,在主流的编程语言中确看不到他们的身影。
C# 语言有幸成为第一个实现这个特色的语言。我们是怀着严肃的态度来改进它的,这一点你将在C# 3.0中看到他们的身影。我们在匿名方法的基础上做了进一步的改进,我们成为 lambda 表达式,并给了它丰富的接口支持。
Hejlsberg:为了表明这一点是如此的重要,我们来举例说明吧。在 C# 3.0 中我们引入了和语言集成的查询符号:LINQ。我们做的事情是:把查询的语言做成API的方式变成了可能。上面我说过,这些方法就是:Where,Select,OrderBy 和 GroupBy 等等。我们可以用一系列的Where ,Select ,OrderBy 和 GroupBy 方法组合起来,形成一个完整的查询。
如果你想在一种不支持匿名方法或者 lambda 表达式的语言中实现一个Where方法,这是不太可能的。一个 测试应用到每个元素上, 你知道我说的意思吗?我想说 list.Where(blah) , blah 是我希望在测试中输入的一个参数。
但这并不是一个普通意义上的参数,因为我并没有把它作为一个 布尔 值参数,很显然这个参数首先被计算,然后在传递进去。我并不想看到 真 或者 假,我只是想传递 测试 本身。你知道我刚才讲的意思吗?
Osborn:是的,你想传递一个过程,然后执行这个过程。
Hejlsberg:没错。实际上,我希望的是我引用一些代码,并且我可以执行这些代码,对不对?我希望一个方法的引用或者一个函数的引用,然后把他们传递到 Where 表达式,然后Where表达式可以为每个数据项运行这些代码,这就是测试,然后最终的结果是返回所有执行结果为真的数据项。同样的道理,如果你看看 Select 操作符是如何执行的,他和上面的道理是一样的。这就是:提供一个元素,提供一个函数他就能把元素转换成另一个元素。这就是组合的威力。
OrderBy 和这是同样的道理,提供一些元素,然后对他们进行比较。重申一遍,这些都是通过写代码实现的。在这里,最让人印象深刻的是编程语言丢失了把代码作为参数传递的能力。
Osborn:这是非常重要的功能。
Hejlsberg:这只是 lambda 表达式和匿名方法能让我们实现的一点事情。另外要补充说明的是: lambda 表达式 和匿名方法其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。这就是:内联方法。
Osborn:除了 泛型 和 匿名方法外 人们还应该注意 C# 2.0 的其他方面呢?
Hejlsberg:Nullable 类型,一个非常重要的进步。因为这是在数据库世界和通用编程世界的变得平等的第一步。你知道,在数据库中基于 Nullable 类型 而程序编程中确不是,因此这两者之间的映射很难说明明白有什么意义。
Hejlsberg:当然,你可以跳过这些…
Osborn:你现在要做的事情是?
Hejlsberg:在编程过程中人们经常用装箱操作。比如:为对象分配空间,然后保存数据,如果不再使用了就设置为:null。在java中做这个是非常有效率的。但是这种方法使用起来却是非常耗费效率的。因为,为了表示一个可能值为null的整数值,在java中使用Integer封装类,为每个 int 值分配空间,然后当他们是null的时候你设置值null来实现。
Hejlsberg:这不是直接发生的,你让每个int值耗费了4陪的内存空间。又很多耗费和这点相关。在 C# 使用 nullable 类型,我们可以非常高效的让你可以把对象值设置为null,可是并不给他分配内存空间。我们通过一个泛型类型:T 和 bool 来实现这个特性。这就是: Nullable<T> ,他的内部有2个字段: T 和 bool。
但是 Nullable<T> 本身也是一个值类型。这个类型实际上用了 栈分配 或者 内联分配,从内存的角度来看这是非常高效的。总之 , 我们使用语言语法来支持: nullable 。我们使用问号作为修饰语。
因此: int 是一个整形数据, int? 是一个 nullable的整形数据。可以把 int 隐式的转换成 nullable int ,其他方式的显式转换可以抛出 null 异常。这就是说:把人们常用的这种情况作为一等公民来对待。
对于我,一个语言的设计者,这个问题就是:人们在这里会做什么呢?在编程中什么是应该作为一等公民来对待的。
Osborn:这么说 C# 一种语言将会统治所有其他语言?
Hejlsberg:^_^,绝对不是啦,我真的不是这么想的。世界上还有很多其他的场合更适用于其他的语言。在 C# 的本质来说, 他是一种强类型的语言。你知道,对于很多事情来说,动态语言更适合,如果你只是准备写几行代码,并且不愿意在还没有写代码之前就要写一大堆声明。你只是想试试而已。
在语言的世界里,我希望我能够尽我所能超前发展。
Osborn:对于 2.0 来说,我们看到微软是不是也是按照标准实现的?
Hejlsberg: 2.0 吗?
Osborn:对 2.0 。
Hejlsberg:没错。从标准上说,叫:第三版,但实际上我们叫他 2.0 。
Osborn:因此这里面微软没有做什么改变吧?
Hejlsberg:没有,每个语言特色我们都提交到了 ECMA ,并且这是一个标准的过程。我们希望公平简短的社区投票,在这一点上,这的确是个问题。这些事情都已经发生了,我们已经这么干了。参考:C# 和 CLI 变得更加强大。
Osborn:是不是大概就在今年年底?
Hejlsberg:没错。
这是座谈会的第一部分。
John Osborn 是 O’Reilly Media 公司的执行编辑。
C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分: 关于 泛型