VB10のプロパティ定義

投稿者: Tomotoshi Sugishita 2008年11月4日 23:31

MVP for VB の樋口さんのブログのエントリーを見ていて・・・

VB10 では、C#3.0同様、暗黙のアクセッサの自動定義により、プロパティ定義がシンプルにかけるようになる予定だけど、ReadOnly や WriteOnly などのキーワードをもつプロパティ(Setter もしくは Getter しか持たないプロパティ)は省略できず従来通りの書き方になるようです。
何気に、ReadOnly でも以下のように書けても良いんじゃない?なんて思ってたけど、

Public ReadOnly Property ID As Integer

よくよく考えてみると、こうした場合、そもそもこのプロパティの値を設定する手段がないわけね。
もともとは、ReadOnlyだと、外部への公開時にはクラス内部なりに、独自の(Privateな)アクセッサを使って値を設定する場合がほとんどなわけで、そういった意味では、省略された記述ではその手段を断ってしまうということで、(WriteOnlyも同様)「意味なし」ということですね。

省略されたプロパティ定義では、以下のような記述により値の初期化もできるわけだけど、

 Public Property ID As Integer = 0

この形のみ提供されたとして、

 Public ReadOnly Property ID As Integer = 0

なんて記述が可能になっても、これは内に対しても外に対しても定数的な扱いにしかならないので、これも使い道はないことはないとは思うけど、限りなくないに近いということで(なんのこっちゃ)、これも意味なし。

タグ: ,

Visual Basic | Visual Studio

Visual Studio 2010 および .NET Framework 4.0 のCTP リリース

投稿者: Tomotoshi Sugishita 2008年11月4日 23:10

先日のPDCで配布された、Visual Studio 2010 の VPC イメージが一般公開されているみたいです。

http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en

VHDフォーマットによる提供なので Hyper-V にもマウントできますが、Hyper-V で使用する場合は、
下記の手順にてHALを再度検出させることで、統合サービスを使用できるようになります。

日本語環境として利用したい場合は、以下より MUI パックを入手してインストールすると良いでしょう。
Windows Server 2008 Multilingual User Interface Language Pcks
http://www.microsoft.com/downloads/details.aspx?FamilyID=e9f6f200-cfaf-4516-8e96-e4d4750397ff&DisplayLang=ja

仮想環境(CTP)を日本語にするとこんな感じ

自宅では、Hyper-V Server 2008 上に仮想化していますが、家中どの PC からもいつでも好きな時に評価作業を続行できるので、すごく便利です。

タグ: ,

Visual Basic | Visual Studio

VB10 の配列初期化子と型推論

投稿者: Tomotoshi Sugishita 2008年10月30日 3:00
blank_page

海の向こうでは、PDC2008 が開催中で、いろいろな話題が連日飛び込んできます。

Visual Studio 2010 のプレビュー版 (CTP) も公開され、次期 VB の言語仕様の変更点もいくつか見えてきたので、ご紹介したいと思います。

まずは、VS2008 で個人的に気になっていた、配列、コレクションの初期化子と型推論について確認してみました。

VB9(2008) では、以下のような式を記述すると、コンパイラにより v1 は Integer 型として型推論されます。

 

Dim v1 = 1

次に配列の場合ですが、VB8(2005) 以前のバージョンでは特定の型の配列の初期化を行う場合、

 

Dim v1() As Integer = New Integer() {1, 2, 3, 4, 5}

 

と記述していました。
このコードを VB9(2008) の型推論を期待し、

Dim v1() = {1, 2, 3, 4, 5}

このように記述した場合の v1 は Object 型の配列として扱われてしまいます。
どうやら VB9(2008) では、リテラル値や変数からの型推論はできても、配列の型推論はできないらしく、これは、

Dim v1() = New Integer() {1, 2, 3, 4, 5}

または

Dim v1 = New Integer() {1, 2, 3, 4, 5}

と記述する必要があります。
後者の方を見ると、配列の型推論もできているように思えるのですが、これは v1 に対し明示的に Integer 型の配列を代入しているので、単純な型の代入時と同じ解釈だと思います。
とりあえずはこの例のように型が決まった配列を扱う場合は、この仕様でも十分なのですが、匿名型の配列を初期化する場合にはこれが弊害となります。
匿名型の場合、当然型名を持たないのであえて書くならば、

Dim persons = New () { _
              New With {.ID = 1, .Name = "Person1"}, _
              New With {.ID = 2, .Name = "Person2"} _
             }

みたいな感じになるのでしょうか。
VB の場合、C 系言語のように配列とメソッドで使用する括弧が区別されていないので、コードパーサー上も複雑でしょうし、実際のコードを見る側としても何のこっちゃという感じですので、私の意見としては以下のような記述ができる方がより自然な形ではないのかなと思っていました。

Dim persons = { _
              New With {.ID = 1, .Name = "Person1"}, _
              New With {.ID = 2, .Name = "Person2"} _
             }

さてそこで VB10(2010) ですが、今のところは、私が期待していた仕様となっているようです。

Dim v1 = {1, 2, 3, 4, 5}

これと等価の C# のコードが

var v1 = new [] {1, 2, 3, 4, 5};

となるので、この部分の型推論については VB の方が一歩踏み込んだようなかたちになりますが、BASIC 言語の特性上せざるをえなかったということでしょうか。

ちなみに、配列の要素を複数の型でミックスした場合のルールが現行は C# と若干違うのですが、このあたりはまだ CTP なので、今後は統一していくのかもしれません。 (まぁ、普通こんなことはしないのでどうでもいいんだけど・・・。)

Dim v1 = {1I, 2L, 3D, 4.0F, 5.0R}   '(有効)Double 型の配列として解釈される

var v1 = {1, 2L, 3m, 4.0f, 5.0d}; //(無効)十進型と浮動小数点型は混在できない

最後に、さきほどの匿名型の配列の初期化コードですが、VB10(2010) では正式には以下のように

Dim persons = {
              New With {.ID = 1, .Name = "Person1"},
              New With {.ID = 2, .Name = "Person2"}
             }

なんと!VBからついに "_"(アンダースコア)が消えています!!
VB にはステップの終端文字(セミコロン)がないので、これ(コードのパース)の開発には VBTeam は相当苦労したんじゃないかなと。
限定条件があるとはいえ、これはかなりうれしいです。コードがかなり美しく見えます。つか、なにかとコードが書きやすいぞ!

それでは、今日はこんなところで。
こんなことを調べていたら、また夜中になってしまいました・・・。

また気づいたことがあったら書きます。

タグ: ,

Visual Basic | Visual Studio

Hyper-V で Windows 3.1, VB2 を使ってみた(ネタ)

投稿者: Tomotoshi Sugishita 2008年9月20日 2:50

以前のエントリーで、MS-DOS 6.2 を Hyper-V で起動した場合、リブートが延々と繰り返されてしまうと書きました。
正式サポートされているOSではないわけなので、動作しなくても文句は言えないのだけど、なんでも見てみないと気が済まないたちなのと、
VBユーザーとしては、どうしてもこの環境でVB2が動作している姿をみたいので、ちょっとひと工夫してやってみました。

まず、下の画像を見てください。Windows Server 2008 上の仮想環境の Windows 3.1 で VB2が動作しているようにみえます(笑)。

これ、決して合成ではありません。
実は、Hyper-V に Windows XP SP2 の仮想環境を作成した上で、その中に Virtual PC 2007 をインストールし、さらに仮想化した環境に Windows 3.1 をインストールしてあります。
仮想化環境の中で仮想化された Windows 3.1 を最大化表示すると、上記のようにまるで Hyper-V のコンソールで Windows 3.1 が動作しているように見えるわけですね。

最初は、Windows 3.1 のホストOS (Windows XP)に Hyper-V の統合サービスをインストールして動作させたところ、マウスキャプチャに問題があり、ゲストOS上ではマウスがまともな位置を指さない上、キーボードも何やら不安定だったので、Hyper-Vの統合サービスをアンインストールしてみたところ、とりあえずマウス、キーボードは正常動作。
VB2も無事動作しました。

しかし実際のところ、動作に関しては満足できるパフォーマンスが得られない(かなりもたつく)し、仮想化の上の仮想化でCPUには相当負荷をかけてる(画面上部のCPU温度が68℃となっており、赤く警告されているのがわかると思います)ので、実用できるレベルではないです。
Windows 3.1 などの16bit OS を使用するなら、Virtual PC 2007 上で使うべきですね。^^;

次は、Windows NT 4.0 と Windows 95, 98, Me に挑戦。

2008年9月27日追記
Windows 95, 98 については、MS-DOS同様起動プロセス中に仮想プロセッサでエラーが発生し、この時点で仮想マシンがリセットされるため、起動とリセットが繰り返されます。おそらくは Windows Me についても同様かと思われます。
これらのOSについても、Virtual PC 2007 での利用が VM Addin も利用できるので妥当かと思われます。

タグ: ,

Visual Basic

LINQを使用したRSSの生成

投稿者: Tomotoshi Sugishita 2008年4月8日 11:47

サンプルというか、メモ書きに近いです。
VB9のXMLリテラルを使用して書くとどうなるのかなと思って作ってみました。
(日付に関しては、RFC822形式になっていません。)
データの最新10件を出力しています。

Using db As New TestDataContext()
    Dim topics As Table(Of Topics) = db.GetTable(Of Topics)()
    Dim rss = <?xml version="1.0"?>
              <rss version="2.0">
                  <channel>
                      <title>LINQでRSS</title>
                      <link>http://www.hoge.com/</link>
                      <description>LINQでテーブルのデータよりRSSを生成するサンプル</description>
                      <language>ja-JP</language>
                      <pubDate><%= topics.Max(Function(topic As Topics) topic.CreatedDate).ToUniversalTime() %></pubDate>
                  </channel>
                  <items>
                      <%= (From topic In topics _
                          Order By topic.CreatedDate Descending _
                          Select <item>
                                     <title><%= topic.Title %></title>
                                     <link>http://www.hoge.com/topic.aspx?id=<%= topic.Id %></link>
                                     <description><%= topic.Summary %></description>
                                     <pubDate><%= topic.CreatedDate.ToUniversalTime() %></pubDate>
                                     <guid>http://www.hoge.com/topic.aspx?id=<%= topic.Id %></guid>
                                 </item>).Take(10) %>
                  </items>
              </rss>End Using

一応中でXMLリテラルやラムダ式なんかも使ってます。
「これぞVB9!」というコードですね。^^

タグ: ,

Visual Basic

杉下 朋年

Tomotoshi Sugishita
Tomotoshi Sugishita
< D&UNITE 株式会社 >

Microsoft MVP
Microsoft MVP for Development Platforms
- ASP.NET/IIS Jul.2009 - Jun.2012
Microsoft MVP for Development Tools
- Visual Basic Jul. 2004 - Jun. 2009

 

カレンダー

<<  2月 2012  >>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

投稿一覧をカレンダーで表示