Obsoleteってもしかして相当使える?
C#の属性であるObsolete属性は、使用したときに警告を出したりコンパイルエラーにしたりできる。
これは「古い形式のメソッドに警告を出す」のに使うわけだけど、もっと積極的に活用できないだろうか。作業量を減らすために、全interfaceを実装したクラスなんかを作り、
class Hoge : IHoge { //...なにやらいろいろ実装する。 //インターフェースを合わせるために用意してあるが、使用したら例外が飛ぶ。 public void SomeMethod(){ throw new Exception("not implemented."); } }
こういうコーディングになってしまった時に、とりあえず気休めとしてObsoleteを付けとくのはありだろう。
[Obsolete("使用できません",true)] public void SomeMethod(){ throw new Exception("not implemented."); }
これで直接使おうとしたらコンパイルエラーになる。しかしinterface越しに使われたらアウトなので大した意味はないか。
http://d.hatena.ne.jp/haruyutaka/20070111/p1#c
ここのコメント欄で、Webアプリでユーザーから入力された文字列をそのままSQL文に入れたりすることでSQLインジェクションの脆弱性が起こるのにどう対処するか話していて、
query = ”select hoge from fuga where id=” + id.escapeSQL() html = ”ようこそ” + name.escapeHTML() + ”さん<BR>” //エラー query = ”select hoge from fuga where id=” + id //生文字列をそのまま使う場合。名前を長くして注意を喚起し、使いづらくする。 str = ”あなたが入力した文字列は” + input.toNonEscapeString() + ”です”
こんな風にしたらいいんじゃないかと思ったのだけど、
query = ”select hoge from fuga where id=” + id;
これをエラーにするにはC#ではObsoleteを使うしかないように思う。idをUserInputString型として、stringへの暗黙の型変換をエラーとする。
class UserInputString { const string EscapeErrorMsg = @"ユーザーから入力された文字列をエスケープせずに使うのは危険です。 生文字列を使用したい場合はToNonEscapeStringを使ってください"; [Obsolete(EscapeErrorMsg, true)] public static implicit operator string(UserInputString uis){ throw new UncatchException(); } [Obsolete(EscapeErrorMsg,true)] public override string ToString() { //デバッグ用ルーチンかなんかで呼び出されたときのために、とりあえず返しとく。 return "UserInputString: " + str; } //... }
なんかもっと使える例はないもんかな。わからん。