設定オブジェクト。Nullも使用後です。当期純
-
08-06-2019 - |
質問
きセットのすべてのオブジェクト null
(Nothing
にVB.NET)が完了した。
私は理解しています。当期純な処理のインスタンスを実装するオブジェクト IDisposable
インターフェースリリースのあるバイオリソースをこのオブジェクトでも後であるこ isDisposed
財形、そしてできるもの居住者にメモリまたは少なくともできます。
いることも分かっていることで、この場合、オブジェクトが範囲外になるとそのマークが付けられた収集の準備となるので、ガベージコレクタはこのがあります。
このままの設定で null
高速化のシステムのメモリとしてではない事ではなくなった範囲、その他の悪い側でしょうか。
MSDNの記事のないこの例では、現在いることができません に呼ばれている。しかしい混合物の意見で任意のコメントを利用します。
解決
カールは絶対に正しい設定オブジェクトはnull。場合にはオブジェクトの実施 IDisposable
, は、必ず呼び出す IDisposable.Dispose()
できたらとそのオブジェクト(包んだもの try
..finally
, 又は、 using()
ブロック).もっともだからと言ってんでください Dispose()
, のfinaliser法のオブジェクトは呼ばれるようになりますよ Dispose()
ます。
これってすごいことだなと思いたい処理:
この
がない点にしようとする第二のものGCは、その管理戦略での自己チューニングおよび不透明である。がありましたの協議の仕組みとジェフリー-リヒタに写純岩はこちら ジェフリー-ヒターのWindowsのメモリモデル や Richters書 CLR C# 第20大きな処理:
他のヒント
別の理由な設定オブジェクトがnullのときに行していることで実際にこしています。
例えば
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is now eligible for garbage collection
// ... rest of method not using 'someType' ...
}
のオブジェクト参照someTypeするGCんの呼び出し後に"DoSomething"が
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is NOT eligible for garbage collection yet
// because that variable is used at the end of the method
// ... rest of method not using 'someType' ...
someType = null;
}
ことがあり、オブジェクト生終了までの研究"に関するお問合せの JITは、通常、最適な離れの譲渡はnull, でもビットコードになっても同じです。
なんnullオブジェクト。チェックでき http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx 詳しい情報が設定もnullの場合では、何も起こりません、汚れごのコードです。
また:
using(SomeObject object = new SomeObject())
{
// do stuff with the object
}
// the object will be disposed of
一般に、必要はありませんnullオブジェをご利用の後は、一部の例を見たいのです。
場合にはオブジェクトを実装しIDisposableに保存された分野だと思ってい良nullの場合で、サービスの利用、廃棄オブジェクトです。のバグは次のようなき苦しい:
this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();
したものを思い出します。nullの後の処理で、NullPtrExのラインの分野でも使用しました。その他、パッチの隠バグのようDoSomethingい).
というコードな構造をもっくする必要があると感じてい null
変数.
があり、いろいろな方法の制限の範囲の変数:
どのよ スティーブ、トランビー
using(SomeObject object = new SomeObject())
{
// do stuff with the object
}
// the object will be disposed of
同様に、使うことができればブラケット:
{
// Declare the variable and use it
SomeObject object = new SomeObject()
}
// The variable is no longer available
見を巻きブラケットなし"見出し"のカスタマーサポートのコードにより、より理解できなければならない。
だけの時間を設定すべきである変数をnullにできる変数の出ない範囲む必要がなくなデータを関連付けられています。そうでない場合、は必要ありません。
一般的な設定はnullになります。ないリセット機能。
そうでない通話処理、一部の処分がなされて捨てます。ObjectDisposedます。
private void Reset()
{
if(_dataset != null)
{
_dataset.Dispose();
_dataset = null;
}
//..More such member variables like oracle connection etc. _oraConnection
}
このような"する必要がない設定オブジェクトがnull使用後に"しない完全かつ正確です。がありまNULLの可変後の処理です。
あり、必ず呼び出す必要がありま .Dispose()
または .Close()
になることができます。すでにファイルを扱うデータベース接続や使い捨てのオブジェクト。
別の非常に実践的なパターンのLazyLoad.
言い、インスタンスを生成 ObjA
の class A
. Class A
公共性という PropB
の class B
.
内部的には、 PropB
個人の変数 _B
デフォルトはnullです。時 PropB.Get()
により使用されているかどうかをチェックした場合 _PropB
がnullの場合を開設するのに必要な資源をインスタンス化 B
入 _PropB
.ることができ _PropB
.
私の経験では、これも非常に有用なリックを達成しています。
の必要性にnullがある場合はリセットは変更の方法でのコンテンツの _PropB
した、子どもの以前の値 A
, る必要がありま処理およびnullの場合出 _PropB
でLazyLoadでリセットを取り出す右の値の場合はコードが必要です。
ください _PropB.Dispose()
と直後の期待にnullチェックLazyLoad成功しないnullの場合、ごみステイルデータです。有効な、nullで Dispose()
される方もいるでしょう。
まだでたそが、私にはコードの現在の出展はこの動作後 Dispose()
a _PropB
の呼び出し機能になったかの処理(そのほとんどの範囲の個人プロップなnullの場合、無効なデータは存在します。
そして、廃棄プロパティをnullに、そして非決定論的からの視点です。
中核の理由としてdbkk塞の親コンテナ(ObjA
と PropB
は、インスタンス _PropB
範囲にもかかわらず、 Dispose()
.
る場合があります。nullの参照です。例えば、ときの文書を集めてきそうなの優先度キューやご契約、なんかつそれらのオブジェクト生のためのクライアントのクライアントを除去してからキューに挿入します
このようなものに限事項を長期間続いています。場合のキューのない生存の機能で作成した、その事項の全体を多くする。
に、全体でもない。のコンパイラおよびGCい雇用可能になっています。
この記事など http://www.codeproject.com/KB/cs/idisposable.aspx
の設定オブジェクトをnullにしても、何の効果もありません。の時には通知なしに変更されることがありながって作業する場合は"大型のオブジェクト"である以上84Kサイズなどのビットマップ).
スティーブンの便宜性を高めた。(c)の解説もこのポスト: 設定すれば良い変数をNullに支援ガベージコレクション
"と言ってい
その答えに焦りを Yesの場合、変数は静磁場合、または書いているenumerable法を用利回り返す)または非同期の方法を用い非同期待).れます。
これは通常の方法(非enumerable非非同期)に設定しないでくださいローカル変数、パラメータやインスタンス分野ではnullになります。
(する場合であっても該当しますの実施IDisposable.廃棄、あらかじめご了承ください変数にはnull。
ここで重要なことを考慮する必要があるで ではないStaticフィールド.
ではないStaticフィールドは常にルートオブジェクト, その 常に考える"生きて" では、ガベージコレクタによって.場合はstaticフィールドを参照するオブジェクトが不要になったとき、あるべきではnullに設定で、ガベージコレクタ取り扱いますの対象となっています。
設定ではないstaticフィールドをnullでなければ、何の意味も無いからの全プロセスが閉ます。全体のヒープはゴミ収集した時点で、すべてのルートオブジェクト。
結論:
ではないStaticフィールド;よろしくお願いしますそれ以外のものはすべて、 廃棄物の時間.
私はデザインのGCを実装する場合はできません 高速化 GCと効.思いが好きな自分の方がGCを運--ではこのようなユビキタス ている 保護し、見出しのためにお---(弓頭を下げ、高拳の空...
個人的に、私はよく、明示的に設定の変数をnullが読んだとしても自分らします。思を宣言するのに使用してnullを設定することに私はnull後すぐに彼らは必要ありません。っと言って明示的に"私は公式に行っています---設計-デザインされてい..."
はじめGC思いますか?No.でも、GC?もらいかもしれません、知らない特定のデザインの思コントロールできなかかわらず、今日の答えをこのバージョンは、将来のGCの実装を変えることができる答えを超えて私た。プラス場nulling最適化されていますのちょっと、ようやく完成したのがファンシ コメント 合させていただきます。
I図った場合には私の意見の貧しい馬鹿にしている私の足跡を、い場合 "もの" 潜在的に助GCものであります。多いのでス明確にし、もんごういかが好きな感じに整頓してきました。:)
私は見るようになります:プログラミング言語が存在するのでしょうその他の人の意図やコンパイラは、ジョブ要求をどうするかということをコンパイラに変換する要求を異なる言語(時には数)のためCPUのCPU(s)がgive a hootどの言語使用、タブの設定、コメント、スタ重視しながら、変数の名称等--CPUのすべてのビットストリームに高めることで何を登録opcodes、メモリ位置にtwiddle.多くのものを記述コードなに変換えに消費され、CPUの配列を指定します。当社のC、C++、C#、Lispバベルのアセンブラなどが理論よりも現実を記述してます。だけなのでまあでも、アセンブラ言語です。
わからなくはないのマインドの"不必要なものに"(空白ライン)"のもので騒音及びクラッタまでのコードです。" たっ先に私のキャリア;今まで取得します。ここでい傾向があるコードがより明確になる。しかできないファッション私の追加も50ライン"ノイズ"の私のプログラムでイがここにはあります。
例外ケースがありますの他の規則です。シナリオを揮発性メモリに静的にメモリーの条件singletons、利用の"無効なデータをインポートすべての種類の腐敗との違い:する管理に必要な独自のメモリロック、じとしてaproposでのメモリの一部ではなく、GCにも宇宙も皆様に理解します。残りの時間GCい言語でのスタイルではなく必要性は保証され性能が進みました。
の末日ただくにはかりが対象となGCで何がそうではないのかというこ;ロック処理や無効化を適正にワックス、ワックスしながら、息を吐くとき;やかんな気持ちいいでいます。イとして---べきである...
オブジェクトとは .dispose()
法による勢力の資源から削除される。