[C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围(日文翻译)

时间:2022-03-14 20:25:27

C# 3.0 入门

连载原文目录http://www.atmarkit.co.jp/fdotnet/csharp30/index/index.html

 

第一回 Lambda表达式

本节原文http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_01/csharp30_01_01.html

C# 3.0 是什么

C#也顺利的进行了版本升级,变成3.0了。在连载开始之初,就当作是前言吧,简单的介绍一下C# 3.0究竟是什么。

C# 3.0,是运行时绑定的类型安全(似乎我们称之为强类型)的面向对象(日语原文“object指向”)语言。运行时绑定(日语原文是“动的”),指的是程序运行时才能够确定,类型安全,是指所有数据都是有类型的,或编译的时候,或运行的时候,有严格的类型检查。然后,面向对象是指数据与object为基础的语言。

 

但是,这些调整是从C#2.0继承而来的,并不是C# 3.0所特有的。作为C# 3.0所特有的特征是什么呢?

根据笔者个人的印象,对于C# 3.0语言具有的各个机能的技术解说很多,但对于语言本身的说辞却很少。例如,经常会见到“与其他语言相比,Java(或者Ruby)是那么的优美”这样的词句。但是,关于C# 3.0的文章,大多是些个别技术内容及其使用的介绍,与其他语言相比较的文章,对语言优美性大家赞赏的文章却很少遇见。

难道是C# 3.0没人在用吗?肯定不能这么说。用C# 3.0 每天生产大量代码的大有人在。笔者也是其中之一。

那么为什么他们不说呢?恐怕不问当事人就很难知道答案。但是,笔者不说的理由却很简单。技术人员,并不是说客,而是coder,是那种代码写的很爽觉睡得很爽就很满足的人种。同时,用C# 3.0 没压力的(但是,写这样的随笔的理由也很简单。因为有一种人叫撰稿人,是说客。笔者,就是一个撰稿人,脚踏两条船)。

这种情况暗示了一下问题:

世上,存在着不通过解说的强化就体现不出其优秀性的语言,也存在着不经过写代码的检验其优秀性不能被领会的语言。

这也意味着,C# 3.0的特征,不是通过言语的说明,而必须看见实实在在的代码才能理解。而这代码也不是那种寥寥几行的sample code,必须是动真格的那种有一定规模的program(但是遗憾的是,这种篇幅的连载随笔,也写不下这样的code。只能是用那种寥寥几行的sample code来做说明,还望谅解)。

那么,具体的用code来展现的C# 3.0的特征究竟是什么呢?

我认为,那其实就是“排除了一切歧义(暧昧),使用严格的类型,用彻彻底底最少的文字来写code”。

一个典型的例子,就是这次的主题“Lambda表达式”。Lambda表达式的内部机理,与C# 2.0 所具有的匿名方法没什么两样。有两样的地方,主要就是能够以最少的文字数来写代码。

另一个c# 3.0的新机能“隐含类型变量”,同样也是为了减少代码数量。根据初始化值的来确定类型,又以前的代码:

SpecialHighReadabilityTypeName<AnotherHighReadabilityTypeName>

这么一长串变成了var三个字母(这个新机能将在后面的章节介绍)。

但是,代码变短的效果是巨大的。首先,当然是手敲键盘的时间变短了。通过Visual StudioIntelliSense的配合,输入量大大减少(对于精力充沛的年轻人来说这可能不算什么)。实现同样的意图,输入量的减少就意味着产量的增加。

然而更好的一点就是,读代码的时间减少了。一屏显示的文字数量和人眼能够读取的信息量都是有限的,同样的编程意图,用相对少的文字来表现的话,那么能够表示的信息量就多了。由于这一点,读代码时的翻页频度降低了,也排除了没有什么重要意义的关键字,用来分辨有意义代码的的时间也减少了。

问题是,为了没有歧义(暧昧),用更少的文字来表现同样的编程意图,而引入了新的语法,这就必须把这些个语法给记住。同时,虽然代码短了,但因为是不熟悉的语法,阅读源代码并不见得变得简单。

但这也不是什么大问题。为什么呢?C# 3.0 本来就是一个用来埋头写代码的语言(我的理解是“C# 3.0不是仅仅用来读的),C# 3.0的程序员就是大量代码的制造者。在这大量的代码制造过程中,这几个个别的语法问题早就熟悉了。换句话说,C# 3.0就是通过写大量代码为目的而生的。

C# 3.0的适用范围

本文一开始就提到了重要的一点。

C# 3.0以及作为其开发环境的Visual Studio 2008的适用范围有多大呢。就是问,在什么Framework上开发才能用它呢?

经常被误解的,是存在这样的认识,就是这些是.NET Framework 3.5专用的,在使用.NET Framework 2.0开发时仍然必须使用Visual Studio 2005C# 2.0

其实,这个认识是有误解的(笔者最初也误解)。.NET Framework 3.5 其实就是.NET Framework2.0+alpha,如果不使用“+alpha”的部分,Visual Studio 2008C# 3.0开发的程序也能够在.NET Framework 2.0上运行。

光说不练不行。让我们看看怎么做吧。Visual Studio 2008中打开工程的属性,打开应用程序标签页,Framework的版本是有2.03.03.5可选的。

[C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围(日文翻译)

这里,如果选.NET Framework 2.0,那么用VS2008+C# 3.0就能开发.NET Framework 2.0的应用程序。实际上,笔者现在写的程序,确实能够满足这样的条件。

但是,有点要注意。如果这样做,那么有的机能能够使用,有的就不能。Lambda表达式之类的语法上的新机能能够使用,需要类库支持的LINQ这类的新机能就不能用。一句话,就是不能使用所有的C# 3.0的所有机能。但是,仅是能够使用的机能,对我们的帮助就很大。如果没什么大问题,.NET Framework 2.0的项目向VS2008+C# 3.0转移是个不错的选择。

顺便提一句,VS2008VS2005更吃系统资源。如果系统资源紧张,还是别勉强转VS2008了。机器强大的话,转VS2008+C# 3.0价值还是蛮大的。

 

 

原文:

C# 3.0入門

1回 ラムダ式

C# 3.0とは何か?

 C#も順調にバージョンアップを重ね、ついに「3.0」である。連載を開始するに当たり、前置きとしてこの連載で扱うC# 3.0とは何かを簡単に紹介しておこう。

 C# 3.0は、動的かつタイプセーフなオブジェクト指向プログラミング言語である。「動的」とは、実行するまで内容が確定しない要素が多いことを意味し、「タイプセーフ」とは、あらゆるデータに「型」が存在し、コンパイル時、あるいは実行時にそれが厳格にチェックされることを意味する。そして「オブジェクト指向プログラミング言語」とは、データとプログラムの入れ物である「オブジェクト」を前提とした言語であることを示す。

 しかし、これらの特徴はC# 2.0から継承されたものであって、必ずしもC# 3.0固有のものではない。C# 3.0ならではの特徴とは何だろう?

 筆者の個人的な印象だが、C# 3.0は言語が持つ個々の機能について技術解説される機会はあれど、言語そのものについて語られる機会は少ないと感じている。例えば、「ほかの言語と比較してJavaは(あるいはRubyは)これほど素晴らしい」と語る文章をしばしば見掛ける。しかし、C# 3.0に関する文章は、個別技術の内容や使い方を淡々と語るものばかりで、ほかの言語と比較する文章や、素晴らしさをたたえる文章にはあまり遭遇しない感がある。

 では、C# 3.0が使われていないのか……といえばそうではない。明らかにC# 3.0を使って日々大量のコードを生み出している人たちがいる。筆者もその1人である。

 なぜ彼らが語らないのか、正確なところは当人たちに聞かないと分からないだろう。しかし、筆者が語らない理由は簡単に説明できる。技術者とは語る者ではなくコードを書く者であって、満足のいくコードさえ書ければそれだけで満足してぐっすり眠れる人種である。そして、C# 3.0によってストレスを残さず書きたいコードをすべて書き切れているのである(しかし、このような記事を書いて語ってしまっている理由も簡単である。ライターという人種は語る者だからである。筆者はライターでもあり、二足のわらじを履いている)。

 このことは、以下のことを示唆する。

世の中には語りによって補強しなければ優秀さを説得できない言語と、コードを書くことを経由しなければ優秀さを納得できない言語がある

 これは、C# 3.0の特徴を理解するには、言葉による説明ではなくコードを見ていかねばならないことを意味する。それも、短いサンプル・コードではなく、ある程度以上の規模を持った本格的なプログラムでなければならない(しかし残念ながら、このような連載記事で長いコードをお見せすることはできない。短いサンプル・コードで解説することをお許しいただきたい)。

 では具体的にコードから伝わってくるC# 3.0の特徴とは何だろうか?

 それは、あいまいさを一切排除した厳格な型の扱いを維持しつつ、徹底的に少ない文字数でコードを書けるようにしたことではないかと思う。

 典型的な例は、今回の主題でもある「ラムダ式」だろう。ラムダ式が持つ機能性は、C# 2.0が持つ匿名メソッドと何ら変わることはない。変わったのは主に、より少ない文字数で書けるようになったことである。

 また、C# 3.0の新機能である「暗黙的に型指定される変数」も同様に文字数を減らす効能がある。初期化する値によって型が明確であれば、変数宣言に、

SpecialHighReadabilityTypeName<AnotherHighReadabilityTypeName>

のような長い型の名前を書かずに、

var

3文字書くだけで済ませられる(この新機能については次回以降で解説予定)。

 しかし、コードが短くなることの効果は絶大である。まず当然のことながら、書くための手間が減る。Visual StudioIntelliSense(インテリセンス)を併用しても、明らかにタイピング量が減る。(体力で押し切れる若いころはピンとこないかもしれないが)完全に同じ意図を記述するものであれば、タイピング量の差は生産量の差として明確な差が生じ得るものである。

 そしてもっと素晴らしいのは、読むための手間が減ることである。1画面に表示できる文字数、目が受け取ることができる情報量に限りがある以上、同じ意図をより少ない文字で表現する方が、より多くの情報を受け取ることができる。それにより、コードを読むためにスクロールさせる頻度も減るし、コードを読むときに特に意味を持たない形式的なキーワードを排除して、意味のある部分を切り分ける手間も減る。

 問題は、あいまいさがなく、より短い文字数で同じ意図を記述するために、まったく新しい構文が導入され、それを覚えねばならないことである。また、慣れない構文でいくら短く書けても、それでソース・コードが読みやすくなるわけではない。

 しかし、そのことは大した問題とはならない。なぜなら、C# 3.0とはひたすらコードを書くことに奉仕する言語であり、C# 3.0プログラマーになるということは、大量のコードを無理なく生産する立場に立つことを意味するからだ。少数の目新しい構文など、大量のコードを書いているうちにすぐ慣れてしまうだろう。逆にいえば、コードを書き続けることによって、何かを成し遂げようとする者のための言語がC# 3.0であるともいえる。

C# 3.0の適用範囲

 本論に入る前に重要な話を書いておく。

 C# 3.0あるいは開発環境であるVisual Studio 2008の適用範囲はどこまでか、である。つまり、何を対象に開発するときに、それらを使用できるのかである。

 割とよくある誤解として、これらは.NET Framework 3.5専用であり、.NET Framework 2.0を対象に開発するときには依然としてVisual Studio 2005C# 2.0が必要だという認識が見られる。

 しかし、この認識は間違っている(最初、筆者も誤解していた)。.NET Framework 3.5とは.NET Framework 2.0+アルファであり、「+アルファ」の部分を使用しない限り、Visual Studio 2008C# 3.0で開発されたプログラムは.NET Framework 2.0上で実行できる。

 しかも、これは簡単に実践できる。Visual Studio 2008でプロジェクトのプロパティを開き、[アプリケーション]タブを開くと、フレームワークのバージョンとして2.03.03.5を選ぶことができる。

[C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围(日文翻译)

 ここで.NET Framework 2.0を選べば、Visual Studio 2008C# 3.0.NET Framework 2.0用のプログラムを開発できるのである。実際、筆者がいま書いているプログラムは、まさにこのような条件を満たすものである。

 ただしここで注意が必要である。このようなやり方によって使用できる機能と使用できない機能が存在する点である。ラムダ式のような構文上の新機能は使用できるが、クラス・ライブラリ側の支援が必要となる「LINQ」のような新機能は使用できない。つまり、C# 3.0の全機能を使用できるわけではない。しかし、使用できる機能だけでもかなり有益であり、特に問題がなければ、.NET Framework 2.0向けの開発案件であってもVisual Studio 2008C# 3.0に移行するのは良い選択だと思う。

 ちなみに、Visual Studio 2008の方が2005よりもメモリやCPUパワーなどの要求リソースが多いようである。リソースに余裕がないケースでは無理に移行しない方がよいかもしれないが、マシンにパワーがあればVisual Studio 2008C# 3.0に移行する価値は大きいと思う。