- PR -

コンストラクタとShared

投稿者投稿内容
にゃご
会議室デビュー日: 2006/06/17
投稿数: 10
投稿日時: 2006-06-17 13:18
はじめて投稿させていただきます。
VB.NET2003/2005 を使用して開発を行っています。”オブジェクト指向”を勉強しながら、みようみまねでコードを書いていたのですが、以下のようなことはできるのでしょうか?

 ・コンストラクタで一度だけ値を設定し、あとは読み取り専用の共有プロパティとして利用する。

↑のクラスの入ったDLLを他のプロジェクト(複数ある)から参照させて使えれば・・・と思ったのですが・・・。参考になる情報などあればお教えください。よろしくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-17 13:34
外からみて、読み取り専用という意味なら
コンストラクタので値を設定して、
プロパティは ReadOnly で公開すれば同じようになるかな

# あれ、こういうことじゃない?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-17 13:58
引用:

かるあさんの書き込み (2006-06-17 13:34) より:

外からみて、読み取り専用という意味ならコンストラクタので値を設定して、
プロパティは ReadOnly で公開すれば同じようになるかな


Shared メンバ相手に通常のコンストラクタはまずいですよね。
正しくは、タイプ イニシャライザ ではないでしょうか。

ただ、そもそも '共有メンバ' 相手に 'プロパティ' というのは不自然な話です。
インスタンスの財産ではありませんから、読み取り専用のフィールド メンバにすべきです。

この場合、タイプ イニシャライザを使う必要はなく、

コード:

    Public Shared ReadOnly MakiMakiLove As String = "MosaMosaAA"


としておけば、beforefieldinit メタ属性 が適用され、初期化が約束されることになっています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-17 14:15
引用:

じゃんぬねっとさんの書き込み (2006-06-17 13:58) より:

Shared メンバ相手に通常のコンストラクタはまずいですよね。
正しくは、タイプ イニシャライザ ではないでしょうか。



あっ共有プロパティなんですねそうすると確かに
普通のコンストラクタでは設定できませんね

ASP.NETなんかだったら、Session_Startで設定した
Session変数なんかから読み出すんですけれどね
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-06-17 18:35
引用:

じゃんぬねっとさんの書き込み (2006-06-17 13:58) より:
Shared メンバ相手に通常のコンストラクタはまずいですよね。
正しくは、タイプ イニシャライザ ではないでしょうか。


CLR的?にはタイプイニシャライザでしょうけど、
C#とかでは静的コンストラクタって言うんじゃないですかね?
※まあ確かに単にコンストラクタって書くと明らかに紛らわしいですけどね。

引用:

ただ、そもそも '共有メンバ' 相手に 'プロパティ' というのは不自然な話です。
インスタンスの財産ではありませんから、読み取り専用のフィールド メンバにすべきです。


静的なプロパティってそんなに不自然ですかね?
今回のような初期化後は不変の値ならもちろん静的フィールドでもいいんですが。

静的なプロパティではなくインスタンスのプロパティの意味で書いてるのかとも
思ったんですが、フィールドメンバの方も別に「静的な」フィールドとは言及されて無いので、
単にプロパティとフィールドの違いで不自然といっているように思えるので…

引用:

この場合、タイプ イニシャライザを使う必要はなく、
コード:


Public Shared ReadOnly MakiMakiLove As String = "MosaMosaAA"


としておけば、beforefieldinit メタ属性 が適用され、初期化が約束されることになっています。


これどういう意味でしょう?
少なくともそのメンバを使用した時点で、beforefieldinitのあるなしは初期化が
約束されるかどうかとは関係ない気がしますが…

--ちょっと追記


[ メッセージ編集済み 編集者: なちゃ 編集日時 2006-06-17 18:42 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-17 19:32
引用:

なちゃさんの書き込み (2006-06-17 18:35) より:

CLR的?にはタイプイニシャライザでしょうけど、
C#とかでは静的コンストラクタって言うんじゃないですかね?
※まあ確かに単にコンストラクタって書くと明らかに紛らわしいですけどね。


「静的コンストラクタではなく、タイプ イニシャライザ でしょ?」 という意味ではないです。
私が言いたかったのは、「コンストラクタ、ではない」 ということです。

# かるあさんも後の投稿で 「普通のコンストラクタ」 という言葉が出ていますね。

「広義では、'静的コンストラクタ' も 'コンストラクタ' だろう」という意味なのでしょうけど、
こういうところでは、"静的" コンストラクタと書いた方が良いと思います。

「静的コンストラクタ」 という言葉を使わなかったのは、私の趣味です。
昔は使っていましたけど、最近は、あまり使わないようにしています。

# どちらの意味でご指摘されたのか不安だったので、2 通り書いてみました。

引用:

静的なプロパティではなくインスタンスのプロパティの意味で書いてるのかとも
思ったんですが、フィールドメンバの方も別に「静的な」フィールドとは言及されて無いので、
単にプロパティとフィールドの違いで不自然といっているように思えるので…


すみません、これは私の書き方が悪かったですね。
これこそ趣味の問題もあると思うので、

引用:

今回のような初期化後は不変の値ならもちろん静的フィールドでもいいんですが。


くらいの書き方が適切でした。
私の書き方は、明らかに不適切でした。(;_ _)

引用:

少なくともそのメンバを使用した時点で、beforefieldinitのあるなしは初期化が約束されるかどうかとは関係ない気がしますが…


はい、関係ないですね。(;^-^)

さらに言うと、この説明のまま逆を考えてみると...
タイプ イニシャライザを用意した時点で、beforefieldinit 属性がつかなくなりますから、
タイプ イニシャライザを用意したら、'絶対に' 初期化されないかのように読めてしまいますね。

明らかにおかしい書き方です。(;~_~)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
にゃご
会議室デビュー日: 2006/06/17
投稿数: 10
投稿日時: 2006-06-18 17:34
すみません。教えていただいているのに、知識不足なせいか途中から理解できません><。
やりたいことのイメージは、2つめでかるあ様がおっしゃっていることがズバリです。(あ、ちなみにWindowsプログラムです。ASP.netではありません(^^
で、こちらに投稿する前にためしたダメダメなコードが、下記のとおりです。

------------------------------------------
Public Class Test
Private Shared m_id As Long
Private Shared m_name As String

Public Sub New(ByVal userId As Long, ByVal userName As String)
m_id = userId
m_name = userName
End Sub

Public Shared ReadOnly Property UserId() As Long
    '読み取り専用なので、Setはなし
Get
Return m_id
End Get
End Property

Public Shared ReadOnly Property UserName() As String
    '読み取り専用なので、Setはなし
Get
Return m_name
End Get
End Property
End Class
------------------------------------------
↑書いたはいいけど、使えなかった・・・。

 >>そもそも '共有メンバ' 相手に 'プロパティ' というのは不自然な話です

そうか、不自然な話しだったのか・・・(..; ←そこからして、わかってない・・・
じゃんぬねっと様から教えていただいたのをもとに、

Public Class Test2
Public Shared ReadOnly UserId As String = "12345"
End Class

と書いてみたのですが、確かにこれだときちんと参照できますが、”12345”の箇所は利用者に設定してもらいたいのです・・・。ReadOnlyだから、無理っぽいような。
「普通のコンストラクタ」「静的コンストラクタ」「タイプイニシャラザ」というあたりから、理解が怪しくなってます。上記のようなことを可能にするには、どういった手段が適当なのでしょうか?
 お手数ですが、お教えいただければ幸いです...(;_;)
 よろしくお願いいたします。(_._)

[ メッセージ編集済み 編集者: にゃご 編集日時 2006-06-18 17:36 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-18 17:43
コード:
Private Shared m_id As Long 
Private Shared m_name As String 


Shared にする必要はありますか?
Shared にしないで、普通に読み取り専用ならば簡単だと思いますよ。
「ID」や「名前」といったものは共有でないないと思うのですが…。(まぁ一概には言えませんが)


_________________
囚人のジレンマな日々

スキルアップ/キャリアアップ(JOB@IT)