在不显式检查null的情况下,我可以安全地执行对可能为null的属性的赋值吗



给定的代码如:

a.b.c = 12;

有没有一种方法可以使用像?.??这样的运算符来安全地处理abnull的情况,而在这种情况下什么都不做。a?.b?.c = 12给出了一个编译器错误,可能是因为L值可能为null,并且不能赋值给null。

我使用的是C#7.3,所以??=运算符不可用,但即使是,我也不认为这是解决方案。有可能还是必须进行明确的检查?

正如@user2864740在他的回答中所写的那样,c#语言不支持这样的东西
用c#编写它最简洁的方法可能是:

if (A?.B is null) A.B.C = 12;

然而,我发现对这种空安全属性赋值的需求相当奇怪——我的意思是,如果你需要填充某个实例的属性,那么你肯定需要该实例真正存在——如果BA在那一点上为空,那么你的程序可能不应该简单地忽略这一点,并将A.B.C = 12;视为NO-OP——而是抛出一个NullReferenceException

话虽如此,您不希望看到NullReferenceException被抛出到生产代码中,而是希望以一种空安全的方式编写代码。

IMHO,处理这种情况的方法不是避免对属性进行值赋值,而是在尝试填充属性之前确保持有该属性的引用实际上不是null。

有没有办法使用这样的运算符?。和以安全地处理[在分配的LHS上]的a或b为空的情况。。

不,没有语法可以为赋值获得相同的短手绕过效果。语言中没有添加这样的内容。

在当前的形式中,只计算一个值,它将更类似于类似于的编译器错误

(a.b.c) = 12; // LHS is a ‘value’

然而,a?。b仅在内部扩展到等价的条件链,并且如果被定义/实现,这也可以应用于这种假设情况。无论如何,在提出的问题中仍然可以手动完成。

相关内容

最新更新