Согласно этим объяснениям, между этими двумя понятиями не должно быть никакой разницы.
Но когда я использую движок Unity с данными Json Я вижу функциональное отличие: Is Not null не распознает Джейсона как пустое, но распознает те же данные как пустые, когда я проверяю их с помощью !=
В чем причина этого?
Может что-то не так, извините (используется переводчик)
Я ожидал, что при обоих условиях будет обнаружено нулевое значение.
Разница лишь в том... и... разницы быть не должно..., Вам не кажется, что эти два предложения противоречат друг другу?
@hans-keffing Точно, C# делает то же самое в консоли, поэтому обходного пути нет.





Я ожидал, что при обоих условиях будет обнаружено нулевое значение.
Да, оба оператора обнаруживают истинные нулевые значения. Однако Unity немного особенная. Unity — это движок C++, и когда дело доходит до управления памятью, возникают некоторые серьезные проблемы. В C# вы не можете уничтожить какой-либо объект вручную, поскольку это полностью находится в руках сборщика мусора. Ссылки на объекты не могут внезапно стать нулевыми в C#.
Поскольку собственные (C++) объекты Unity могут быть уничтожены в любой момент, это создает проблему на уровне сценариев C#. Ссылка на GameObject или другой компонент не может волшебным образом стать нулевой. Итак, Unity использует трюк. Они перегрузили оператор == и метод Equals, и при сравнении мертвых объектов с нулевым значением они вернут true. Это называется поддельным нулевым объектом. Это по-прежнему допустимый объект C#, но его больше нельзя использовать, поскольку фактический собственный объект был уничтожен. Большинство встроенных компонентов и классов в Unity — это просто классы-оболочки C#, за кулисами которых находится собственный объект. (Каждый класс, производный от UnityEngine.Object)
Это означает, что вы не можете использовать is null или любой из операторов объединения значений NULL для переменных с типом, производным от UnityEngine.Object. Когда эти ссылки действительно равны нулю, это будет работать. Однако в большинстве случаев вы столкнетесь с поддельным нулевым объектом, и проверка is null не увидит его как нулевой, поскольку это все еще экземпляр.
Около 10 лет назад в блоге была запись о перегрузке оператора == . Вот справочный источник Unity и пользовательский оператор ==. Как вы можете видеть, он на самом деле вызывает CompareBaseObjects, и когда объект мертв, он «подделывает», что он равен нулю.
Многие говорят, что это было плохое решение, однако это решение было принято, когда единственным оператором, который выполнял прямую проверку нуля, был ??. В последние годы в C# появилось множество операторов, которые также обходят перегрузку операторов, поэтому эта проблема становится растущей. Однако избавление от перегрузки означало бы, что вам всегда придется выполнять дополнительную IsAlive проверку вручную, поскольку вы не сможете избавиться от фундаментального конфликта между миром C++ и C#.
Это было интересно, я не знал, что это так работает, поэтому мне следует избегать использования новых операторов C#. Большое спасибо за предоставленные вами ссылки ♥♥♥
быть пустым и быть нулевым - это две разные вещи