を確認してくださいは、あなたを当惑されることは、それが宣言されたコードの順です。コードの下を見てください:上記のコードのように
class Program
{
public Program()
{
}
public void myFunc()
{
canIAccessIt = 10;
}
public int canIAccessIt = 0;
}
C言語の背景(Cには存在しないクラス部分を無視する)から、誰もがmyFunc
の関数は、変数canIAccessIt
にアクセスしようとしていることを考えることになるかもしれませんそれが宣言されたり、スコープに入ったりする前であっても。
C#の世界の変数の範囲は、このようには機能しません。クラスレベル変数(別名メンバ変数)は、代わりにオブジェクトのインスタンスに関連付けられ、オブジェクトが作成されてからオブジェクトが破棄されるか、ガベージコレクトされるまでのスコープになります。
myFunc
の方法で宣言されているように、上記の場合と同様に、canIAccessIt
変数が生まれていない可能性があります。 ではなく、です。
私の上記のコードは、C#コンパイラによってコンパイルされた場合、それはC#プロジェクトの構築プロセスの出力である、あなたの* .dllファイル内に記述MSILでこのような何か(マイクロソフト中間言語)は以下のようになる。
class Program
{
public int canIAccessIt;
public Program()
{
canIAccessIt = 0;
}
public void myFunc()
{
canIAccessIt = 10;
}
}
注::上記のMSILコードは、わかりやすいように参考用です。 MSILコードは、ユーザーやプログラマーではなくCLRが理解しなければならないため、これよりも奇妙に見えます。
コンパイラの場合、グローバル変数がクラス内でどこに宣言されているかは関係ありません。あなたのクラスのオープニング({
)と中括弧(}
)の中にある限り、その初期化はあなたのクラスのコンストラクタ内に移動されます。クラスのコンストラクタは、クラスインスタンスを新規に作成するたびに呼び出される最初のメソッドです。それが起こる瞬間、あなたの変数は生き生きして(intantiated and initialized)、範囲内になり、myFunc
メソッドによって使用されます。
クラス内の変数との唯一の違いは静的であるため、その初期化によってクラスのインスタンスコンストラクタではなくクラスの静的コンストラクタが移動されることです。 i
変数のライフタイムとスコープは、クラスのType
インスタンス(別名スタティックインスタンス)に関連付けられています。
- インスタンスコンストラクタが呼び出されます:あなたがここにあなたの
ReplaceCC
メソッドを呼び出すことができるように最初の時間のためにあなたのクラスを初期化するたびに だから一連のイベントです。
- 静的コンストラクタが呼び出されます - 静的な
i
変数を初期化します。
- 次に、インスタンス化されて初期化されたときに、オブジェクトインスタンスに対して
ReplaceCC
メソッドを呼び出します。
また、thisの回答を見ると、私の考えは秒です。
出典
2017-05-03 21:01:33
RBT
これはあなたの問題が何であるかを理解しようとすることに非常にうっすらではありません。質問を編集して、あなたが持っている問題に関連するすべての関連コードを投稿し、さらに説明を編集してください。 'ReplaceCC()'を呼び出す? – MethodMan
変数は静的です。これは、それが使用される前に作成されることを意味します。 https://msdn.microsoft.com/en-us/library/79b3xss3.aspx – Steve
@Steveインスタンス変数であっても、コードはコンパイルされます(ただし、動作は異なります)。 – Servy