可空字符串 (string?) 和初始化为可原谅空值的字符串 (字符串 s = null!) 之间有什么区别
public string? nullableString {get;set;} = null;
public string forgiveString {get;set;} = null!
在某些情况下您会想使用其中一种而不是另一种吗?它们在功能上等效吗?
可空字符串 (string?) 和初始化为可原谅空值的字符串 (字符串 s = null!) 之间有什么区别
One is correct。另一个是真蠢.
在某些情况下您会想使用其中一种而不是另一种吗?
笔者认为,不会。
...但是有are很多情况下!
由于 C# 可空引用类型功能的当前限制,需要Expression<>
, ValueTuple
,Linq,但属性初始化不是其中之一:如果属性“从不”null
“那么财产must在构造函数或初始值设定项中分配(从 C# 11 开始:使用required
修饰符),因此使用= null!
初始化属性是不必要的,也是不正确的。
如果您确实有无法使用可空引用类型的遗留代码,或者使用某些运行时系统进行初始化的代码(例如DbSet<T>
属性在DbContext
在实体框架中)然后使用作用域#pragma
and #nullable
抑制警告的指令而不是!
并且始终添加解释性评论来证明原因,这样你的下一个可怜的同事就不必费力去理解发生了什么。
它们在功能上等效吗?
No.
类成员声明public string Foo { get; set; }
是一份合同 https://stackoverflow.com/questions/15914298/how-to-understand-the-meaning-of-contract说的是 ”Foo
永远不会null
: 它会always可以安全地取消引用String
-引用该属性的getter返回,并且传递a是非法的null
引用属性设置器。”
踢脚线规则 = null!
就像在说“这个财产永远不会null
,除非是。Have fun”。别这样做。
Another不做的理由= null!
with DbContext
's DbSet<T>
属性是因为引用类型字段总是初始化为null
无论如何在填充之前DbContext
的构造函数(例如 EF6 使用其magical DbContext.DiscoverAndInitializeSets()
方法),因此显式初始化引用类型属性为null
当它被设置为非null
超类构造函数的对象引用是多余的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)