Привет.
При проверке на null бывают интересные случаи.
Например, добавили контрол на форме
X++:
formStringControl = element.design().addControl(FormControlType::String, "TestControl");
затем удалили
X++:
element.design().removeControl(formStringControl.id());
После этого отладчик показывает в окне просмотра значений, что переменная formStringControl - равна null
Если же в коде проверять
X++:
if (formStringControl)
то считает что ссылка ненулевая.
Но попытка вызвать на ней любой метод приводит к исключению.
Как можно предупредить такие случаи и понять что объект за ссылкой уже убит и она невалидна ? Ведь отладчик как-то это понимает при отображении значения в окне просмотра значений переменных.
Есть обходной способ - не хранить ссылки на контролы, а запоминать их идентификаторы и по мере надобности каждый раз доставать контрол по идентификатору.
X++:
formStringControl = element.design().addControl(FormControlType::String, "TestControl");
id = formStringControl.id();
...
element.design().removeControl(id);
...
if (id)
{
formStringControl = element.design().control(id);
if (formStringControl) // безопасная проверка - точно можно понять контрол еще жив или нет
...
}
Но ради понимания как там внутри все устроено, может можно все таки как-то безопасно понять жив объект за ссылкой или уже порушен (можно хоть один метод на нем безопасно вызвать или нет). Отладчик то как-то это понимает. Значит и мы можем.