给定的代码如:
a.b.c = 12;
有没有一种方法可以使用像?.
和??
这样的运算符来安全地处理a
或b
是null
的情况,而在这种情况下什么都不做。a?.b?.c = 12
给出了一个编译器错误,可能是因为L值可能为null,并且不能赋值给null。
我使用的是C#7.3,所以??=
运算符不可用,但即使是,我也不认为这是解决方案。有可能还是必须进行明确的检查?
正如@user2864740在他的回答中所写的那样,c#语言不支持这样的东西
用c#编写它最简洁的方法可能是:
if (A?.B is null) A.B.C = 12;
然而,我发现对这种空安全属性赋值的需求相当奇怪——我的意思是,如果你需要填充某个实例的属性,那么你肯定需要该实例真正存在——如果B
或A
在那一点上为空,那么你的程序可能不应该简单地忽略这一点,并将A.B.C = 12;
视为NO-OP——而是抛出一个NullReferenceException
。
话虽如此,您不希望看到NullReferenceException
被抛出到生产代码中,而是希望以一种空安全的方式编写代码。
IMHO,处理这种情况的方法不是避免对属性进行值赋值,而是在尝试填充属性之前确保持有该属性的引用实际上不是null。
有没有办法使用这样的运算符?。和以安全地处理[在分配的LHS上]的a或b为空的情况。。
不,没有语法可以为赋值获得相同的短手绕过效果。语言中没有添加这样的内容。
在当前的形式中,只计算一个值,它将更类似于类似于的编译器错误
(a.b.c) = 12; // LHS is a ‘value’
然而,a?。b仅在内部扩展到等价的条件链,并且如果被定义/实现,这也可以应用于这种假设情况。无论如何,在提出的问题中仍然可以手动完成。