为什么可为空的字符串没有 hasValue() 方法?

why dont nullable strings have a hasValue() method?

我有一个 class,其中包含一个可为 null 的字符串,我想检查它们是否保持为 null 或有人设置了它们。

与字符串类似,class 包含可为空的整数,我可以通过相等比较来执行此检查 使用 .HasValue() 方法 - 字符串似乎没有这个?

那么如何检查它是否从 null 变为 notNull?

public class Test 
{
    public string? a
    public string? b
    public int? c
} 

var oldQ = new Test(c=123)
var newQ = new Test(c=546)

bool isStilValid = newQ.c.HasValue() == oldQ.c.HasValue() //(this is not possible?)&& newQ.b.HasValue() == oldQ.b.HasValue()

为什么这不可能?

HasValue 属性 属于 Nullable<T> 结构,其中 T 也仅限于值类型。因此,HasValue 仅适用于值类型。

可空引用类型是使用类型注释实现的,不能对可空值类型使用相同的方法。要检查引用类型的可空性,您可以使用 nullIsNullOrEmpty 方法(仅适用于字符串)进行比较。所以,你可以稍微重写你的代码

var oldQ = new Test() { c = 123 };
var newQ = new Test() { c = 456 };

bool isStilValid = string.IsNullOrEmpty(newQ.b) == string.IsNullOrEmpty(oldQ.b);

或者只是使用与 null

的常规比较
bool isStilValid = (newQ.b != null) == (oldQ.b != null);

null 相比的等价物是:

bool isStillValid = (newQ.c != null) == (oldQ.c != null) && (newQ.b != null) == (oldQ.b != null);

这相当于您的原始代码,但我不确定原始代码是否正确...

isStillValid 如果被测试为 null 的所有项目实际上都是 null,则为真。这真的是你想要的吗?

也就是说,如果 newQ.c 为空且 oldQ.c 为空且 newQ.b 为空且 oldQ.b 为空则 isStillValid 将为 true.

Nullable<T> 类型需要类型 T,它是不可为 null 的值类型,例如 intdoublestring 类型变量已经为 null,因此可为 null 的字符串类型变量没有意义。

您需要使用 string.IsNullOrEmpty 或简单地 null