Из документации Assigned
функции (курсив мой):
Использование Assigned для определения указателя или процедура ссылается на P, является ли ноль. P должен быть переменной ссылкой указателя или процедурного типа. Назначение (P) соответствует тесту P <> nil для переменной указателя, а @P <> nil для процедурной переменной.
Назначение возвращает false, если P равно нулю, в противном случае - true.
Примечание: Назначенный не может обнаружить оборванный указатель - то есть тот, который не равен нулю, но больше не указывает на действительные данные. Например, в примере кода для Assigned Assigned не обнаружит, что P недействителен.
Assigned
функция эффективно реализована как:
function Assigned(const P): Boolean;
begin
Result := Pointer(P) <> nil;
end;
Так что функция действительно не проверяя, действительно ли значение присваивается. Скорее, он проверяет побочный эффект от назначения.
- В результате функция является гарантированно вернуть
True
если он назначен.
- Но поведение не определено, если значение неинициализировано. В принципе, поскольку неинициализированное значение имеет значение мусора, оставшееся от предыдущих операций, оно должно быть может быть ноль, или если не может.
Следует отметить, что Assigned
не имеет возможности определить срок действия его стоимости. Например. Следующий вызов Assigned
возвращает True
, хотя основной объект больше недействителен.
var
LObject: TObject;
begin
LObject := TObject.Create;
LObject.Free;
if Assigned(LObject) then ShowMessage('Still assigned!?');
end;
EDIT: Добавление
В ответ на вторую часть вашего вопроса.
Есть ли какой-либо безопасный способ узнать, имеет ли класс переменную уже выполненный метод создания?
Нет надежного способа определить, был ли экземпляр объекта создан. (Также нет способа достоверно подтвердить, что он еще не был уничтожен.)
Однако существуют соглашения (и передовые методы), которые вы можете выполнить, чтобы помочь вам в этом.
Прежде всего обратите внимание, что вы должны быть «неуверены», если что-то было создано, если это преднамеренная функция этого фрагмента кода. Например. Если вы хотите, чтобы объект был «ленивым инициализированным».
- То, что я пытаюсь сказать здесь: Никогда проверка
Assigned
только потому, что вы беспокоитесь, что там может быть ошибка, что не мешает ему быть назначены.
- Не только это невозможно сделать надежно, но вы перекомпилируете свой код ... Какой увеличивает вероятность ошибок.
- Также, если вы обнаружите, что что-то неожиданно не назначено, то что вы можете с этим сделать? Игнорировать это было бы просто бессмысленно. Кроме того, это нехорошо сказать: «Хорошо, тогда я создам объект». Потому что тогда вы дублируете логику создания в нескольких местах.
- В принципе, вы должны попытаться сделать все части своей программы правильными - не пытайтесь ли вы дважды проверить себя повсюду.
Так что теперь мы (надеюсь) согласились, что вы проверяете только если что-то создано если вы сознательно выбрали, что, будучи создан не является обязательным. Вы можете сделать это следующим образом:
- При первой же возможности, обеспечить ссылочную переменную/поле инициализируется в ноль. Таким образом, гарантируется присвоение значения, которое означает, что объект не создан. (Да, именование немного искажено.)
- Вы можете установить ссылку на vairable/field на новый экземпляр объекта или установить его, скопировав другую ссылку на уже существующий объект. (Обратите внимание на существующий Другой крупный также может быть ноль, но это не вызывает никаких проблем.)
- Если вы когда-нибудь уничтожить объект (или даже просто хотите прекратить его использование с этой ссылки), установите переменную/полевые ссылки на nil еще раз.
- ПРИМЕЧАНИЕ: Delphi уже инициализирует поля членов нового класса. Поэтому им не потребуется особого внимания.
посмотрите на это: http://stackoverflow.com/questions/132725/are-delphi-variables-initialized-with-a-value-by-default – idursun
«переменная класса уже выполнил его создать метод «переменные не имеют никаких методов! 'var o: TObject; i: целое число; s: строки; i: = TStringList.Create.Count; s: = TStringList.UnitName; o: = TStringList.Create; '- каждый из трех операторов имеет одну и ту же структуру: существует какое-либо любое выражение, которое вычисляет какое-либо значение; и существует переменная, в которой сохраняется значение (но не выражение, оно больше не существует в этой точке). Когда выполняется выражение (с этими «методами»), еще нет var. Когда приходит вар, чтобы играть - больше нет выражения –