とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Shared になにを思ふ? その2。

<Attention>
   このエントリは途中経過です。
</Attention>

Shared になにを思ふ?のコメント欄にて、いろいろ教えていただきました。

さて、コメント欄での null さんの

クラスもオブジェクトであり、メタクラスのインスタンスなのだと考えてみてはどうでしょう?

じゃんぬねっとさん

共有 (静的) メンバ == 型自身で実体を持つメンバ。

の「メタクラスのインスタンス」、「型自身で実体を持つ」という表現がおおむね同じものを指すと思っています。(間違ってたらご指摘お願いします。)その'何か'が .NET の世界のどこにどうあって、どういう立場のものなのか・・・ちょっと旅に出たほうがよさそうですね。orz

さらには、シャノンさんに、Directory クラスの CreateDirectory メソッドを挙げていただいておりまして、自分でもなんかそれっぽいものは・・・と、つらつら探してみますと、意に反して「共有メンバでいいような気がする」ものがありました。

System.Math クラスメンバ

です。

MSDN:Math クラス(http://msdn2.microsoft.com/ja-jp/library/system.math(VS.80).aspx)

MSDN:Math メンバ(http://msdn2.microsoft.com/ja-jp/library/system.math_members(VS.80).aspx)

Math というものをイメージすると、メンバにあるような振る舞いやデータがすんなりと伝わってくるです。そして、Math クラスのインスタンス、と言われると逆に首をかしげてしまう・・・。(不変的なもののインスタンスがしっくりこない感じ?・・・ちがうか。)


わ~い。迷子だ~迷子だ~♪

とっちゃんさんのコメントのとおり、メソッドとフィールド(おそらくReadonlyでないフィールドを指している。)を分けて考えないとグダグダになりそう・・・です。(もうなってるよ!

投稿日時 : 2007年4月9日 11:46

Feedback

# re: Shared になにを思ふ? その2。 2007/04/09 12:35 シャノン

ええ。Math は問題児です。
C# の言語仕様が、どのクラスにも属さないメソッドを許容しないために、とりあえず Math クラスに入れとけ、という気がします(別に FCL が C# に縛られるわけじゃないですが…VBのモジュールのような仕組みにはしたくなかったんでしょうね。モジュールのない言語から使えないから?)

C# では、クラスもメソッドもローカルスコープも、{} で囲まれたブロックはすべて「名前空間」としても機能します(囲んでいる {} が違えば、同名のメンバが存在できるという意味で)。
その点、Math クラスは「名前空間としてしか機能していない」クラスだと言えます。
# 個人的には、C# 2.0 から導入された static クラスにはすべて、同じ問題があると思っています。

# re: Shared になにを思ふ? その2。 2007/04/09 12:39 シャノン

> C# の言語仕様が、どのクラスにも属さないメソッドを許容しないために、

モジュールも内部では「モジュールクラス」なんでしたっけ?
VB知らないからよくわかんないや…
「.NET Framework が、名前空間に直接属するメソッドを許容しないために…」の方がいいですかね?
教えて偉い人。

# re: Shared になにを思ふ? その2。 2007/04/09 12:43 シャノン

あー
コメントの用語がつい全部 C# に…ごめんぽ。

# re: Shared になにを思ふ? その2。 2007/04/09 13:11 とっちゃん

Math クラスをクラスとして見るのではなく、ネームスペースとして見てみてください(省略できませんがw)。

そして、static フィールドはグローバル変数、static メソッドはグローバル関数として見てみてください。

この視点がもてる(C/C++ 屋なら持てるんですがねw<万人向けではないwww)なら、このさきハマることはないですよw

static フィールドには、
「クラス内で共有する(ひとつだけあればよい)変数」という意味と、「クラスというネームスペースが割り当てられているグローバル変数」という二つの意味があるという点があると言うことを書いておくべきだったかなw

# re: Shared になにを思ふ? その2。 2007/04/09 13:12 とっちゃん

って、飯食ってる間にシャノンさんが同じこと書いてるしww

# re: Shared になにを思ふ? その2。 2007/04/09 13:29 シャノン

> って、飯食ってる間にシャノンさんが同じこと書いてるしww

フフフw

ただ、グローバル変数としての解釈を認めるならば、そもそも、どうしてグローバル変数を素直に許容しなかったのかと思いますね(読み取り専用グローバル変数ならいいじゃん、とか)。

#…ツンデレか? ツンデレなのか?
#あ、あんたになんかグローバル変数を直接見せてあげないんだから!
#(実質的には同じだけど)staticクラスを通して見てよね!
#…
#…萌え?

# re: Shared になにを思ふ? その2。 2007/04/09 13:57 じゃんぬねっと

> モジュールも内部では「モジュールクラス」なんでしたっけ?
> VB知らないからよくわかんないや…
モジュールは、"StandardModule 属性を持つクラス" なので、合っていますよ。

私は別に Math でいいじゃないかと思いますけどw

> 「メタクラスのインスタンス」、「型自身で実体を持つ」
"タイプメソッド" と言った方がわかりやすいですか?
静的コンストラクタは、"タイプ イニシャライザ" と考えれますからね。

# re: Shared になにを思ふ? その2。 2007/04/09 14:01 ぽぴ王子

Math クラスと言うと、シャノンさんが惜しまれつつ来られなかった、わんくま勉強会でのオブジェクト指向セッションを思い出してしまうのです。
あのときも「Math クラスは鬼っ子」という話で盛り上がったような。
個人的には「まぁそういうもんだろう」という認識でいて、たぶん最初から名前空間的な意識でしかなかったから、逆に混乱しなかったのだと思います。

あとは C++ は未経験だけど C はバリバリの人だったから、というのもあるのかも。
だから Shared って言葉に、なんか違和感を感じます。

> この視点がもてる

「あれじゃよ、C/C++ 屋が書く一見複雑なコードでナオンもイチコロなんじゃよー」
「いいからトンカツ食え」
と、とあるマンガを思い出したのは僕だけでいいと思います。
# 今日のお昼はトンカツでした。

# re: Shared になにを思ふ? その2。 2007/04/09 16:47 とりこびと

コメントありがとうございます。

# 個人的には、ゆくゆくはモジュールの話も展開されるであろうと思っていましたが、「なるほど~。」ですねぇ。

>>シャノンさん

>C# の言語仕様が、どのクラスにも属さないメソッドを許容しない

なるほど~。宙ぶらりんなメンバじゃダメだからどっかに入れといてあげないといけない、という決まりにしたから・・・と。

>C# では、クラスもメソッドもローカルスコープも、{} で囲まれたブロックはすべて「名前空間」としても機能します(囲んでいる {} が違えば、同名のメンバが存在できるという意味で)。

そういった考え方があるんですね。・・・いわれてみればそうですね、そんな気がしてきました。(洗脳?w)

# 「だってクラスぢゃん!」なんてダダこねてたら、いつまでたってもはじまりませんか、そうですか。orz

>ツンデレか?

このツンデレはなんかヤですwデレ感が足りないしw



>>とっちゃんさん

>この視点がもてる(C/C++ 屋なら持てるんですがねw<万人向けではないwww)なら、このさきハマることはないですよw

επιστημηさんのブログやらでC++のコードを拝見していて、どこからともなくやってきたような'ふんいき'のメソッドがあるなぁって気はしていました。
そんな感じの部分でしょうか。やっぱりやっとくかな・・・C++。



>>じゃんぬねっとさん

>"タイプメソッド" と言った方がわかりやすいですか?
>静的コンストラクタは、"タイプ イニシャライザ" と考えれますからね。

あ~!なんとなくイメージできます。
ただ、静的なのに実体があるってのが、頭では分かっていても体ではしっくりこないんですが。orz
実際に、どっかにこの実体が(インスタンスっぽく)いるっていうお話でしょうか?・・・って自分で調べてからですね。m(_ _)m



>>ぽぴ王子さん

>あとは C++ は未経験だけど C はバリバリの人だったから、というのもあるのかも。
>だから Shared って言葉に、なんか違和感を感じます。

私のようなひよっこでは、ひとたび迷うともうメガネメガネですよ。orz

># 今日のお昼はトンカツでした。

いーなーいーなー。

# re: Shared になにを思ふ? その2。 2007/04/09 18:31 シャノン

> このツンデレはなんかヤですwデレ感が足りないしw

いやいや。
こう「口では直接見せないと言いつつ、実は許しているのと同じこと」というあたりに、かすかなデレというかエロティシズムというか…
#とりこびとさんは Nyantora MVP for エログに決定だっ!

> この視点がもてる(C/C++ 屋なら持てるんですがね

「グローバル変数というものが存在する」という視点は持てますが(VBer なら Math クラスではなく Math モジュールと考えれば、自然にこの視点が持てると思う)、「インスタンスがないクラス」という視点を持つのには抵抗があります。

> 実際に、どっかにこの実体が(インスタンスっぽく)いるっていうお話でしょうか?

CLR 的にどう処理されているかは知りませんが、考え方として「メタクラスのインスタンス」を考えることは可能です。
例えば、System.Type なんかどうでしょうね。
妄想の域を出ませんが、実は typeof( Hoge ) で取得できるのは、System.Type ではなくて Type のサブクラスだとすると…(頑張って慣れない VB で書いてみる)

Publlic Class Hoge
 Public Shared i As Integer
End Class

' HogeType は Type のサブクラスとする
' このコードはコンパイル通りません
Dim ht As HogeType = GetType( Hoge )
ht.i = 0;

Hoge の Shared 変数 i は、実は HogeType のインスタンス変数なのです!とか。

…繰り返しますが、あくまで妄想ですよ。

# re: Shared になにを思ふ? その2。 2007/04/09 18:41 シャノン

> Dim ht As HogeType = GetType( Hoge )
Dim ht As HogeType = DirectCast( GetType( Hoge ), HogeType )

のほうがいいかな。

# re: Shared になにを思ふ? その2。 2007/04/10 9:24 とりこびと

シャノンさん、コメントありがとうございます。

>#とりこびとさんは Nyantora MVP for エログに決定だっ!

ちょwww私自身がそんなにエロティシズムを印象付ける発言してないからー!www

>「グローバル変数というものが存在する」という視点は持てますが(VBer なら Math クラスではなく Math モジュールと考えれば、自然にこの視点が持てると思う)、「インスタンスがないクラス」という視点を持つのには抵抗があります。

そうですね。ちょっと本題からずれてきている感がしていたんですが、疑問点は「インスタンスがないクラス」と「(私の知っているオブジェクト指向における)インスタンスを意識する」という事柄がかみ合わないことです。

# やわらか頭ほすぃ・・・

>頑張って慣れない VB で書いてみる

Publlic な感じがちょっと舌っ足らずでなんとも萌・・・

# re: Shared になにを思ふ? その2。 2007/04/10 9:26 シャノン

> Publlic な感じがちょっと舌っ足らずでなんとも萌・・・

ぱぶりりっく…
ま、間違えたんじゃないんだからね!
これが VB10 からの書き方なんだから!(嘘

# ボンジュール♪ モジュール♪ 2007/04/10 15:34 とりこびと ぶろぐ。

ボンジュール♪ モジュール♪

タイトル
名前
Url
コメント