- ふらっと C#,C♯,C#(初心者用) Part116 [転載禁止]©2ch.net
408 :デフォルトの名無しさん[sage]:2015/08/23(日) 12:58:48.36 ID:hc4Y2Ev5 - 遊ぶ範囲ならVS2015でも十分だけど、まだIDE不安定なんで実戦投入なら2013の方がええかも
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
588 :デフォルトの名無しさん[sage]:2015/08/23(日) 16:24:59.06 ID:hc4Y2Ev5 - 無脳だと認めたら終わってしまうくらい他に何かが無いのに、これ以外にできることが無い奴なんだろうな
暴れすぎやで > 573,579,581
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
594 :デフォルトの名無しさん[sage]:2015/08/23(日) 17:54:13.26 ID:hc4Y2Ev5 - リソースの意味が微妙な感じの流れだから、それは置いとくとして
ファイルなどを取り扱う場合はちゃんとDisposeしないとファイルが開きっぱなしになって、他所からアクセス不能になって困る事がある 必ずクローズすれば良いが、例外などで予想外の進行をした場合に備えて using で確実なDisposeをしておいた方が良いだろう 面倒だがDisposeがあるなら必ずDisposeするべきでしょう C++などの場合と比べてファイナライザ(デストラクタ)の実行順序が当てにならないので、あてになる順序をきちんと作る必要がある場合も利用されるでしょうから
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
598 :デフォルトの名無しさん[sage]:2015/08/23(日) 18:04:49.28 ID:hc4Y2Ev5 - 595,596
煽りたいだけなら、今すぐネット切って死んでしまえば良い
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
599 :デフォルトの名無しさん[sage]:2015/08/23(日) 18:09:32.22 ID:hc4Y2Ev5 - >>597
Disposeを書くという事は、今後そのライブラリを作った人が そのように使う必要があるよう変更するかもしれないという余地が残っているのです みんなで作業するときトラブルなどが発生しないように取り決めた事ですから、可能な限り従う事がよろしいでしょう
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
613 :デフォルトの名無しさん[sage]:2015/08/23(日) 18:50:45.39 ID:hc4Y2Ev5 - >>604
それでは共同作業になりませんね、そこまで自我を通したいなら自分一人で作業するしかないでしょう 取り決めは大事
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
620 :デフォルトの名無しさん[sage]:2015/08/23(日) 19:36:46.47 ID:hc4Y2Ev5 - Disposeがどうしても嫌なら、勝手に俺ルールを作り出さず素直にファイナライザに書けばいいんだよ
そういうルールで作ろうという事になっているんだから それで問題なければそれで上手くいく、そうでないものは決められた極力ルールに従う事 そうしてファイナライザのみにすると具合が悪い話が必ず出てくると気付くはず 例えば、ファイルオブジェクトのように、ロック握っている奴とか 例えば、アンマネージ側の参照カウンタがカウントダウンされなくて予想外のメモリーリークしたとか 例えば、C++のつもりでデストラクトの順序を考えていたら予定外の順序でファイナライザが起動してクラッシュしたとか
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
627 :デフォルトの名無しさん[sage]:2015/08/23(日) 20:09:16.04 ID:hc4Y2Ev5 - 初心者の頃 Disposeし忘れて、ライブラリの書き直しが大変な事になったのでは GetEnumerator() で取ってきたIEnumerableのDisposeのし忘れかな
ファイルオブシェクトをこっそり握っていて、ファイルがロックされたままだったのを 色々システムを結合した後に気づいて、泣きそうになった C++から移行した後、嵌ったのは class A { ~A() {} } class B { A a; ~B() {} } var tmp = new B(); こういったケースかな、C++であれば必ず a のデストラクタが後だが C# だとどちらが先になるか分からなくなる C++と違いデストラクタではメンバは迂闊に触れないという事実を思い知らされた
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
628 :デフォルトの名無しさん[sage]:2015/08/23(日) 20:18:42.77 ID:hc4Y2Ev5 - おっと、GetEnumerator() で取って来れるのは IEnumerable ではなくて IEnumerator でした
Disposeがリソースと関係なく必要になるケースはC++と違いデストラクタがまともに使えないという事情から来ることも多々あります
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
635 :デフォルトの名無しさん[sage]:2015/08/23(日) 21:31:38.21 ID:hc4Y2Ev5 - >確かにこれだとFile等はClose/Disposeをしないといつロックを解除してくれるか分からない。
ファイルオブジェクト的な物を使う側ではなく作る側で、実際にいろいろやってみて面倒な事になってるなと思ったのは フィールド上に確保していたバッファがデストラクタ中のクローズ処理よりも先に解放されてしまうなどですかね アンマネージの場合はこの辺は実にすっきり記述できるんですが、マネージでは厄介です 初心者の時 ~Class() { Dispose(); } なんて事をあまり深く考えずにやってました、そして謎の異常終了を発生させてましたね Disposeが呼び出されずにデストラクタが呼び出されたら、できることはもはや安全停止だけです まともな終了処理は最早できません
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
639 :デフォルトの名無しさん[sage]:2015/08/23(日) 21:40:51.66 ID:hc4Y2Ev5 - デストラクタ的な機能が欲しければC#ではDisposeしか手段が無いんです
ファイナライザは使えません、その処理はシステムに任せることはできないのです それが分かっていないと安易にDispose不要という考えが出てしまいます
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
645 :デフォルトの名無しさん[sage]:2015/08/23(日) 22:21:09.75 ID:hc4Y2Ev5 - コストに関しては、昨今はシビアなノーパソでもない限りは自分はあんまり気にしなくなってたりしますw
ロジック的にDisposeが必要不可欠な物の方を意識したいところです
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
648 :デフォルトの名無しさん[sage]:2015/08/23(日) 22:33:20.72 ID:hc4Y2Ev5 - 3. 機能的に問題ないうえに負荷も軽微→元クラスのIDisposeを除去せよ
これが正解です
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
651 :デフォルトの名無しさん[sage]:2015/08/23(日) 22:37:59.91 ID:hc4Y2Ev5 - ここにはゲーム等、ハイパフォーマンスが必要になる人もいるでしょう
その時Disposeしなくても問題ないと開発元に確認できた、Disposeしない方が高速である事が確認された そして、それをする事でソフトの商品価値が向上する、この条件でDisposeしないを選択するのが正しいと思う それ以外は必ずやらなければ駄目です
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
657 :デフォルトの名無しさん[sage]:2015/08/23(日) 22:45:56.71 ID:hc4Y2Ev5 - >>650
マークスイープでは順序を決めることができないんですよ 循環した参照がある場合どこから削除すべきかという判断材料がなくなる、ならば最初から順番は無視という判断なのだと思います 実際ガベコレ毎に順序は出鱈目です、気を付けてください C++の場合、例えば循環参照があったらメモリーリークですが、プログラマのレベル高いから平気だよねってコンセプトではない訳です それにしてもC++の芋ずる式デストラクタは気持ちいいです・・・
|
- C#, C♯, C#相談室 Part88 [転載禁止]©2ch.net
665 :デフォルトの名無しさん[sage]:2015/08/23(日) 23:07:02.82 ID:hc4Y2Ev5 - C++の人は、ここをミスしやすいと思うし、見ている印象結構C++からやってきた人多そうだから
悪くないサンプルだと思うのですが・・・
|