2013-05-29 6 views
1

функция Rect объявлена ​​в двух единицах:Delphi XE2: Rect неоднозначность?

System.Classes.Rect
System.Types.Rect

Почему эта неоднозначность? Является ли одна из этих функций устаревшей? Какой из них предпочтительнее?

+0

Имеют ли они одинаковые параметры? – lurker

ответ

3

Из документации System.Types.Rect принимает целочисленные значения для четырех углов прямоугольника; System.Classes.Rect, с другой стороны, также обеспечивает перегрузку, которая принимает два TPoint s - один для верхнего левого, один для нижнего правого. Оба возвращают TRect, поэтому это действительно вопрос выбора, который вы используете.

Последнее является более гибким (предлагает две перегрузки), так что, вероятно, лучше, чтобы убедиться, что вы включили Classes после Types в вашем предложении Uses (при использовании обоих), чтобы не скрывать более универсальный метод, предоставленный Classes.

+0

Или просто правильно уточните, какой из них вы хотите использовать в своем коде, объявив эту переменную как «var R: Classes.Rect' или« var R: Types.Rect », поэтому в дальнейшем не будет неопределенности, если изменяет предложение uses. :-) Я также не уверен, что буду использовать «мощный», чтобы описать разницу; может быть, «более гибкий» будет лучшим выбором? –

+0

@KenWhite - это функции, а не типы ... в любом случае это будет «var R: TRect», назначенный как «R: = Classes.Rect (args)» или «R: = Types.Rect (args) '. Или это слишком поздно, и я скремблировал? Вероятно, вы бы этого не сделали, так как цель этих функций состоит в том, чтобы обойти локальную переменную при назначении свойства 'TRect' некоторого другого класса. Дело в том, что если вы используете 'Rect' с' TPoint' args, тогда объявление 'Types' после' Classes' скроет перегрузку, которая заставляет ее работать. Я думаю, вы всегда можете использовать 'Classes.Rect (args)', чтобы защититься от этого. –

+4

Извините. Ты прав; Я неправильно понял вопрос. :-) Мой комментарий все еще применяется; если у вас есть двусмысленность единицы, которая зависит от порядка в предложении uses, и вы можете избежать этого, четко указав, какой из них вы имеете в виду, обычно это лучше сделать. Таким образом, 'R: = Classes.Rect (args);' тоже будет работать, и он дает понять, что вы ссылаетесь на конкретные функции из единицы 'Classes'. Но это, вероятно, не так важно здесь, пока компилятор может сказать, что вы имели в виду. :-) Я все еще думаю, что буду использовать «более гибкую», но это просто придирчиво. : D –

3

Если вы звоните Rect в плотной петле (что не делает ввода/вывода или аналогичного), подумайте о вызове types.Rect, что и есть classes.Rect; он вызывает types.Rect (но тогда вам может понадобиться встроить свой собственный Rect ...). В противном случае это не имеет значения, я бы не стал беспокоиться, включая «типы» в «использовании», чтобы сохранить один уровень косвенности.

+0

Да, удалил мой комментарий после того, как вы добавили бит о inlining ... Я предполагаю, что я имел в виду, что если производительность была соображением, тогда выбор не был бы между 'Types.Rect' и' Classes.Rect' - если сборка Rect является узким местом, тогда, как вы говорите, есть лучшие варианты, чем любой из них. –

+0

@J ... Согласен, спасибо за ваш комментарий. :) –