大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

C#難しすぎ

著者:高木信尚
公開日:2018/07/04
最終更新日:2018/07/04
カテゴリー:技術情報

C#初級者の高木です。おはようございます。

JavaScriptは初心者ですがC#は初級者といったところです。
とても使いこなせているとはいえません。
C#のような難しいプログラミング言語を使いこなせるようになるには、まだまだ修練を積まなければなりません。

C#のどこが難しいかというと、少なくとも私が感じているのはリソースの解放関係です。

メモリに関してはガベージコレクションがあるのでまあいでしょう。
これもガベージコレクションを抑止できないことによる弊害があるのですが、今回はその話は割愛します。
メモリ以外のリソースに関しては自前で解放しないといけないので、それこそストレスMAXになります。

いや、Cでメモリやリソースを解放するのはそんなにストレスにならないんです。
ところが、C#(Javaなんかもそうですが)だとC以上にストレスがたまります。

ガベージコレクションがあることで、自分で解放する手間から解放されたかの錯覚を初心者に与えてくれますが、実際はそんな簡単な話ではなさそうです。
むしろ、「明示的な解放が不要」という印象付けが、リソースリークを多発させているように思います。

まず、Disposeパターンとかツールの支援なしに自分で実装するのは面倒すぎます。
何度も書いているときっと何%かは間違いそうです。

Disposeを明示的に呼び出すのを忘れるのもお約束です。
「usingステートメントを使えばいいじゃないか!」といわれそうですが、クラスのメンバーとして持ちまわるときには無理ですからね。

Cでも、malloc関数で割り付けたメモリを同じブロックで解放すればいいのであれば、失敗することはほとんどないのです。
ポインタを持ちまわるからメモリリークが起きるんですよ。
C#でも、Disposeが必要なオブジェクトを持ちまわれば同じことが起きます。

しかも、どのオブジェクトがDisposeが必要で、どのオブジェクトが必要ではないのかが、見た目からは判断が付きにくいのです。
ついつい、システムハンガリアンを使いたくなってしまうぐらいです。

それともうひとつ、例外安全なコードを書くのが極めて困難ということがあります。
最大の原因はThreadAbortExceptionのような非同期例外があるからです。
こんな非同期例外があると、例外安全なコードが書ける気がしません。

算術型の代入や四則演算をやっている間に例外が発生することがあると、手の施しようがないと思います。
いくらusingステートメントを使っていても、非同期例外が発生するとDisposeが呼ばれないことが実際に起こり得ると思います。

もしかすると私がC#初級者だから、こんなに下手糞なことをやっているのかもしれません。
上級者であれば(いや中級者であっても)、私が知らない素晴らしい方法でこうした問題をクールに解決しているのかもしれません。

コメントは受け付けていません。

上に戻る