• ベストアンサー

VB.NETでのEnumの使用について

こんにちは、いつも拝見させて頂いております。 今回は、VB.NETのEnumについて教えて頂ければと思い、投稿しました。 VB.NETでEnum定義をしているのですが、クラス内のEnumとして定義 しているのですが、そのクラスのインスタンスを生成しなくても クラス内のEnum定義が参照できます。 クラスのインスタンスを生成していないのであれば、そのクラス内に あるEnum定義も参照できないのではないかと考えていたのですが、 参照できたので、なぜなのかがわかりません。 自分なりに色々と調べたのですが、EnumがSystem.Enumを継承している というのはわかりましたが、それがなぜ、クラスのインスタンスを生成 しないで、クラス内のEnum定義が参照できることになるのかがわかりません。 言語は、VB.NET2005です。 一応、ここの質問一覧も検索してみたのですが、該当しそうなもの が見当たらなかったので、ここに投稿させてもらいました。 お忙しいところ、申し訳ありませんが、ご教授ください。

  • onti
  • お礼率64% (9/14)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

先の投稿であげたURLが VB.NETのものですよ ページの右肩に『Microsoft Visual Studio 2005/.NET Framework 2.0』といった記述があります VB6.0の記述は現在Webでの参照ができなくなっているようです

onti
質問者

お礼

回答ありがとうございます。 確かにおっしゃるとおり、記述されていました。 大変、助かりました。

その他の回答 (3)

回答No.3

クラスの中のクラスは,外側のクラスに束縛されません。 ここはJavaと異なるので,Java経験がある場合は注意が必要です。 # Javaでは外側のクラスに束縛されます。 つまり, Public Class OuterClass ' コード Public Class InnerClass ' コード End Class ' コード End Class とあった場合に, Dim obj As New OuterClass.InnerClass のように,InnerClassに自由にアクセス可能です。 Enumも一種のクラスですから,上記と同様の理由で,外側のクラスのインスタンス化なしに内側のEnumにアクセスできます。

onti
質問者

お礼

なるほど、C#でやっていたときは、インスタンスを生成したあとで そのクラス内のEnumを参照するようにしていたので、クラスインスタンス を生成せずに、Enumを参照できるのがなぜかわかりませんでした。 ご説明戴いた内容でなんとなくですが、理解できました。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

Microsoftのサイトなら MSDNでしょう http://msdn2.microsoft.com/ja-jp/library/8h84wky1(VS.80).aspx そのものズバリですが ・・・

onti
質問者

お礼

回答ありがとうございます。 教えて戴いたページは、私も検索して見つけましたが、VB.NETと いうよりは、VB6.0の情報だと思ったので、VB.NETとしての 記述のあるページを探しています。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

定数項の文字列による置き換えだからではないかと思います Enum ... End Enum で定義された部分がご質問だとすると Enumステートメントを調べたほうが良いでしょう ご質問の内容が Class oTest   Enum Test     First     Secound     Third   End Enum   Public objEnum1 as Test   Private objEnum2 as Test end Class と定義した場合 oTest.Test.First はそのままアクセス可能です objEnum1やobjEnum2などは oTestのインスタンスが無いとアクセスできません また objEnum2はPrivateなので oTestクラス内でのみ参照可能です

onti
質問者

お礼

早速の回答ありがとうございます。 Enumステートメントでネットを検索したら、VBの記述として Enumのスコープの説明がありましたので、理解できました。 ただ、VB.NETとしてのそういった記述があれば、さらにいいなと 思いますので、もう少し調べてみます。 ありがとうございました。 もし、VB.NETのそういった記述している箇所をご存知でしたら 教えていただけると幸いです。

関連するQ&A

  • enumの継承?

    C++で、クラス内でenumの宣言ができると思うのですが、 (1)継承した先のクラスからはどのように見えるのでしょうか? (2)そもそもenumに対してpublic等の指定は可能ですか? 本をいろいろ調べてみましたが、該当する記述がなかったため、ご回答をよろしくお願いします。

  • VC++のDLLをVB6.0からVB.NETへ移行する方法

    はじめて投稿します。 今、現状VB6.0のプログラムで使用しているVC++のDLLを VB.NETで使用できるように、VB.NETのソースの改修をしています。 (開発環境は、VisualStudio.NET 2003) たいていのDLLは、DllImportを行うことで VB.NETから使用できることを確認しました。 /*--(例)------------------------------------------*/ Imports System.Runtime.InteropServices <DllImport("DLLTest.dll")> _ Private Shared Function DLLTestMethod() As Integer End Function /*------------------------------------------------*/ しかし、苦戦しているDLLファイルがあって、 そのソースを見ると、COMで実装されているようで、 コンパイルしたらタイプライブラリファイルが作成されています。 またDLLのレジストリも登録されているようです。 VB6.0でどう使われているか確認したところ、 そのDLLの参照設定をしていて、 "Public obj As New クラス名"でクラス宣言した後、 obj.関数名()で処理を行っています。 VB.NETでいろいろ試行錯誤してみましたが 参照設定はできるものの、その後で手詰まりになっています。 (参照設定しても、灰色になっているクラス名が存在するので 正しく設定できているかも怪しい状態) (1)----------------------------------------------- 参照設定後、オブジェクトブラウザから見えるクラスをNewして そのメンバ関数を使用する方法 -------------------------------------------------- (結果) レジストリ登録をしていないと 「CLSID{・・・}のCOMオブジェクトが有効でない」云々というエラーに。 それを受けて手動で該当するDLLのレジストリ登録を行った後だと 「オブジェクト参照がオブジェクトインスタンスに設定されません」というエラー。 (ということは、クラス生成に失敗している?) (2)----------------------------------------------- 上記のようにDllImportで実装する方法 (ちなみにそのDLLがエクスポートしている関数は DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServerの4つ) -------------------------------------------------- (結果) DllGetClassObject以外については関数を呼ぶことができている。 DllGetClassObjectは、引数設定に苦戦して今のところうまくいっていない状態。 (3)----------------------------------------------- インスタンス生成ができていないようなので どこかで調べて見つけてきたCoCreateInstance関数を使用する方法 -------------------------------------------------- (結果) これも引数に何を渡してよいかわからず試行錯誤中。 DLLの読み込みの時点でこけているかと予測して そのあたりが解決すればよいのかな・・・といろいろ試していますが WindowsプログラミングやCOMがよくわかっていないので 何が正解で何が間違っているのかさっぱりわからず、 周りに聞いても精通している人がいないためどうしようもなくなっています。 どんな些細な手がかりでもよいので 突破口になりそうなアドバイスがあれば教えてください。 よろしくお願いします。

  • VB.NETについて

    はじめまして。 質問ですが、ASP、VBScriptの経験があればVB.NETも簡単にできるようになりますか? なんかクラスとか継承とか、VB.NETはずいぶん変わったイメージがあるので少し不安です・・。 またCの経験はありませんがC#とか勉強したほうがいいのでしょうか? 変な質問ですみませんが気が向いた方はご教授ください。 お願い致します。

  • VB6.0からVB.NETへの移行について

    現在、VB6.0で作られているシステムをVB.NETへ移行しようとしています。 そこでAcvtiveX EXEのGlobalMutiUseで作成されている画面を持つプロジェクトを移行する方法に困っています。 現状は、上記の画面が最初に起動されたら常駐して、定期的にサーバから情報を取得して内容を更新して、他の別プロジェクトの画面からその情報を取得して動いているような仕組みとなっています。 それを移行ガイドの通りクラスライブラリで作成して、他の別プロジェクトの画面から情報を取得しにいこうとすると新たに別のインスタンスが作成されて、それを見にいってしまうため情報が取得できません。 VB6.0のAcvtiveX EXEのGlobalMutiUseのように共有のインスタンスを他から見れるようにするにはどうしたらよいでしょうか?なるべく変更を少なくしたいと思っています。 よい解決策をご存知の方がおられましたら是非御教授をお願いいたします。

  • インスタンス変数とローカル変数のスコープの違い

    Ruby言語を独学で勉強している者です。 現在たのしいRuby第3版という著書を参考にして勉強しています。 現在はクラスの継承、クラス文の定義の仕方を学んでいます。 そこで教えて欲しいのですが、 ローカル変数とはメソッドごとに異なる変数として扱われる。 インスタンス変数は同じインスタンスの中であればメソッドの定義を越えて その値を参照したり変更したりできるとあります。 そもそもインスタンスとは、オブジェクトとおほ同意義と捉えてるのですが この認識に間違いはないでしょうか。 ニュアンス的なものは理解したのですが、もう少しこの二つの変数の定義について 理屈を把握したいので、お手すきなお方がいらっしゃいましたら、具体的な例をあげて ご説明くださいませんか・・・。 この本すごく素人にもわかりやすい丁寧な解説で書いてあって、決して説明不足とは 思わないのですが、プログラマーさんの意見なども参考にしたくて投稿してみました。

    • ベストアンサー
    • Ruby
  • VB.NETでのシリアル通信

    .NET初心者です。 VB.NETでシリアル通信をしようとしています。 参照設定のところに Microsoft MSCOMM CONTROLというのがあったので 選択しました。 すると、MSLib.MSCommというのがでてきたので Vb6の Dim test As mscomm のように宣言して使えるかと思い Dim test As MSLib.MSComm test.PortOpen と書いてみたところ、 オブジェクト参照・・・インスタンス化されていません。と、エラーがでました。 ブレイクしてみたところ、test = Nothingでした。 testが無いのでインスタンス化されていないという エラーがでるのだなということは分かったのですが なぜこのエラーがでるのか、 どうしたらこのエラーを回避し、 .NETでシリアル通信ができるのか教えてください。 よろしくお願いします。

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • 継承について

    みなさま、どうかお知恵を貸して下さい。 javaを勉強中で、本を読みながら試しに動かしています。 現在、実現したい動作が実現可能かどうかを調べているところです。 そのため、環境やバージョン等は決まっておりません。 むしろ、実現可能な環境やバージョンがあれば、教えてください。 実現したい機能ーーーーーーーーーーーー 親クラスAにメンバーとメソッドを定義します。 Aを継承する子クラスBを定義します。 プログラム中で、A、Bのインスタンスを生成します。 そして、A、Bを継承するCのインスタンスを生成したいのです。 Cのメンバーやメソッドは、Bと同様のものです。 この場合、BのクラスからCのようなインスタンスを作成することは、可能なのでしょうか? ・・・Cを定義していないので、おそらく不可能かと思います。 やはりこういった場合、Aを継承しているBを継承するCクラスを定義しておく必要があると考えています。 では、Cを継承するD,Dを継承するE・・・というように、いくつ必要になるかわからない場合、最大数分継承したクラスを用意すべきでしょうか。 なぜ、そうしたいかというと、組織図のようなものを作成したいのですが、組織図を構成する人数は、ユーザーの任意としたいのです。 継承したクラスを用いれば、そのまま組織図の体系を表現できる気がしました。 質問が大雑把になってしまい、申し訳ないのですが、お力を貸していただければ幸いです。

    • ベストアンサー
    • Java
  • VB6.0 VB.NET2003とのクラスの違い

    こんにちは VB6.0でデータベースのソフトを作成しています。 当初VB6.0はVB.NETと違い完全なオブジェクト指向言語ではないと聞いていたので、 フォームの画面ごとに検索、追加、更新、削除、入力チェック,印刷のコードを書いていこうとしました。 しかし、最近そうでもないことがわかりました。 そこで、画面ごとではなく機能ごとに検索、追加、更新、削除、入力チェック,印刷のクラスモジュールをつくり、 どこに何が書かれているかわかるようにコーディングしたいと思います。 VB.NET2003は学生のころやっていたのですが、VB6.0は最近やりだしたのでよくわかっていません。 VB6.0の入門書をみてもクラスについては2~3ページしか触れていません。 VB.NET2003にはできるがVB6.0にはできないクラスの大きな違いを教えてください。 いまのところコンストラクターとオーバーロードはできないということだけわかっています。

  • VB.NET2005の参照設定について

    VB.NET2005の参照設定について 新規プロジェクトで開くときにすでに作成したクラス(dll)を、デフォルトで参照設定されているようにできないでしょうか?

専門家に質問してみよう