4

実行行がコードブロックの外に出ると、変数はどうなりますか? 例えば:

1  public void myMethod()
2  {
3     int number;
4     number = 5;
5  }

そのため、変数を宣言して設定します。コード ブロック (5 行目) の外に出ると、変数番号はどうなりますか?

クラスのインスタンスを作成する別の例を次に示します。

7   public void myMethod()
8   {
9      Customer myClient;
10     myClient = new Customer();
11  }

コード ブロック (11 行目) の外に出ると、オブジェクト参照 myClient はどうなりますか?

どちらの場合も変数が割り当てられていると思いますが、割り当てが解除されたときは?

4

5 に答える 5

1

99%の場合、答えは「問題ありません」です。重要なのは、もはやアクセスできないということだけです。

残りの 1% はあまり気にする必要はありません。これを十分に単純化して、SO に関する合理的な答えを得るのは容易ではありません。私が簡単に言えることは、次のことだけです。

  • 変数が将来使用されなくなるとすぐに、コンパイラまたはランタイムが好きなことをすることは完全に合法です:)

これはスコープについては何も言及していないことに注意してください.C#は実際にはスコープをそれほど気にしません。スコープは、コンパイラーを支援するためではなく、コーディングを支援するためにあります (ただし、メソッドとより高いスコープは確かにコンパイル時間に役立ちます)。

繰り返しますが、ほとんどの場合、次に何が起こるかは気にしません。これに対する主な例外は次のとおりです。

  • アンマネージド リソースの使用。通常は、管理されていないリソースを確定的に破棄することをお勧めします。アンマネージ リソースをカプセル化するすべてのクラスには、Disposeこれを処理するメソッドがあります。usingステートメントを使用して、これを支援できます。
  • パフォーマンスのボトルネック - プロファイリングで非現実的な割り当て解除でメモリ/CPU が失われていることがわかった場合は、少し助けたいと思うかもしれません。
  • スコープのオブジェクトへの参照を保持します。もはや使用されていないが、まだ参照を持っているもののコレクションを誤って防止することは非常に簡単です。これが、マネージ アプリケーションでのメモリ リークの主な原因です。

また、これを少しいじってみると、デフォルトでデバッガーがアタッチされていると少し混乱することに注意してください。たとえば、ローカルはスコープが終了するまで存続します。これはもちろん完全に合法であり、デバッグ時に役立ちます。

于 2015-06-30T11:41:02.057 に答える
1

最初のケースでnumberは、値型であり、スタックに格納されます。メソッドを離れるとすぐに、存在しなくなります。また、割り当て解除は行われず、スタック領域は単に他の目的に使用されます。

2番目のケースでは、Customer(私が推測する) は参照型でmyClientあるため、インスタンスへの参照をスタックに格納します。メソッドを終了するとすぐに、その参照は存在しなくなります。これは、インスタンスが最終的にガベージ コレクションされることを意味します。

于 2015-06-30T11:41:14.547 に答える
1

最適化を行わずに、Debug で実行していると仮定します。

コード ブロック (5 行目) の外に出ると、変数番号はどうなりますか?

メソッドが終了すると、値はスタックからポップアウトされます。値型がスタック上に存在するという事実は実装の詳細であり、それに依存するべきではありません。これが のフィールドである値型である場合class、スタックではなくヒープに存在します。

コード ブロック (5 行目) の外に出ると、変数番号はどうなりますか?

Customerが であり、 ではなく、ファイナライザーが実装されていclassないと仮定するとstruct(これにより物事の流れが変わります)、9 行目以降でそれを参照するオブジェクトはなくなります。コレクションの対象と見なし、マーク段階でそのようにマークします。スイープ フェーズが開始されると、占有されているメモリが解放されます。

于 2015-06-30T11:41:21.410 に答える