2012-03-26 6 views
0

静的インスタンスのインスタンスがnullではなく、MYDBクラスの参照がGACによって破棄され、nullに設定されている可能性があります。静的インスタンスでのオブジェクト参照の問題

+0

instance.MYDB.GetNames()? – Goran

+0

DBコールを作成します。 –

+2

例外のスタックトレースを見てください(または私たちに見せてください)。 – Heinzi

答えて

3

GCは決して何もnullに設定されません。期間。

オブジェクトへの参照がある場合、GCはオブジェクトをまだ使用していることを確認し、その参照で保持しているため、完了するまで収集しません。あなたはそれに値を割り当てることができない(と私はあなたがそのシナリオを防ぎ、あなたのコード内の初期化子を持って見ることができます)あなたはnullの値を割り当てる場合、または場合

MYDBフィールドはnullすることが唯一の方法でありますあなたのコードの後のある時点でフィールドに移動します。

私はあなたが得る専用のプロパティにMYDBをオンに提案して、クラスのコンストラクタでそれを初期化します:

private DA_Setting() 
{ 
    this.MYDB = new db(); 
} 

public db MYDB { get; private set; } 

これは、あなたのクラスの外からこの値を設定することはできませんし、あなたに多くを与える必要があります保証しますより予測可能なタイプのもの。

+0

ご協力ありがとうございます! –

+0

これがあなたの問題を解決するのに役立つなら、あなたの質問に対する「受け入れられた」回答としてマークしてください。そうでない場合は、質問を更なる情報で更新してください。お手伝いをいたします。 –

+0

「GCは決して何かをnullに設定しません」という記述は事実上正しくありません。それは、通常、カテゴリーステートメントを作成する前に事実のチェックをします。 http://msdn.microsoft.com/en-us/library/system.weakreference.aspx WeakReferenceクラス*の 'Target'プロパティは、GC中に' null 'に設定することができます。 –

1

GCはまだ到達可能な場合はそのフィールドを収集せず、到達可能です。私はいくつかの他のオブジェクトがnullだと思います。 GetNamesメソッドでコードにステップインしてみましたか?

静的変数はGCルートです。つまり、アプリケーション/ AppDomainが実行されている間は静的変数は収集されません。フィールドはGCルートのフィールドなので、収集する方法はないはずです。ガベージコレクションの詳細については、こちらを参照してください。http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

+0

あなたはそれについて確かですか? –

+0

はい、あなたのプログラムの実行中にGCがあなたの変数を盗むのであれば、本当に悪いですね。 null参照のエラーは、おそらくGetNamesメソッドの中にある可能性があります。それに踏み込んでみてください。または、例外に付随するスタックトレースを見てください。 – Botz3000

+0

お世話になりました! –

1

私はそれを理解していないはずです。スタティックな初期化子とコンストラクタは、静的メンバにアクセスする前に実行されます。これは、C#のドキュメントで約束されています。インスタンスの初期化子はインスタンスコンストラクタで実行されるため、DA_Setting.Instance.Getname()を呼び出す場合は、そこにnull参照が存在しないようにしてください。ガベージコレクタは、あなたがまだ参照しているものをランダムに処理して処理するつもりはなく、静的メンバのライフサイクルが終了していない間は、まだアプリケーションが参照されていますランニング。

null参照例外の原因は何ですか。それはdbインスタンス内の何かである可能性がありますか?

+0

まあ、ログの位置は、オブジェクトの参照がnullであることを示しています。あなたは、GCの静的インスタンスのクラスが保持している参照を廃棄しないと言っているので、私の次のステップは、それが戻ってくるパラメータと値を確認してください。 –

関連する問題