tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^9: 文字列によるプロパティの参照
投稿日: 2012/01/23(Mon) 21:32
投稿者魔界の仮面弁士
> VB6(VB6 の話をすると歳がばれてしまいますね^^;)の
VB6 で言えば、Dictionary オブジェクトに相当しますね。

VB6 時代において、キーと値の組み合わせで管理するものとしては、他にも
Collection オブジェクトや PropertyBag オブジェクトがありました。
少し毛色が違いますが、Recordset なども列名と値(と行)での管理に使えます。


> ListBox だか ComboBox だかで Key と Value の2つを格納出来たので、
Key/Value 格納機能は無かったと思います。もしかして、ActiveX コントロールの
DBListBox / DBComboBox / DataListBox / DataComboBox あたりか、あるいは
「ItemData(Index As Integer) As Long」プロパティのことを仰っているのでしょうか。


> まさか 2005 まで無かったとは…。
List(Of T) は 2005 からの実装ですが、それ以前の .NET バージョンでも
System.Collections.Hashtable を使うことで、連想配列を扱えます。
(List の方が便利なので、現在では Hashtable はあまり使われないですけれどね)


> それに Dictionary クラスの名前空間が System.Collections.Generic だなんて、
> 知らなかったらヘルプで探せる訳が無いですよ。(^^;)
「ジェネリック(Generic)」は .NET 2.0 の目玉機能の一つなので、
登場当時はかなり話題になっていました。特に List クラスは、VB2008 以降でも
良く使われるものなので、これを機に、是非とも習得されることをお奨めします。


なお VB2005 のプロジェクトでは、既定の名前空間として
 Microsoft.VisualBasic
 System
 System.Collections
 System.Collections.Generic
 System.Data
 System.Drawing
 System.Diggonostics
 System.Windows.Forms
が組み込まれています。(プロジェクトのプロパティで確認できます)

覚えなくても良いので、それぞれの名前にどんなクラスが含まれているのかを
ヘルプで眺めておくと、名前空間ごとの役割が見えてくるかと思います。


> まだ System 名前空間だったら見つけられる可能性もあるんですが、なぜ分ける必要が
> あるんでしょうね?
……あれを System 名前空間に置くのはどうかと思いますが、そもそも
ひとつの名前空間に無数のオブジェクトが詰め込まれていったら、
そちらの方が探しにくいと思うのですが――そんなことは無いですか?

ただ、あちこちの名前空間にいろいろな機能があるため、分かりにくいという
ユーザーの声はあったようです。そのため VB2005 では、「My 名前空間」を
用意することになったようですね。(今回の件とは関係ないですけれども)

その My にしても、邪魔だ邪道だとして、元の名前空間管理だけで十分という
ユーザーもいますし……まぁ、いろいろな考え方があるということなのでしょうね。


> 困ってもヘルプじゃ何も解決出来ないって、以前言った意味が分かるでしょう?(^^;)
ごめんなさい。以前言われたかどうかをまったく覚えていないです。(^^;)

 そして、それを解決できるようにするための策が、先の System 名前空間に
 入れるという案だというのであれば、私はそれに拒否の票を投じます。(^^;)


> ヘルプじゃ何も解決出来ない
基礎よりも実践を積み重ねることで覚えていくタイプの人には
ヘルプを読み解くのは辛いみたいですが、逆に座学派にとっては
面白いようです。(私はやや座学派よりかも知れないです)

ヘルプは初見だと難解とは思いますが、それなりの情報量はあるので
「何も解決できない」ほどでは無いはずですし、ある程度読みとけるようになれば、
独学でもなんとかなっていくものですよ。とはいえ、基礎力などの影響も受けるので、
学校の勉強と一緒で、読み解けるようになるまでには個人差が大きく出ますが…。


> 後、引数の Of ってなんなんですか?
これは「ジェネリック」という概念です。Of の後にデータ型を指定します。

たとえば、System.Collections 名前空間の下にある
Hashtable や ArrayList といったコレクションは、各メンバーが
As Object 型であり、どんなデータでも格納できるコレクションです。

たとえば下記では、ArrayList に文字列を格納し、それを取り出しています。

 Dim x As New ArrayList()
 x.Add("あいうえお")
 x.Add("かきくけこ")
 x.Add("さしすせそ")
 x.Add(Now)   '引数が As Object なので、どんな型でも格納できてしまう。
 TextBox1.Text = CStr(x(1)) '「かきくけこ」

しかし、各メンバーが As Object として管理されるため、
取り出し時には元の型に再変換する手間が発生します(上記では CStr)。

文字列のコレクションとしたいなら、As Object ではなく、As String、
Class1のコレクションとしたいなら、As Class1 のみが管理されるよう
「特定の型」で扱えるようになっていた方が便利ですよね。

ですが、だからといって「〇〇型用のコレクション」を逐一作成するのも
効率が悪い話です。そこでジェネリックという仕組みでは、その「型」を、
クラスやメソッドにパラメータとして指定できるようになっています。
その型パラメータの指定に使われるのが、VB では Of というキーワードです。

 Dim x As New List(Of String)()   'String 型のリスト
 x.Add("あいうえお") '引数が As String なので、文字列のみが格納可能。
 x.Add("かきくけこ")
 x.Add("さしすせそ")
 TextBox1.Text = x(1) 'As String なので、CStr が不要。

上記は List(Of T) クラスを、String のコレクションとしています。

また、複数の型パラメータを必要とするクラスもあります。
先に使った Dictionary(Of TKey, TValue) クラスがそれであり、
キーの型と値の型の2つを渡すようになっています。


> Of って付く事で、使い方に注意しなければならない事とかはあるんでしょうか?
慣れてしまえば難しい物でもないので、細かい背景はともかくとして、
そういうものだと割り切って、とにかく使い慣れてみる事ですかね。

試しに ArrayList と List(Of T) を使い比べてみると、おそらくは
後者の方がいろいろと便利に感じると思います。


一応関連情報として、ジェネリックについての資料も紹介しておきますので、
興味があれば、後で目を通してみてください。
http://www.atmarkit.co.jp/fdotnet/special/generics01/generics01_02.html
http://msdn.microsoft.com/ja-jp/library/w256ka79%28vs.80%29.aspx

ついでにこのあたりも。VB2005 の新機能と呼ばれる部分です。
http://msdn.microsoft.com/ja-jp/library/ms172192%28vs.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/y17w47af%28vs.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/we86c8x2%28vs.80%29.aspx

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。