2008年5月26日 (月)

LINQ独自拡張時の遅延実行

C#のyield returnに相当するキーワードがVBにないという話ですが、前回も書いたように私はこのことはそれほど気にならないのです。
確かにyield returnは便利な機能ですが、これがないとできないという要件レベルの機能は多分ないと思うからです。とは言え、VBに導入されれば喜んで使うつもりです。

でもLINQのことを考えるとなんだか煮え切らない気持ちになります。

というのもLINQのいろいろな機能はC#のyield returnで実装されているからです。
これが具体的に影響するのは次の2点です。
1.VBで独自にLINQのキーワードを定義しても遅延実行できない。
2.VBで独自にLINQのキーワードを定義した場合List(Of T)などIEnumerable(Of T)を実装するクラスを媒介して値を戻す必要がある。

(具体例は少し下のリンク先にあります。)

このことが気になっていたので、先日マイクロソフトのセミナーに参加した時にたまたまお話しすることができたMVPのけろ-みおさんと、マイクロソフトの小高さんに聞いてみました。

結果、けろ-みおさんの方で要点まで整理していただきました。
http://techbank.jp/Community/blogs/mymio/archive/2008/05/25/788.aspx
この中でけろ-みおさんは拡張メソッドの中でさらにLINQを使うという面白い試行も紹介しています。
しかも、そのLINQはスパイスが効いています。VBのLen関数をうまくLINQで表現されています。

ちなみにLINQのキーワードを独自定義するにはIEnumerable(Of T)に対する拡張メソッドを作成します。

話は変わりますがマイクロソフトは無料で質のいいセミナーをしばしば開催しています。みなさんもマイクロソフトのサイトをチェックしてみてください。
http://www.microsoft.com/japan/msdn/events/offline/

今回私が参加したのはこの中の「さあ、できることから」というやつです。参加と言っても前でしゃべる人ではなく一般人として参加してきました。
技術的には基本的なことがらが多かったですが、実際の画面操作を見ながらいろいろな話をきけてとても参考になりました。ほぼ同じ内容を6月以降地方でも実施するようですからお近くにお住まいの方は足を運んでみてはどうでしょうか?

| | コメント (2) | トラックバック (0)

2008年4月27日 (日)

C#のyieldを甘く見てました

VBばかり見ていたせいでC#のyieldのすごさを見逃していました。

C# 2.0でyieldが登場した時は、「簡単に列挙できて便利だなぁ、VBにもあればいいなぁ、でもなくてもなんとかなるからしばらくは我慢するかぁ」くらいに思っていたのですが、最近知りました。

yeild returnで返すメソッドは遅延評価されるって皆さんご存知でしたか?(このようなメソッドをサブルーチンではなく『コルーチン』と呼ぶらしいです。)

たとえば、このC#のコードを眺めます。

        private void button1_Click(object sender, EventArgs e)
        {

            var ar = GetEnum();

            listBox1.Items.AddRange(ar.ToArray());
          
        }

        private IEnumerable<string> GetEnum()
        {
            yield return "Apple";
            yield return "Banana";
            yield return "Cat";
            yield return "Dog";
        }

GetEnumメソッドが実行されるのは、どのタイミングかというとlistBox1.Items.AddRangeの行なんですね。てっきりvar ar = GetEnum()の行かと思ってしまいますよね。ちょっとステップ実行してみてください。

まぁ遅延実行も別になくてもいいんですけど、LINQの演算子の標準実装がこれなんでちょっと気になりました。

クエリ式では定義済みの演算子を使用するだけなので別にVBでLINQの機能が制限されるとかそういうことではないです。ただ、メソッドベースのLINQを使うときに自作の拡張メソッドを作る場合にC#ならばyield returnを使用することで標準のLINQと同じような遅延評価ができるのに、VBだと自作の演算子だけ即時評価にならざるを得ないかなと思っただけです。

はい。別に自作演算子で即時評価が行われてもいまのところ特に困る気はしません。

| | コメント (3) | トラックバック (2)

2007年10月10日 (水)

マイクロソフトが.NETのソースコードを公開する

Visual Studio 2008の発売に歩調を合わせてか、このほど、マイクロソフトが.NETのソースコードを公開すると言う情報が出回っています。
日本語の情報源
http://www.atmarkit.co.jp/news/200710/05/dotnet.html

「公開する」であって「公開した」ではないので、あわてないようにお願いします。

上のリンクを読めばわかりますが、System名前空間やSystem.IO名前空間など基礎的な部分のソースコードから公開されるようです。
ソースコードが公開されるメリットはいくつかありますが、私にとっては「学習効果」が大きいです。
今まで、どうやればいいのかわからなかったり、もっといいやり方があるんじゃないかと悩んでいた部分も.NETの豊富なソースコードをサンプルとして利用することで解決できる可能性があります。
しかも、マイクロソフト純正ですから質が高いことも期待できます。

とは言え、情報源には書いてありませんが.NET Frameworkの大部分はC#で記述されているはずなので、VBファンとしてはちょっと悲しいものがあります。
.NET上ではC#とVBは非常に似ているので、C#でも問題はないのですが…。

ちなみに私が一番ソースコードが見たいのはColor構造体です。あまり取りざたされていませんが、Color構造体にはあるすごい機能があって、私はどうしてもその機能の実現方法がわからないで悩んでいるのです。

それから、謎に満ちたASP.NETの内部の挙動も直接ソースコードレベルで見られるようになるので楽しみです。

| | コメント (0) | トラックバック (1)

2007年9月24日 (月)

そろそろLINQ

そろそろ真面目にLINQに取り組み始めました。

今までも表面的なことはわかって、多少はいじれはしていたのですが、英語のドキュメントも頑張って読みながら本格的に研究し始めました。英語のドキュメントはWeb翻訳の力を借りながらなので読むのにかなり時間がかかります…。

で、まだみなさんの参考になるほどの成果はないのですが大分雰囲気はわかってきました。

どこまで実用的かは未検証ですが、LINQを使用するとコレクションや配列だけでなく、AccessやSQL Serverのデータベースにも簡単に照会を行うことができます。ひょっとすると今後のデータベースアプリケーションのあり方を変えていくことになるかもしれないと思いました。

LINQは冬に発売予定のVisual Basic 2008から導入される機能です。C#にも導入されます。ベータ版は無料でダウンロードできるので意欲的な方はぜひ触ってみてください。

ある程度まとまってきたら、Visual Basic 中学校でも本格的にLINQを取り上げる予定です。

あと、LINQは「リンク」と読みます。「リンキュー」じゃありません。

| | コメント (0) | トラックバック (1)

2007年9月21日 (金)

Enumの読み方

列挙体を宣言するときのキーワードEnumですが、いつも読み方に自信がないのであまり口に出さないようにしています。

今日、私の友人2人はこれを「イーナン」と呼んでいました。私は思わず「えっ?」と聞き返してしまいました。

私自身は「エナム」または「エナン」と呼んでいます。VB中学校では「エナム または エニューマレーション」という読み方を紹介しています。これはEnumがenumerationの略だからです。

enumerationは発音記号によると「イニューマレーション」と読むようです。

どれが正しいということも気になりますが、どれが多数派ということも気になります。みなさんはなんて呼んでますか?

この手の話ってよくありますよね。Charも通常は「キャラ」と読むのですが、「チャー」と呼ぶ人もいますよね。

そういえばImportsのこと「インポート」って読んでませんか?本当は「インポーツ」ですよね?Crystal Reportsも「クリスタルレポート」ってみんな読んでいるし。まぁ通じればいいんですけど。

| | コメント (0) | トラックバック (0)