ファイアーエムブレムはファミコン版の初代「暗黒竜と光の剣」からSwitchの「風花雪月」まで、一部を除いて、ずっとプレイしてるシリーズ(やってないのを数えた方が早い)。もちろんエンゲージもやるつもり!
1.全てのキャラに活躍するチャンスがある
これがあるから、時間がかかっても何周もプレイしてしまうんですよね…
2.ストーリーとマップがリンクしている
3.計算できる
ファイアーエムブレムはファミコン版の初代「暗黒竜と光の剣」からSwitchの「風花雪月」まで、一部を除いて、ずっとプレイしてるシリーズ(やってないのを数えた方が早い)。もちろんエンゲージもやるつもり!
これがあるから、時間がかかっても何周もプレイしてしまうんですよね…
C#で「ログをファイルに出力して、一定行溜まったら押し出す」という方式のものを作りたいと思って、FileStreamまわりをいじってました。
一定行溜まったかどうかを判定するためには、単純に書き込むだけじゃなくて、ファイルの中身を見ないといけないんで、ReadWrite両方できるようにFileStreamを作って、さらにそこからStreamWriterとStreamReaderの両方を作ったんですけど、それぞれusingを入れ子にしてみると、System.ObjectDisposedExceptionを吐いて落ちます。

調べると、https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca2202?view=vs-2022 が引っかかりました。
つまり、sr(StreamReader)をDisposeすると、sw(StreamWriter)もfs(FileStream)も勝手にDisposeされるらしい?(答えは後述)

例2のようにやってみようかと思ったんだけど、usingブロックに入っていきなりstream=nullするとstreamのメソッドが使えないし、同じようには書けない…
てか、外側はusing使わず自前でtry/catchしろってのが、なんとも解せない。usingって、リソース漏れを防ぐために自前でDisposeしなくてよくなるように存在する構文じゃなかったっけ…?usingという名前のクセにno useである。
というわけで、むしゃくしゃして一個もusingを使わず以下のように書いてみました。
どうせtry/catchを使うんだったら、自前でObjectDisposedExceptionを無視するように書きますよってことで。例えば最深部のsrについて見ると、
・Disposeに成功したら次のステップでsrにnullを代入する。
・Disposeに失敗したら多分ObjectDisposedExceptionが吐かれるので、その時は別にDisposeする必要はないので結局catchブロックでsrにnullを代入する。
・その他の例外が発生したときにはsrがnullになってないから、finallyでDisposeが呼ばれる。
これを3つ入れ子にしてやってみたら、一応うまくは動きました。が、もっと美しい書き方はないんだろうか。
ステップ実行してみると、どういう動きしてるか何となくわかりました。まず最深部のsr.Dispose()で止めます。この時点では、srもswも_disabled = false、fs.IsClosed = falseです。

sr.Dispose()を呼んだあとは、sr._disabled = trueになるのと同時に、fs.IsClosed = trueに変わります。
次に、sw.Dispose()を呼び出すと、catchに飛びますが、例外が発生しててもswはちゃんと_disposed = trueになってます。
多分、srをDisposeしたとき既にfs.IsClosed = trueになってるんで、その状態でswをDisposeすると、内部でさらにfsをDisposeしようとして例外が発生したんだと思います。
つまり、こういうことですかね。
・fsからsrとswの2つの子ストリームを生成した。
・子ストリームをDisposeすると、親ストリーム(fs)も勝手にDisposeされる仕様になっている。
⇒2回目の子ストリームのDisposeで、親が既にDisposeされてるので例外を吐く。
これでは、どうやっても例外発生を回避できないですよね。
そもそも、親を勝手にDisposeする仕様がおかしいと思うんだけど、こういう仕様になっているということは、1度のファイルオープンでReadとWriteを同時に行うケースって想定されてないんですかね?
ちなみにfsだけDisposeしても、当然swとsrは勝手にDisposeされません。それでリークが起きなければそうしたいんですけど。
なんかもうちょっと工夫したいですね…(そこまでやるかという問題もあるけど、時間があったら考えます)
あけましておめでとうございます。
本年もどうぞよろしくお願い申し上げます。
昨年直接ご挨拶した人には分かる話ですが、お引っ越しをしました。
ここを読んでる人はだいたい、どこの都道府県に引っ越したか分かりますね?
分からない?
今までより、都心までちょっと遠くなっちゃったけど、
別に普通に行ける距離なので、何かあれば全然遊びに行けます。
終電は早くなったから、夜のライブはちょっと行きにくくなっちゃったかなぁ。
ここは、ポツンと…じゃないんだけど、だいぶ長閑なところです。
以前の住居は交差点の角で、バイクの騒音や大型車が通る時の振動などがあり、
そういうのと比べたらだいぶ静かになりました。
でも、こっちはこっちで特有の騒音があったりします。
春になったらカエルの大合唱でしょう。
ちなみに、ストビューには写らない場所ですねww
実は、昨年4月ぐらいに転職活動してたのは、引っ越すからというのもありました。
ちょっとね、面倒見ないといけない人がいましてね。
そこにちょうど、在宅勤務が当たり前の時代が遂にやってきたんで、
今が転職に良いタイミングかな、と。そういうことです。
今年は、新しい仕事で一年なんとか乗り切ることが目標かなー?
あと、リングフィットをできる限り毎日続けられるよう頑張ります。
あと、もうひとつやりたいことがありますけど始められるかどうか。
で、結局、どこに引っ越したか分からない?
プロフィールにドイツ語?で書いてありまぁす!!