none
非共有メンバーを参照するには、オブジェクト参照が必要です。 RRS feed

  • 質問

  • DatabaseのAccessを参照する構文です。

    Private Sub cboGengo_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboGengo.SelectedIndexChanged

    txtGengo = cboGengo.Text

    Dim rowFound As DataRow = 歴史DataSet.元号.元号(txtGengo)

    最後の行の「歴史DataSet.元号」に波アンダーラインがついて、タイトルのエラーが出ます。

    意味がよくわかりません。初心者にわかるような回答をお願いいたします。

    2012年5月24日 13:26

回答

  • 共有メンバーはアプリケーション全体で共有されるメンバーです。アプリケーションに1つしかありません。ですから、アプリケーションで共通に使う情報を格納する場合などに便利に使えます。
    対して、非共有メンバーはアプリケーション全体で共有されていません。newしてインスタンスを作成した数だけ存在します。逆に言えば、非共有メンバーはnewしてインスタンスを作成しなければ存在しません。ですから、
    「非共有メンバーを参照するには、オブジェクト参照が必要です。」
    は、
    「非共有メンバーを使うためには、インスタンスが必要です。」
    という意味になります。

    共有メンバーはインスタンスではなく、クラスに属しているとも言えます。また、非共有メンバーはインスタンスに属しているとも言えます。したがって、共有メンバーのことをクラスメンバー、非共有メンバーのことをインスタンスメンバーと言うこともあります。それを踏まえられると、Keiichi Oumiさんが書かれている以下の内容で、なぜ共有メンバがインスタンス名.メンバ名の形でも使用できるのだろう?と、疑問を持たれるのではないかと思います。

    >共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
    >非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    上記は、本来は、

    >共有メンバ : クラス名.メンバ名の形でのみ使用できる。。
    >非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    で充分です。確かにVBでは共有メンバーをインスタンス名.メンバ名の形でも書けますが、ワーニングが出ます。ちなみにC#では、共有メンバーはクラス名.メンバ名の形でしか書くことができません。
    よってVBでも、特別な事情がない限り、共有メンバーはクラス名.メンバ名の形で書かれることをお勧めします。

    また、参考までに書きますが、VB初学者の方がよく混乱されるのが、既定のインスタンス(暗黙のインスタンス)です。フォームクラスは(Formクラスを継承したForm1など)、本来はnewしてインスタンスを作成しなければ使用できませんが、非共有メソッドであるShowメソッドが共有メンバのように、いきなり、
    Form1.Show()
    と書くだけで動作してしまいます。なぜ動作するかというと、Form1のインスタンスが裏で自動的に作成されるからです。

    (参考)
    「Visual Basic 2005 の My 機能の検証」における、「My.Forms」の部分
    http://msdn.microsoft.com/ja-jp/library/ms379610(v=vs.80).aspx

    VBは融通が利く分、オブジェクト指向を学習する上で混乱しやすい面も持っていると思いますので、その辺りを注意されると良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 山本春海 2012年6月5日 8:53
    2012年5月25日 1:54
    モデレータ
  • 初めまして。歴史DataSetはどこで宣言しているのか、不明ですが、

    まずは、以下の様に記述してみてください。

    Private Sub cboGengo_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboGengo.SelectedIndexChanged

    txtGengo = cboGengo.Text

    dim 歴史DataSet as new 歴史DataSet    '<--- 追加してみてください

    Dim rowFound As DataRow = 歴史DataSet.元号.元号(txtGengo)

    • 回答としてマーク 山本春海 2012年6月5日 8:52
    2012年5月24日 14:14
  • こんにちは。

    簡単に説明だけしますと、

    共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
    非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    つまり、dim hoge as new class のように、どこかで誰かに、new され、実態(インスタンス)が作成されていなければ利用できないものが、非共有メンバであるという理解だと思います。

    通常、Class(DatasetなどもClassです)は、そのままでは実態が無いため、実態のないClass(型)のメンバへアクセスする場合には、

    >dim 歴史DataSet as new 歴史DataSet

    のように、new して実態を作らなければ、そのメンバ型へのアクセス時に問題のエラーとなるって事だと思います。

    対して、もし直接歴史DataSet を参照した場合は、NullExceptionが実行時に発生するんだったと思います。



    (間違い補足などありましたら、、訂正お願いします。)
    • 回答としてマーク 山本春海 2012年6月5日 8:53
    2012年5月25日 0:23

すべての返信

  • 初めまして。歴史DataSetはどこで宣言しているのか、不明ですが、

    まずは、以下の様に記述してみてください。

    Private Sub cboGengo_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboGengo.SelectedIndexChanged

    txtGengo = cboGengo.Text

    dim 歴史DataSet as new 歴史DataSet    '<--- 追加してみてください

    Dim rowFound As DataRow = 歴史DataSet.元号.元号(txtGengo)

    • 回答としてマーク 山本春海 2012年6月5日 8:52
    2012年5月24日 14:14
  • こんにちは。

    簡単に説明だけしますと、

    共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
    非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    つまり、dim hoge as new class のように、どこかで誰かに、new され、実態(インスタンス)が作成されていなければ利用できないものが、非共有メンバであるという理解だと思います。

    通常、Class(DatasetなどもClassです)は、そのままでは実態が無いため、実態のないClass(型)のメンバへアクセスする場合には、

    >dim 歴史DataSet as new 歴史DataSet

    のように、new して実態を作らなければ、そのメンバ型へのアクセス時に問題のエラーとなるって事だと思います。

    対して、もし直接歴史DataSet を参照した場合は、NullExceptionが実行時に発生するんだったと思います。



    (間違い補足などありましたら、、訂正お願いします。)
    • 回答としてマーク 山本春海 2012年6月5日 8:53
    2012年5月25日 0:23
  • 共有メンバーはアプリケーション全体で共有されるメンバーです。アプリケーションに1つしかありません。ですから、アプリケーションで共通に使う情報を格納する場合などに便利に使えます。
    対して、非共有メンバーはアプリケーション全体で共有されていません。newしてインスタンスを作成した数だけ存在します。逆に言えば、非共有メンバーはnewしてインスタンスを作成しなければ存在しません。ですから、
    「非共有メンバーを参照するには、オブジェクト参照が必要です。」
    は、
    「非共有メンバーを使うためには、インスタンスが必要です。」
    という意味になります。

    共有メンバーはインスタンスではなく、クラスに属しているとも言えます。また、非共有メンバーはインスタンスに属しているとも言えます。したがって、共有メンバーのことをクラスメンバー、非共有メンバーのことをインスタンスメンバーと言うこともあります。それを踏まえられると、Keiichi Oumiさんが書かれている以下の内容で、なぜ共有メンバがインスタンス名.メンバ名の形でも使用できるのだろう?と、疑問を持たれるのではないかと思います。

    >共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
    >非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    上記は、本来は、

    >共有メンバ : クラス名.メンバ名の形でのみ使用できる。。
    >非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。

    で充分です。確かにVBでは共有メンバーをインスタンス名.メンバ名の形でも書けますが、ワーニングが出ます。ちなみにC#では、共有メンバーはクラス名.メンバ名の形でしか書くことができません。
    よってVBでも、特別な事情がない限り、共有メンバーはクラス名.メンバ名の形で書かれることをお勧めします。

    また、参考までに書きますが、VB初学者の方がよく混乱されるのが、既定のインスタンス(暗黙のインスタンス)です。フォームクラスは(Formクラスを継承したForm1など)、本来はnewしてインスタンスを作成しなければ使用できませんが、非共有メソッドであるShowメソッドが共有メンバのように、いきなり、
    Form1.Show()
    と書くだけで動作してしまいます。なぜ動作するかというと、Form1のインスタンスが裏で自動的に作成されるからです。

    (参考)
    「Visual Basic 2005 の My 機能の検証」における、「My.Forms」の部分
    http://msdn.microsoft.com/ja-jp/library/ms379610(v=vs.80).aspx

    VBは融通が利く分、オブジェクト指向を学習する上で混乱しやすい面も持っていると思いますので、その辺りを注意されると良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 山本春海 2012年6月5日 8:53
    2012年5月25日 1:54
    モデレータ
  • DatabaseのAccessを参照する構文です。

    Private Sub cboGengo_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboGengo.SelectedIndexChanged

    txtGengo = cboGengo.Text

    Dim rowFound As DataRow = 歴史DataSet.元号.元号(txtGengo)

    最後の行の「歴史DataSet.元号」に波アンダーラインがついて、タイトルのエラーが出ます。

    意味がよくわかりません。初心者にわかるような回答をお願いいたします。

     解説は、他の方々がされているので、他のことを。

     自分が説明することをサボるために「初心者」という言葉を使わないでください。何がわからないのか、この場合、「非共有メンバー」や「オブジェクト参照」という言葉の意味がわからないのなら、それらがわからないということをはっきりと書いてください。それが、『初心者にわかるような回答』を得るために必要な情報です。プログラミングの初心者かもしれません。しかし、質問することの初心者ではないでしょう?


    Jitta@わんくま同盟



    • 編集済み Jitta 2012年5月27日 10:51
    2012年5月27日 10:50
  • こんにちは。

    お~、勉強なりました(^^)

    共有メンバで検索すると、http://msdn.microsoft.com/ja-jp/library/cc436998%28v=vs.71%29.aspx にもちゃんと説明がありましたねー(^^;

    2012年5月28日 4:46
  • 回答ありがとうございます。

    試してみました。波線は消えました。

    当初の疑問はなくなりました。

    しかし、走らすとまた別のエラーに引っ掛かりました。

    よく研究してから、また質問します。

    ありがとうございました。

    2012年6月1日 6:57
  • 回答ありがとうございます。

    やってみたら、波線は消えました。

    しかし、別の問題が出てきました。

    いましているプログラムの問題部分を取り出して、試験用のプログラムで研究してみたいと思います。

    ありがとうございました。

    2012年6月1日 7:02
  • くわしい解説をありがとうございます。

    今回のエラーは一応解消しましたが、別の問題が出てきました。それと回答をそのまま鵜呑みにしているだけで、どうもクラスなどの概念がわかってないようです。

    もう少し研究してみます。

    ありがとうございました。

    2012年6月1日 7:05
  • ご指摘ありがとうございます。

    初心者というのは、何を質問しているのかもはっきり分かっていないものです。おっしゃるとおり、本質をついた質問ができればいいですが、それができればもはや初心者ではないのかもわかりません。

    私は、大昔、インタプリタBASICでプログラムを趣味としていた年代です。それだけしか知識がないので、クラス、オブジェクト、メンバなどの概念が理解できてないようです。勉強します。

    ありがとうございました。

    2012年6月1日 7:18