假设我们想尝试将null赋给某个东西,我们想抛弃,这个技巧怎么样:
public static class ExceptionExtension
{
public static T Throw<T>(this Exception exc)
{
throw exc;
}
}
我们可以这样使用:
return possibleNull ?? new Exception("Unspecified something....").Throw<string>();
你认为这是一种好/最差/无用的做法吗?
答案 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);
你的另一个例子没有多大意义,我选择称之为“无用”的做法。
为辅助课程添加一些“流畅性”往往侧重于使事情更具可读性。
答案 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;