2017-01-20 6 views
0

私は本当にC#の新機能です。実行時にローカルで宣言されたフィールドの値を取得できるかどうかを知りたいだけですか?たとえば、以下の例のClassToTestを変更することはできません。実行時にローカルフィールドの値を取得する

例:

public class ClassToTest { 
    public void func() { 
    int number = 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    instance.func(); 
    // Can field "number" value be extracted here? 
    } 
} 

は、私が反射し、他のアセンブリに関連するものが、まだ運を見てきました。どんな提案も高く評価されます。

+1

いいえ、それは不可能であり、そうする理由はありません。 'number'はクラスではなくスコープです。また、コンパイルできるコードを投稿する必要があります。あなたがそれを実行することができるかどうかを確認するためにそれを自分でテストしてください。値を必要とする場合は、メソッドから戻すか、クラス/インスタンススコープのプロパティを作成し、その値を設定します。 – Igor

+0

私はそれを得ることができる最も単純な例を減らしました。もともと私が取り組んでいるプログラムは、これよりずっと大きくて複雑です。また、ClassToTestをリファクタリングすることもできません。 –

+0

非常に簡単です。このメソッドは値を設定しますが、有効範囲外になると(つまり、メソッドの実行が終了すると)変数とその値がスタックからポップされます。その価値を得る方法はありません。また値を取得しようとしないでください、それはちょうど**非常に**悪いプログラミングの練習です。あなたはカプセル化を破るだろう。その値に興味がある場合は、それを知っているインスタンスに設定する方法を見つけるか、それを返すか、それを再計算する新しいメソッドを記述します。 – Igor

答えて

0

これは機能の仕組みではありません。

public class ClassToTest { 
    public int func() { 
    return 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.func(); 
    } 
} 

値を返す関数は、戻り値の型(すなわち、int)を有していなければならない、とリターン(すなわち、25を返す;)、次いでINT番号= instance.func()。 RANは、FUNC()メソッドは25を返し、あなたが関数の内部でありながら、ローカル変数のみが存在する数

+0

申し訳ありません。私はそれを編集しました。ありがとう@Ben –

0

をintに格納します、です。この関数を終了すると、脂っこい煙のパフでローカル変数が消えます。

あなたはプロパティにアクセスするためにリフレクションを使用することができます(パブリックとプライベートの両方を。)

乾杯、

アダムを。

+0

別のスレッドでメソッドを起動し、関数がまだ終了していない間にthread.sleep()を実行するとどうなりますか?それでは、あなたは反射を行うことができますか? @Adam –

+0

こんにちはアンジェロ、私はこれが今、他の投稿で覆われていると信じています。しかし、私はペニーはまだあなたのために落ちていると思う。それはひどく混乱しているように思えるかもしれませんが、それに固執してください - それはすべて意味をなさないでしょう、私は約束します! :-) –

-1

ボディ内で宣言されたものが外側スコープからアクセスできないため、これは不可能です。変数がfunc()メソッド内でのみ使用可能であることを意味します。あなたができることは、必要な価値を返すか、財産を宣言することです。これは次のように仕事ができるプロパティで

public int Func() 
{ 
    return 25; 
} 

public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.func(); 
    //number will be 25 
    } 
} 

public class ClassToTest { 

    public int Number{get{return 25;};private set;} 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.Number; 
    } 
} 

メソッドやプロパティを使用すると、あなたの決断です。しかし、あなたはそれを次のように考えることができます:

"私のオブジェクトは何で構成されていますか"と "私のオブジェクトは何ができますか"。

たとえば、車にはホイールがあります。したがって、プロパティでホイールを表現します。しかし車は移動できるので、方法として移動を実装します。

0

現在のスコープ外の変数にアクセスすることはできません。別の方法でも、別のスイッチケースでも可能です。しかし、これを行うには理由もなくthere's、あなたの代わりにあなたのメソッド内でプロパティを設定することで、同じことを行うことができます。

public class ClassToTest { 
    public int Number { get; private set; } 
    public void func() { 
     this.Number = 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
     ClassToTest instance = new ClassToTest(); 
     instance.func(); 
     var i = instance.Number; 
    } 
} 

私はまた、民間のセッターがすることが可能になるとの組み合わせでプロパティの公開ゲッターを使用Numberの値をからに変更しますが、外部からは変更しないでください。

他人が指摘している別の方法は、funcの値を返すことです。

+0

'public int Numer {get;プライベートセット; } '名前の少しの間違い – nbadaud

+0

@nbadaudありがとう、訂正されました。 – HimBromBeere

+0

私が上記のコメントで言ったように、 "私は例を単純に減らすことができました。私が取り組んでいるプログラムは、これよりはるかに大きくて複雑です。また、私はClassToTestをリファクタリングできません" –

関連する問題