コンピュータや音楽の事書いてます

メモ C#ではC++式のRAIIが使えない

RAIIとは、メモリ開放やファイルCloseやポートのCloseなど、書き忘れるとヤバイcodeを、スコープから抜ける時に自動的にやってくれる仕組み。これがC#では無くなっている。なぜ??!
代わりにIDisposableインターフェイスなclassを作って、using文を使う。ネストが増えるのが気に入らない・・・・
以下は、ボタンが押されて、ある処理を行っている最中に、もう一度ボタンが押されてしまうのを防ぐ為に、ボタンを一時的に無効にしておこう、という場合の例

    //実行中はボタンをEnabled = falseし、終われば(スコープを抜ければ)自動的にenableされる
    class ButtonDisabler : IDisposable
    {
        Button theButton;
        public ButtonDisabler(Button b)
        {
            theButton = b;
            theButton.Enabled = false;
        }
        void IDisposable.Dispose()
        {
            theButton.Enabled = true;
        }
    }

    private void buttonSend_Click(object sender, EventArgs e)
    {
        //処理が終わると勝手にボタンが有効になる
        using (ButtonDisabler btn = new ButtonDisabler(buttonSend))
        {
            /*何か処理*/
        }
    }