c# - 我可以在不明确检查 null 的情况下安全地对可能为 null 的属性进行赋值吗?
问题描述
给定如下代码:
a.b.c = 12;
有没有办法使用运算符 like?.
并??
安全地处理 that a
or b
is的情况,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
此时为 null ,您的程序可能不应该简单地忽略它并将A.B.C = 12;
其视为 NO-OP - 而是抛出NullReferenceException
.
话虽这么说,您不希望看到NullReferenceException
在生产代码中被抛出,而是希望以这样的方式编写代码,它会是空安全的。
恕我直言,处理这种情况的方法不是避免对属性赋值 - 而是在尝试填充属性之前确保持有该属性的引用实际上不为空。
推荐阅读
- javascript - 动态对象替换属性而不是添加到它
- mysql - 如何从 SQL 中的计数表中选择特定行
- regex - 正则表达式只留下字符串的第一个和最后一个字符
- sharepoint - SharePoint 2016 FBA 本地 DUO .NET WebSDK
- c++ - 如何以独立于平台的方式从 C++ 目录中读取文件?
- sql - 列之间的 SQL 操作
- r - Different results for SVM using Caret in R when classProbs=TRUE
- python - 使用 np.where 在 matplotlib 中按类别着色
- python - 如何使用 Pytorch 和/或 Numpy 在多维矩阵数组中有效地查找最大值的索引
- postgresql - tokio-postgres 和数据库查询