クラスと構造体

ダイアログを開いて情報を設定するサンプルを作っていて、DialogResult.OKで終了したときのみ設定を更新するコードを書いているのに、DialogResult.Cancelで終了しても設定が更新される現象で悩んだ。
問題は「クラスは参照渡し」ということだった。よく考えると簡単で、現在の設定値を格納しているクラスをダイアログに「参照渡し」してしまっていたのだった。設定を構造体に格納するとその現象はなくなった。
しかし、クラスを使う方が普通らしいので、インスタンスのクローンを作るメソッドを書いた。組み込み済みのobject.MemberwiseClone()がprotectedなのでそれを公開するようにしただけだが。
ちなみに最初はICloneableインターフェイスの実装をしようかと思ったのだが、ICloneableに従うと戻り値をobject型にしなければならないのでやめた。いちいちキャストするより実際の型で返した方が楽そうだからだが、object型で返す理由が厳としてあるのだろうか。単にインターフェイスの宣言をする際の都合か。