1

何かにnullを割り当てようとした場合にスローしたいとします。このトリックについてはどうでしょうか?

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

たとえば、次のように使用できます。

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

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

4

4 に答える 4

5

私には意味がありません-あまり読みにくいです。??演算子の 2 番目の引数はpossibleNull、例外をスローするのではなく、同じ型であることが期待されます。

私はむしろ見たい:

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

return possibleNull;
于 2011-12-16T09:39:05.887 に答える
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

于 2011-12-16T09:40:22.597 に答える
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();
        }
    }
}
于 2011-12-16T09:46:08.033 に答える
2

私はそれを良い習慣だとは思いません。

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

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

Condition.Requires(possibleNull , "possibleNull ").IsNotNull();
return possibleNull; 
于 2011-12-16T09:53:27.933 に答える