функция Rect объявлена в двух единицах:Delphi XE2: Rect неоднозначность?
System.Classes.Rect
System.Types.Rect
Почему эта неоднозначность? Является ли одна из этих функций устаревшей? Какой из них предпочтительнее?
функция Rect объявлена в двух единицах:Delphi XE2: Rect неоднозначность?
System.Classes.Rect
System.Types.Rect
Почему эта неоднозначность? Является ли одна из этих функций устаревшей? Какой из них предпочтительнее?
Из документации System.Types.Rect
принимает целочисленные значения для четырех углов прямоугольника; System.Classes.Rect
, с другой стороны, также обеспечивает перегрузку, которая принимает два TPoint
s - один для верхнего левого, один для нижнего правого. Оба возвращают TRect
, поэтому это действительно вопрос выбора, который вы используете.
Последнее является более гибким (предлагает две перегрузки), так что, вероятно, лучше, чтобы убедиться, что вы включили Classes
после Types
в вашем предложении Uses (при использовании обоих), чтобы не скрывать более универсальный метод, предоставленный Classes
.
Или просто правильно уточните, какой из них вы хотите использовать в своем коде, объявив эту переменную как «var R: Classes.Rect' или« var R: Types.Rect », поэтому в дальнейшем не будет неопределенности, если изменяет предложение uses. :-) Я также не уверен, что буду использовать «мощный», чтобы описать разницу; может быть, «более гибкий» будет лучшим выбором? –
@KenWhite - это функции, а не типы ... в любом случае это будет «var R: TRect», назначенный как «R: = Classes.Rect (args)» или «R: = Types.Rect (args) '. Или это слишком поздно, и я скремблировал? Вероятно, вы бы этого не сделали, так как цель этих функций состоит в том, чтобы обойти локальную переменную при назначении свойства 'TRect' некоторого другого класса. Дело в том, что если вы используете 'Rect' с' TPoint' args, тогда объявление 'Types' после' Classes' скроет перегрузку, которая заставляет ее работать. Я думаю, вы всегда можете использовать 'Classes.Rect (args)', чтобы защититься от этого. –
Извините. Ты прав; Я неправильно понял вопрос. :-) Мой комментарий все еще применяется; если у вас есть двусмысленность единицы, которая зависит от порядка в предложении uses, и вы можете избежать этого, четко указав, какой из них вы имеете в виду, обычно это лучше сделать. Таким образом, 'R: = Classes.Rect (args);' тоже будет работать, и он дает понять, что вы ссылаетесь на конкретные функции из единицы 'Classes'. Но это, вероятно, не так важно здесь, пока компилятор может сказать, что вы имели в виду. :-) Я все еще думаю, что буду использовать «более гибкую», но это просто придирчиво. : D –
Если вы звоните Rect
в плотной петле (что не делает ввода/вывода или аналогичного), подумайте о вызове types.Rect
, что и есть classes.Rect
; он вызывает types.Rect
(но тогда вам может понадобиться встроить свой собственный Rect ...). В противном случае это не имеет значения, я бы не стал беспокоиться, включая «типы» в «использовании», чтобы сохранить один уровень косвенности.
Да, удалил мой комментарий после того, как вы добавили бит о inlining ... Я предполагаю, что я имел в виду, что если производительность была соображением, тогда выбор не был бы между 'Types.Rect' и' Classes.Rect' - если сборка Rect является узким местом, тогда, как вы говорите, есть лучшие варианты, чем любой из них. –
@J ... Согласен, спасибо за ваш комментарий. :) –
Имеют ли они одинаковые параметры? – lurker