トップ回答者
非共有メンバーを参照するには、オブジェクト参照が必要です。

質問
-
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.元号」に波アンダーラインがついて、タイトルのエラーが出ます。
意味がよくわかりません。初心者にわかるような回答をお願いいたします。
回答
-
共有メンバーはアプリケーション全体で共有されるメンバーです。アプリケーションに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).aspxVBは融通が利く分、オブジェクト指向を学習する上で混乱しやすい面も持っていると思いますので、その辺りを注意されると良いと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 山本春海 2012年6月5日 8:53
-
初めまして。歴史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
-
こんにちは。
簡単に説明だけしますと、
共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。
つまり、dim hoge as new class のように、どこかで誰かに、new され、実態(インスタンス)が作成されていなければ利用できないものが、非共有メンバであるという理解だと思います。
通常、Class(DatasetなどもClassです)は、そのままでは実態が無いため、実態のないClass(型)のメンバへアクセスする場合には、
>dim 歴史DataSet as new 歴史DataSet
のように、new して実態を作らなければ、そのメンバ型へのアクセス時に問題のエラーとなるって事だと思います。
対して、もし直接歴史DataSet を参照した場合は、NullExceptionが実行時に発生するんだったと思います。
(間違い補足などありましたら、、訂正お願いします。)- 回答としてマーク 山本春海 2012年6月5日 8:53
すべての返信
-
初めまして。歴史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
-
こんにちは。
簡単に説明だけしますと、
共有メンバ : クラス名.メンバ名の形で使用できる。インスタンス名.メンバ名の形でも使用できる。
非共有メンバ : インスタンス名.メンバ名の形でのみ使用できる。
つまり、dim hoge as new class のように、どこかで誰かに、new され、実態(インスタンス)が作成されていなければ利用できないものが、非共有メンバであるという理解だと思います。
通常、Class(DatasetなどもClassです)は、そのままでは実態が無いため、実態のないClass(型)のメンバへアクセスする場合には、
>dim 歴史DataSet as new 歴史DataSet
のように、new して実態を作らなければ、そのメンバ型へのアクセス時に問題のエラーとなるって事だと思います。
対して、もし直接歴史DataSet を参照した場合は、NullExceptionが実行時に発生するんだったと思います。
(間違い補足などありましたら、、訂正お願いします。)- 回答としてマーク 山本春海 2012年6月5日 8:53
-
共有メンバーはアプリケーション全体で共有されるメンバーです。アプリケーションに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).aspxVBは融通が利く分、オブジェクト指向を学習する上で混乱しやすい面も持っていると思いますので、その辺りを注意されると良いと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 山本春海 2012年6月5日 8:53
-
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
-
こんにちは。
お~、勉強なりました(^^)
共有メンバで検索すると、http://msdn.microsoft.com/ja-jp/library/cc436998%28v=vs.71%29.aspx にもちゃんと説明がありましたねー(^^;
- 編集済み Keiichi Oumi 2012年5月28日 4:48