【ハウツー】
最後に、.NET Frameworkのクラスライブラリを使用する方法を見ておこう。たとえば、System.Net.WebClientクラスを使用して、インターネットからHTMLのソースコードをダウンロードする処理であれば、次のような記述で済んでしまう。
open System.Net;;
let wc = new WebClient();;
let html = wc.DownloadString "http://www.google.co.jp/";;
printfn "%A" html;;
openというキーワードは、C#でいうimportと同じようなものだ。あとは、WebClientクラスのインスタンスを生成し、DownloadStringメソッドを呼び出しているだけだ。この例を見れば、F#も立派な.NET Frameworkの一員であることがお分かりいただけると思う。
プログラミング言語を使用するときには、言語そのものの仕様だけでなく、どれだけ豊富なクラスライブラリを使用できるかどうかも重要な要素になる。その意味では、.NET Frameworkのクラスライブラリをそのまま使えるため、F#はまったく問題ないと言ってよい。
豊富なクラスライブラリを持つ.NET Frameworkと、関数型言語の強力な機能が両方利用できるF#は、とてつもなく大きな可能性を秘めたプログラミング言語であると言えるのではないだろうか。
F#の型推論を見てもらったところで、それと関連してC#における動的型付け機能についても見ておこう。
これまで、C#は一貫して強い型付けにこだわってきた。そして、この強い型付けによって、Visual Studioのインテリセンスなどのサポートによる開発生産性の向上が実現されていた。しかし、Iron PythonやIron Rubyとの連携や、WordやExcelのPIA利用時の煩雑さを軽減させるために、ついに動的型付けがサポートされたのである。
使い方は非常に簡単で、dynamicというキーワードを使用するだけだ。たとえば次のEcho関数は、Nameというプロパティを持っているオブジェクトであれば、どんな変数を渡しても動作する。コンパイル段階では、どんな変数を渡してもエラーにはならない。
void Echo(dynamic person)
{
Console.WriteLine(person.Name);
}
このEchoメソッドを呼び出す場合は、たとえば次のようなコードでもよいわけである。匿名型であろうとなんであろうと、Nameプロパティさえ持っていれば問題ないからだ。
Echo(new { Name = "鈴木" }); //動作
もし、Nameプロパティを持たないオブジェクトが渡された場合は、実行時に「RuntimeBinderException」が発生する。たとえば次のようなコードだ。
Echo(new { Phone = "03-xxxx" });//RuntimeBinderException
dynamicキーワードのおかげで、スクリプト言語との連携や、OfficeのPIA呼び出しがぐっとシンプルに記述出来るようになるというわけだ。
C#において動的型付けがサポートされたが、それは基本的にIronRubyやIronPythonとの連携や、WordやExcelのPIA呼び出しに使用されることを想定している。必要がない限り、強く型付けされたコード上で、Visual Studioのインテリセンスなどの恩恵を受けながらプログラミングをしていった方がよい。その意味で、.NET Framework 4.0から導入されたTuple(タプル)クラスは、従来のC#における改良が目指してきたような、強い型付けと柔軟なコード記述を行うために役立つだろう。
タプルというのは、要するにいくつかの要素の「組」のことである。いくつかの変数をグループ化するという意味では、クラスや構造体と同じ用途で使用されるものだと考えてよい。
クラスベースのオブジェクト指向では、「名前と電話番号と年齢」というような、ちょっとした変数をグループ化しようと思っても、わざわざクラスを定義しなくてはならない、という煩雑さがある。これは非常に面倒である。
もちろん、「object型の要素を扱うList」などを使うことも可能なのだが、そうすると今度は型チェックが利用できなくなってしまう。ということは「intとstringのペア」を期待しているところに「stringとstringのペア」を渡すようなコードを書いても、コンパイル時にエラーを検出することはできなくなってしまうのだ。
そういった煩雑さを解決するために、C# 3.0で匿名型という仕組みが導入された。これはクラスを定義することなく、小さなスコープでのみ有効な一時的なクラスを作成するための機能だ。
たとえば、「名前と電話番号と年齢」とデータの固まりを一時的に使いたいと思った場合は、次のようなコードを記述することができる。
var person = new { Name = "田中", Phone = "03-xxx", Age = 30 };
Console.WriteLine(person.Name);
しかし、匿名型は利用できる場面が限られていて、たとえば直接匿名型を戻り値や引数に直接指定することはできない。先ほど説明したdynamicであれば引数や戻り値にも使うことは可能だが、その場合もやはり型チェックが無効になってしまう。
そこでTupleクラスを使えば、クラスをわざわざ定義することなく戻り値や引数で使う変数をグループ化することができる上に、型チェックの恩恵にも預かれるようになる。
たとえば、「名前と電話番号と年齢」というような「string、string、int」の組み合わせを引数として渡して欲しい場合は、次のような関数を定義すればよいのだ。
void Show(Tuple<string, string, int> person)
{
Console.WriteLine(person.Item1);
}
このShow関数を呼び出す場合は、次のようなコードを記述しなくてはならない。
Show(new Tuple<string, string, int>("田中", "03-xxxx", 30));
もし、「Show(new Tuple
| Beta版で試す! VS 2010と.NET 4.0の新機能(1) - ASP.NET Ajaxにおけるクライアントサイドレンダリング [2009/9/9] |
| .NET Framework 4+Visual Studio 2010で、開発者のスキル発揮をサポート [2009/9/1] |
| Microsoft、「Visual Studio 2010」の製品計画を明らかに [2008/9/30] |
| 最初にマスターしたいVisual Studioのデバッグ機能 - 応用編 [2008/8/19] |
| 米MS、Visual Studio 2008/ .NET Framework 3.5のSP1提供開始 [2008/8/12] |
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
【連載】読む鉄道、観る鉄道 第9回 『サブウェイ・パニック』 - 1970年代のニューヨークと地下鉄の情景を描く [08:00 5/27] ライフ |
|
【連載】発音も聞けちゃう、知って得するidiom情報 第14回 call it a day [08:00 5/27] ライフ |
|
MINI、ロールスロイスにインスパイアされた最高級品質の特別仕様車を発売 [07:30 5/27] ライフ |
|
【連載】Japanglish、正しく言うならこうでしょう 第57回 gasoline stand(ガソリンスタンド) [07:00 5/27] キャリア |
|
【連載】これだけは要チェック! TOEIC(R)単語帳 第105回 今回のお題は…「regard A as B」 [07:00 5/27] キャリア |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。