2017-05-03 6 views
-6

タイトルに記載されているようなアスペクトを持つコードがあります。宣言前に使用されたが使用後に宣言された変数

public string ReplaceCC(Match m)// Replace each Regex cc match with the number of the occurrence. 
{ 
    i++;//it's used in function before declaration 
    return i.ToString() + i.ToString();  
} 

public static int i=0; 
} 

ここに問題がありますか?私はコンパイル/宣言の混乱があると思いますか?

+0

これはあなたの問題が何であるかを理解しようとすることに非常にうっすらではありません。質問を編集して、あなたが持っている問題に関連するすべての関連コードを投稿し、さらに説明を編集してください。 'ReplaceCC()'を呼び出す? – MethodMan

+1

変数は静的です。これは、それが使用される前に作成されることを意味します。 https://msdn.microsoft.com/en-us/library/79b3xss3.aspx – Steve

+1

@Steveインスタンス変数であっても、コードはコンパイルされます(ただし、動作は異なります)。 – Servy

答えて

0

を確認してくださいは、あなたを当惑されることは、それが宣言されたコードの順です。コードの下を見てください:上記のコードのように

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インスタンス(別名スタティックインスタンス)に関連付けられています。

  1. インスタンスコンストラクタが呼び出されます:あなたがここにあなたのReplaceCCメソッドを呼び出すことができるように最初の時間のためにあなたのクラスを初期化するたびに

    だから一連のイベントです。

  2. 静的コンストラクタが呼び出されます - 静的なi変数を初期化します。
  3. 次に、インスタンス化されて初期化されたときに、オブジェクトインスタンスに対してReplaceCCメソッドを呼び出します。

また、thisの回答を見ると、私の考えは秒です。

0

あなたは、静的クラス変数として、関数のスコープ外の変数を宣言している:

public static int i=0; 

変数は静的インスタンスが作成されたとき、それを使用しようと最初に初期化されます。

0

変数はスコープ外に宣言します。これはグローバル変数です。例えば

public class Person 
{ 
    public Person(string name) 
    { 
     this.Name = name; 
    } 

    public string Name { get; set; } 
} 

このコードは、人のルートに変数名を宣言します。

-2
public string ReplaceCC(Match m) 
{ 
    i++;//Here your adding 1 to the existing value 
    return i.ToString() + i.ToString();  
} 

public static int i=0;//Here u declared and applied value, this is declared when your class get instanciated 

コメント私が知覚できる限り多くの

+0

**レビューキューから**:あなたの答えの周りにいくつかの文脈を追加してください。コードのみの回答は理解しにくいです。あなたの投稿にさらに情報を追加することができれば、これはAskerと将来の読者に役立ちます。 – RBT

関連する問題