почему в строках, не допускающих значения NULL, есть метод hasValue ()? - PullRequest
1 голос
/ 06 марта 2020

У меня есть класс, который содержит пустые строки, я хочу проверить, остаются ли они пустыми или кто-то их установил.

По аналогии со строками, класс содержит целые числа, которые можно обнулять, где я могу выполнить эту проверку путем сравнения на равенство с методом .HasValue () - кажется, что строки не имеют этого?

Так как же проверить, переходит ли оно с нуля на 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()

почему это невозможно?

Ответы [ 3 ]

1 голос
/ 06 марта 2020

HasValue свойство принадлежит Nullable<T> struct, где T также ограничено только типом значения. Таким образом, HasValue существует только для типов значений.

Обнуляемые ссылочные типы реализованы с использованием аннотаций типов, вы не можете использовать тот же подход с типами значений, допускающими обнуляемость. Чтобы проверить тип ссылки на обнуляемость, вы можете использовать сравнение с методом null или IsNullOrEmpty (только для строк). Таким образом, вы можете немного переписать свой код

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);
0 голосов
/ 06 марта 2020

Для типа Nullable<T> требуется тип T, который является необнуляемым типом значения, например int или double. string типизированные переменные уже имеют значение null, поэтому переменная с типом null-строки не имеет смысла.

Вам нужно использовать string.IsNullOrEmpty или просто null

0 голосов
/ 06 марта 2020

Эквивалент по сравнению с null будет:

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

Это эквивалентно вашему исходному коду, но я не уверен, что оригинальный код верен ...

isStillValid будет истинным, если ВСЕ элементы, проверяемые на ноль, фактически равны нулю. Это действительно то, что вы хотели?

То есть, если newQ.c равно нулю, oldQ.c равно нулю, newQ.b равно нулю, а oldQ.b равно нулю, тогда isStillValid будет true.

...