2016-05-02 7 views
1

メソッドが呼び出された後もメモリに割り当てられたままになっていますか?クラスのインスタンスは割り当てられていないとメモリに保持されますか?

private void AnyMethod() 
{ 
    new AnotherClass().AnotherMethod(); 
} 
+1

これは、有効なC#コード.....:D –

+2

@fuboとdotctor: 'void'がなければ、それはまだ有効なコードです。それはコンストラクタと呼ばれています。この場合、私的なものです。 –

+0

@ L-Three、そうです。コメントを削除しました – dotctor

答えて

3

まあ、それはコンストラクタとそのメソッドの内側にありますが、 t。

このメソッド呼び出しが終了すると、インスタンス化されたクラスには参照がなくなり、GCが来るたびにガベージコレクションが行われる可能性があります。スコープの外に行くためにインスタンスを防ぐことができます

あなたは、コンストラクタまたはメソッドにこのような何かを行うことけれどもそれは可能です、:

SomeExternalClass.SomeInstance = this; 
+0

また、メソッドが終了する前に*収集されるかもしれません - メソッドでもはや使用されていない限り、いつでも収集できます。コンパイラがこれが安全だと判断できるならば、メソッドが呼び出される前に 'this'を集めることも可能でしょう。メソッドがインライン化されているとき – Luaan

+0

私はそれについてはわからなかったので、私の答えを完了していただきありがとうございます:) @Luaan –

4

メソッドが呼び出された後に、このメソッドが呼び出されたインスタンスがスコープから外れる(それはもはやそれを指しているの参照を持っているので)、それは、ガベージコレクションの対象となります。したがって、このインスタンスは実際のガベージコレクションが発生するまでメモリに保持されます。このガーベジコレクションが発生する正確なタイミングは、もちろん、メモリ使用量などのランタイムの多くのプロパティに依存します...

+0

既に構築された 'AnotherClass'のリファレンスが、そのコンストラクタ内の静的変数に保持されている場合はどうなりますか? – dotctor

+0

このインスタンスは明らかにメモリに保持されますが、私はそれがOPが求めているとは思いません。変数への参照がある限り、ガベージコレクションの対象にはならず、それに関連するすべてのリソースが保持されます。 –

+0

いいえ、 'this'変数は常にメソッドのスコープ内にあるので、これは不可能です。 @Joey –

関連する問題