我在Visual Studio 2013中停留了一段时间,所以我为null条件运算符编写了一个实现,如下所示:
public static TResult IfNotNull<TResult, TTarget>(this TTarget target, Func<TTarget, TResult> operation)
where TResult : class
{
if (target != null && operation != null)
{
try
{
return operation(target);
}
catch (NullReferenceException)
{ }
}
return default(TResult);
}
我这样做是为了增强代码的可读性,而不是操作员。这消除了类初始化代码中使用的数百个三元运算符,而不是坏代码,但难以阅读。
问题不适用于此功能。它运作良好。问题在于它的用法:
var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);
在FirstProperty
为空的情况下,即使我正在处理它,Visual Studio也会报告NullReferenceException
。这可能非常烦人,即使在长循环中完成也会令人望而却步。我通常不会获得NullReferenceException
例外,但我并不想真正关闭此异常警告。我抓住NullReferenceException
(显然空条件运算符不会这样做)的原因是我想避免在复合属性路径的情况下嵌套IfNotNull
。
我不想使用反射,因为我希望operation
的内容是消费者想要的内容(例如,方法,字段,甚至逻辑操作)。
我真的不能等到我们升级到Visual Studio 2017。
(是的,我知道在Visual Studio 2015中可以使用null条件运算符。我们正在升级到2017,因为它是最新版本。)
进一步:在我调试时,Visual Studio会将异常报告为弹出窗口。除非您正在调试,否则这不会在运行时或单元测试中发生。 我有一个catch块,Visual Studio不应该在调试时弹出这个异常。应该抓住它。
更进一步:好吧,我想我知道人们要求的是什么。这不是运行时问题。这是一个调试问题。 Visual Studio在一个lambda表达式中报告抛出的NullReferenceException,该表达式从捕获NullReferenceException的try catch块中调用。 为什么Visual Studio会警告我这一点,以及如何让它停止?这就像我一样简洁。
答案 0 :(得分:0)
评论太长,因此请在此处发帖以供审核。
使用OP
中提供的示例完成以下单元测试[TestMethod]
public void _TestNullCoalesceningExtension() {
var myEntity = new MyEntity
{
Property = new AnotherEntity()
};
var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);
Assert.IsNull(myValue);
}
public class MyEntity {
public AnotherEntity Property { get; set; }
}
public class AnotherEntity {
public YetAnotherClass FirstProperty { get; set; }
}
public class YetAnotherClass {
public object SecondaryProperty { get; set; }
}
在调试或运行它时,没有抛出任何异常。