2011-12-16 9 views
1

のは、我々は何をこのトリックについて、何かにnullを割り当てようとする場合はスローにしたいとしましょう:糖衣構文

public static class ExceptionExtension 
    { 
     public static T Throw<T>(this Exception exc) 
     { 
      throw exc; 
     } 
    } 

我々はこのように、たとえば使用することができます。

return possibleNull ?? new Exception("Unspecified something....").Throw<string>(); 

あなたはそれが良い/最悪/役に立たない習慣だと思いますか?

答えて

5

私には意味がありません。私は??オペレータの第2引数が同じタイプのpossibleNullであることを期待しています。

私はむしろ見るでしょう:

if(possibleNull == null) 
{ 
    throw new Exception("Unspecified something...."); 
} 

return possibleNull; 
+0

はいそれは私にはうれしいようですが、ちょうど他の意見、感謝をしたいです! (+1)私はあなたの返信としてマークする前にいくつかの他の人を待つ。 –

+0

@FelicePollano - 私は理解しています。コードを書くときには、私が心に留めたいことがいくつかあります(他の人はそれを読むでしょう)。 1. [最小の驚きの原理](http://en.wikipedia.org/wiki/Principle_of_least_astonishment)。 2.この引用:「あなたのコードを維持する人は、あなたがどこに住んでいるかを知っている暴力的なサイコパスになるように、常にコードする」ジョンF.ウッズ著 – Oded

+0

よろしいですか?2)私はあなたの返事としてあなたの印を付けるように告げました;) –

2

あなたは常に短いという名前の静的ヘルパークラスのいくつかの並べ替えでそれを固執することができます:

public static class Never 
{ 
    public static T Null<T>(T value) 
     where T : class 
    { 
     if (value == null) throw new ArgumentNullException(); 
     return value; 
    } 
} 

myClass.AProperty = Never.Null(somePotentiallyNullValue); 

あなたの他の例では、あまり意味がありません、私はそれを「役に立たない」練習と呼ぶことを選ぶだろう。

ヘルパークラスに「流暢」を少し追加すると、読みやすくすることに集中する傾向があります。

http://en.wikipedia.org/wiki/Fluent_interface

+0

この場合はコンパイルできませんでしたか? –

+0

@FelicePollanoリターンバリュー? throw new ' –

+0

リターンをジェネリックとして指定できるのでコンパイルできます。残念ながら、それは推論できません。 –

2

私がそれをお勧め考えていない

このよう
public static class ThrowHelper 
{ 
    public static TException ThrowIfNull<TException>(object value) 
     where TException : Exception, new() 
    { 
     if (value == null) //or other checks 
     { 
      throw new TException(); 
     } 
    } 
} 
+0

+1ご意見ありがとうございます –

2

をスローする静的ヘルパークラスのいくつかの種類を作成するために、より良く、より読みやすいかもしれません。

最初に、拡張メソッド自体は、既にスローのキーワードを持つメソッドのためのメソッドを導入しています。これは混乱するかもしれません。戻り値の型を宣言しますが、値を返すことはありません。コンパイラを使用するコンテキストでコンパイラを喜ばせるためです。他の人がすでに指摘したことを参照すると、それはむしろ「最も驚くべき原則」です。

次に、この方法をどのように使用するかを考えてみると、結果のコードはあまり読みにくいようです。さらに悪いことに、式ではこのアプローチしか使用できないため、オブジェクトを何らかの方法で使用するコードで終わることになります(例:返すだけです)、同じ行の副作用としてnullをチェックします。私は明示的にヌルチェックを行い、何か他のものと混ざらない方が好きです。 CuttingEdge.Conditionsのようなライブラリは、これを入力するコードの量を減らすのに役立ちます。あなたはこのようにあなたの例でそれを使用するでしょう

Condition.Requires(possibleNull , "possibleNull ").IsNotNull(); 
return possibleNull; 
+0

+1感謝の意を表します –