2009-05-08 5 views
13

C#では、VB.Netのようなメソッドに静的変数を入れる方法はありますか?C#の静的変数

Static myCollection As Collection 

答えて

20

なぜC#は静的メソッド 変数をサポートしていませんか?

Q:C++では、それは 静的メソッド変数を書き込み、そして唯一の方法内側から にアクセスすることができる 変数を持つことが可能です。 C#は ではありません。どうして?

A:C#にはこの機能がありません には2つの理由があります。

まず、 クラスレベルの静的有することにより、ほぼ 同様の効果を得ることが可能であり、方法 静を加えること増加 複雑さを必要とするであろう。

第二に、メソッドレベルの静的コードは、繰り返しまたは複数のスレッドから 呼ば 及び定義は 方法であるので、それは 定義を見つけることが難しくなっているとき 問題を引き起こすため 幾分有名です。

- いいえ、そこmsdn c# faq

+3

> "コードが繰り返し呼び出されたり複数のスレッドから呼び出されたときに問題を引き起こすことで有名です" - VB.Netの実装はスレッドセーフであると考えられているので面白いです。 –

+11

スレッドセーフで、あなたが期待していることは2つの異なることです... –

+2

これは最良の答えとしてどのようにチェックされましたか?答えは単にNOです。それは言われていますが、それでもなおいいです。 Eric Gunnersonの引用であるここで提供された回答は、Mircosoftの対処法です。それは簡単なことです。 私が覚えている限り、少なくとも1.2とC++のため、Javaにはこの機能がありました。 C++、Java、およびVBを混在させた言語は、3つすべてが共通していたことをサポートすると思います。もし3つの言語がこれをサポートしているのなら、正当な理由があるに違いない。その2つの理由でそれを落とすのは不自由だし、明らかに何かを隠している。 –

3

VB.NETのStaticに最も近いのは、現在のタイプのフィールドを作成することです。それ以外のC#には同等のものはありません。

1

いいえ、CLRはこれをサポートしていません。また、VB.NETはこれを許可するためのコンパイラトリックを採用しています。ああ。

+3

コンパイラの習慣が嫌いなら、C#で "yield"キーワードを使用しますか? –

+0

どのようにコンパイラのトリックですか?それは、起こりやすい視界を持っている単なるメンバー変数です。 –

+0

私は決して利回りを使いません。 – rotard

4

はありませんが、どのように、これはその後、クラスレベルで静的変数を有する異なるのですか?

Actually if you look共有の実装方法については、クラスに静的フィールドを作成するコンパイラのトリックです。

+1

ええ、それはクラスレベルで1つを持つこととまったく同じです。レガシーVBの静的キーワードは、関数/サブリターンの後もローカルの値が保持されるため、メソッドレベルでのみ宣言することができます。 – x0n

+0

VBの "コンパイラトリック"は、モニタクラスを使ってスレッドセーフであることを保証し、スコープをメソッドに限定して他の場所へのアクセスが失敗するようにする(より良いセマンティクス)ので、違います。 –

+0

変数に名前を付けるためにメソッド名が使用されるため、唯一のスコープです。そして、もしあなたがCでスレッドセーフをしたいのであれば、あなたはモニターを実装するでしょう。私はむしろ、VBで行うように変数へのアクセスをラップする静的なスレッドセーフを実装していますが、メソッドのスコープを心配する必要はありません。 VB6の – JoshBerke

-5

私はC#の同等のconstあるかなり確信している:それゆえ:

 
public const Collection myCollection = new Collection(); 

私はVB.NETとあまりにも慣れていないので、私は基本オフかもしれないが、それはあなたが変数を設定できるようになります変更することはできません。

+1

静的変数は一定ではありません。静的変数は、クラスの各インスタンスが同じ変数インスタンスを共有するものです。変数は変更可能であり、あるクラスの値を変更すると、そのクラスの他のすべてのインスタンスの値が変更されます。 – NerdFury

+0

わずかな補正。 C#の静的変数は共有されています。 VBでは、静的変数は、包含する関数が共有されている場合にのみ共有されます。 –