C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 共有メンバと非共有メンバ


(過去ログ 76 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44768 / inTopicNo.1)  共有メンバと非共有メンバ
  
□投稿者/ YT (1回)-(2009/12/17(Thu) 15:02:08)

分類:[VB.NET/VB2005 以降] 

こんにちは。

最近VB.NETの勉強を始めました。
さっそくなのですが共有メンバと非共有メンバで行き詰っております。

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

という違いまでは理解できました。

さらにクラスを作成する際、Sharedキーワードを使用すると共有メンバとして
作成可能だと学習しました。

そこで、
クラスでSharedキーワードを使用せず、呼び出し元はインスタンスを作成してクラスにアクセスする。
クラスでSharedキーワードを使用して、呼び出し元は直接クラスにアクセスする。

この違いにより、どのような利点が生じるのか?
また、どのようなケースで使い分けるべきなのでしょうか?
それとも大きな違いはないのでしょうか?

よろしくお願いいたします。


引用返信 編集キー/
■44776 / inTopicNo.2)  Re[1]: 共有メンバと非共有メンバ
□投稿者/ επιστημη (2320回)-(2009/12/17(Thu) 17:23:46)
επιστημη さんの Web サイト
2009/12/17(Thu) 17:34:10 編集(投稿者)

> クラスでSharedキーワードを使用せず、呼び出し元はインスタンスを作成してクラスにアクセスする。
> クラスでSharedキーワードを使用して、呼び出し元は直接クラスにアクセスする。

自明ですね。
その値や挙動がインスタンスごとに異なるなら非共有、
(インスタンスではなく)クラスに属するなら共有です。

たとえば DateTime.Now、現在時刻がDateTimeのインスタンスごとに異なるわきゃねーから共有プロパティです。
あるいは Math.PI、円周率は全宇宙的に普遍なので共有(クラス定数)。
方や Button.Text、ボタンの絵柄がどれもおんなじじゃシャレならんです。だから非共有。

なので使い分けもなにも、半ば必然的に決まっちゃうですよ。

引用返信 編集キー/
■44819 / inTopicNo.3)  Re[2]: 共有メンバと非共有メンバ
□投稿者/ YT (2回)-(2009/12/18(Fri) 15:04:40)
どうもありがとうございます。

オブジェクト指向についてまだ修行が足りず、申し訳ありません。
いま、私が手掛けているプログラムの具体例で質問したいと思います。


呼び出し元から、パスを引数として受け取り、テキストファイルが存在しているか
どうかを確認するプロシージャーがあります。
ほかにも書き込み、読み取りなどを行うプロシージャーをTxtFileIOクラスにまとめ
ています。

このクラスにSharedキーワードをつければ、直接アクセスできます。
しかし、 Sharedキーワードをつけなくても、インスタンスを作成すればアクセス可能です。

私には、「どちらにしてもアクセスできるから、Sharedキーワードの意味がないのではないか?」
と思ってしまうのです。

的外れな質問かもしれませんが、もしお付き合い可能であれば、回答よろしくお願いします。

引用返信 編集キー/
■44820 / inTopicNo.4)  Re[3]: 共有メンバと非共有メンバ
□投稿者/ aetos (208回)-(2009/12/18(Fri) 15:16:18)
No44819 (YT さん) に返信
> このクラスにSharedキーワードをつければ、直接アクセスできます。
> しかし、 Sharedキーワードをつけなくても、インスタンスを作成すればアクセス可能です。
>
> 私には、「どちらにしてもアクセスできるから、Sharedキーワードの意味がないのではないか?」
> と思ってしまうのです。

New しなくても使えるなら、しなくていいことはやりたくないです。面倒ですから。
それに、不要なインスタンスを作ることは、メモリの無駄遣いです。
引用返信 編集キー/
■44823 / inTopicNo.5)  Re[3]: 共有メンバと非共有メンバ
□投稿者/ 魔界の仮面弁士 (1432回)-(2009/12/18(Fri) 15:44:04)
No44819 (YT さん) に返信
> 呼び出し元から、パスを引数として受け取り、テキストファイルが存在しているか
> どうかを確認するプロシージャーがあります。
System.IO.File クラスの Exists 共有メソッドのような物でしょうか。


> 私には、「どちらにしてもアクセスできるから、Sharedキーワードの意味がないのではないか?」
> と思ってしまうのです。
たとえば TxtFileIO クラスに、ファイルの存在を True/False で返す
 Function Exists(filePath As String) As Boolean
というメソッドを実装するとしましょう。


もし、これが Shared で実装されているなら、利用側は
 If TxtFileIO.Exists("C:\foo.txt") Then
  MsgBox("存在している")
 End If
と書くだけで済みます。


しかし、Shared では無い場合には、
 Dim x As TxtFileIO
 x = New TxtFileIO()
 If x.Exists("C:\foo.txt") Then
  MsgBox("ファイルが存在")
 End If
のように、わざわざインスタンスを作成しないと呼び出せません。
このような場合には、Exists メソッドを Shared にした方が楽でしょう。


一方、そのクラスを
 Dim x As TxtFileIO
 x = New TxtFileIO("C:\foo.txt") 'ファイル名をコンストラクタで渡す
 If x.Exists() Then
  MsgBox("ファイルが存在")
 End If
のように使わせる場合は、Shared にはせず、インスタンスメンバとします。
引用返信 編集キー/
■44826 / inTopicNo.6)  Re[3]: 共有メンバと非共有メンバ
□投稿者/ επιστημη (2326回)-(2009/12/18(Fri) 15:53:50)
επιστημη さんの Web サイト
>「どちらにしてもアクセスできるから、Sharedキーワードの意味がないのではないか?」

Sharedの意味がなくなるように実装したのなら、Sharedキーワードの意味はないでしょうね。


引用返信 編集キー/
■44828 / inTopicNo.7)  Re[4]: 共有メンバと非共有メンバ
□投稿者/ YT (3回)-(2009/12/18(Fri) 15:58:47)
どうもありがとうございました。

どのような時にインスタンスを作成するかについては、これから勉強していきたいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -