タイトル : 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 |