- - PR -
コンストラクタとShared
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-17 13:18
はじめて投稿させていただきます。
VB.NET2003/2005 を使用して開発を行っています。”オブジェクト指向”を勉強しながら、みようみまねでコードを書いていたのですが、以下のようなことはできるのでしょうか? ・コンストラクタで一度だけ値を設定し、あとは読み取り専用の共有プロパティとして利用する。 ↑のクラスの入ったDLLを他のプロジェクト(複数ある)から参照させて使えれば・・・と思ったのですが・・・。参考になる情報などあればお教えください。よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2006-06-17 13:34
外からみて、読み取り専用という意味なら
コンストラクタので値を設定して、 プロパティは ReadOnly で公開すれば同じようになるかな # あれ、こういうことじゃない? | ||||||||||||||||
|
投稿日時: 2006-06-17 13:58
Shared メンバ相手に通常のコンストラクタはまずいですよね。 正しくは、タイプ イニシャライザ ではないでしょうか。 ただ、そもそも '共有メンバ' 相手に 'プロパティ' というのは不自然な話です。 インスタンスの財産ではありませんから、読み取り専用のフィールド メンバにすべきです。 この場合、タイプ イニシャライザを使う必要はなく、
としておけば、beforefieldinit メタ属性 が適用され、初期化が約束されることになっています。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-06-17 14:15
あっ共有プロパティなんですねそうすると確かに 普通のコンストラクタでは設定できませんね ASP.NETなんかだったら、Session_Startで設定した Session変数なんかから読み出すんですけれどね | ||||||||||||||||
|
投稿日時: 2006-06-17 18:35
CLR的?にはタイプイニシャライザでしょうけど、 C#とかでは静的コンストラクタって言うんじゃないですかね? ※まあ確かに単にコンストラクタって書くと明らかに紛らわしいですけどね。
静的なプロパティってそんなに不自然ですかね? 今回のような初期化後は不変の値ならもちろん静的フィールドでもいいんですが。 静的なプロパティではなくインスタンスのプロパティの意味で書いてるのかとも 思ったんですが、フィールドメンバの方も別に「静的な」フィールドとは言及されて無いので、 単にプロパティとフィールドの違いで不自然といっているように思えるので…
これどういう意味でしょう? 少なくともそのメンバを使用した時点で、beforefieldinitのあるなしは初期化が 約束されるかどうかとは関係ない気がしますが… --ちょっと追記 [ メッセージ編集済み 編集者: なちゃ 編集日時 2006-06-17 18:42 ] | ||||||||||||||||
|
投稿日時: 2006-06-17 19:32
「静的コンストラクタではなく、タイプ イニシャライザ でしょ?」 という意味ではないです。 私が言いたかったのは、「コンストラクタ、ではない」 ということです。 # かるあさんも後の投稿で 「普通のコンストラクタ」 という言葉が出ていますね。 「広義では、'静的コンストラクタ' も 'コンストラクタ' だろう」という意味なのでしょうけど、 こういうところでは、"静的" コンストラクタと書いた方が良いと思います。 「静的コンストラクタ」 という言葉を使わなかったのは、私の趣味です。 昔は使っていましたけど、最近は、あまり使わないようにしています。 # どちらの意味でご指摘されたのか不安だったので、2 通り書いてみました。
すみません、これは私の書き方が悪かったですね。 これこそ趣味の問題もあると思うので、
くらいの書き方が適切でした。 私の書き方は、明らかに不適切でした。(;_ _)
はい、関係ないですね。(;^-^) さらに言うと、この説明のまま逆を考えてみると... タイプ イニシャライザを用意した時点で、beforefieldinit 属性がつかなくなりますから、 タイプ イニシャライザを用意したら、'絶対に' 初期化されないかのように読めてしまいますね。 明らかにおかしい書き方です。(;~_~) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||
|
投稿日時: 2006-06-18 17:43
Shared にする必要はありますか? Shared にしないで、普通に読み取り専用ならば簡単だと思いますよ。 「ID」や「名前」といったものは共有でないないと思うのですが…。(まぁ一概には言えませんが) _________________ 囚人のジレンマな日々 |
1|2|3
次のページへ»