首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第三部分

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第三部分

作者头像
田春峰-JCJC错别字检测
发布2019-02-14 10:11:32
9160
发布2019-02-14 10:11:32
举报

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第三部分

C#: Yesterday, today, and tomorrow

作者:John Osborn 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 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。这就是:内联方法

C# 2.0 的其他方面的亮点

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 座谈,第一部分

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分: 关于 泛型

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2005年11月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C# 2.0 的其他方面的亮点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档