使用null coalesce operator抛出的语法糖

时间:2011-12-16 09:36:30

标签: c# syntactic-sugar

假设我们想尝试将null赋给某个东西,我们想抛弃,这个技巧怎么样:

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

我们可以这样使用:

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

你认为这是一种好/最差/无用的做法吗?

4 个答案:

答案 0 :(得分:5)

对我来说没有意义 - 不太可读。我希望??运算符的第二个参数与possibleNull的类型相同,而不是抛出一个重复。

我更愿意看到:

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

return possibleNull;

答案 1 :(得分: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

答案 2 :(得分: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();
        }
    }
}

答案 3 :(得分:2)

我认为这不是一个好习惯。

首先,扩展方法本身只为我们已经拥有关键字的东西引入了一个方法:throw。这可能会令人困惑。它声明了一个返回类型,虽然它永远不会返回一个值,只是为了取悦您想要使用它的上下文中的编译器。参考其他人已经指出的内容,这是“最令人惊讶的原则”。

然后,看看你将如何使用这种方法,结果代码看起来不是很清楚。更糟糕的是:你只能在表达式中使用这种方法,所以你总是会得到以某种方式使用对象的代码(在你的例子中:只返回它)并在同一行中将其作为副作用检查为null 。我更喜欢明确地进行空检查,而不是与其他东西混合。像CuttingEdge.Conditions这样的库可以帮助减少为此输入的代码量。你会以这种方式在你的例子中使用它

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