Именованные/необязательные параметры в Delphi?

В одном из демонстрационных приложений Delphi я наткнулся на некоторый синтаксис, который я не знал, когда принимал компилятор Delphi:

// ......\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto\SrvComp\Word\    
// Main.pas, line 109

Docs.Add(NewTemplate := True); // note the assignment

Я не могу воспроизвести этот тип параметров, проходящих в моем собственном коде, и я никогда не вижу, чтобы кто-нибудь использовал его. Итак, это мои вопросы:

  • Могу ли я использовать это в "обычных" методах и является ли он частью "языка Delphi", или это какой-то компилятор для объектов автоматизации?

  • Что нужно, чтобы иметь возможность использовать это?

  • Это что-то вроде С# 4 и необязательных параметров?


Дополнительная информация: Обычно я прохожу записей или простых классов, когда есть множество необязательных параметров для методы, но похоже, что я не буду нужно, чтобы с этим синтаксисом. Я в курсе значений параметров по умолчанию, но их полезность ограничена, потому что вы не может предоставить какие-либо параметры для право пропущенного. В JavaScript Я использую этот именованный параметр style все время (будь то с разными синтаксис), и он мощный.

Ответ 1

Очевидно, что язык Delphi поддерживает именованные параметры, так как они появляются прямо в образце кода Delphi. Delphi поддерживает именованные параметры объектов автоматизации, которые являются объектами, реализующими интерфейс IDispatch. Существуют ограничения на типы, которые могут иметь параметры и типы возвращаемых данных; в частности, они не могут быть классами Delphi.

Я не думаю, что удобство, которое вы ищете по именованным параметрам, перевешивало бы эффективность, которую вы могли бы предпринять, если бы каждый вызов метода маршрутизировался через IDispatch.Invoke. Для вызова также может потребоваться сначала GetIDsOfNames. Вы не видите этого в большем количестве кода, потому что последнее связывание обычно пытается избежать. Используйте раннее связывание, когда это возможно, чтобы избежать затрат на поиск идентификаторов отправки и косвенных вызовов метода.

Delphi поддерживает необязательные параметры в коде без автоматизации, позволяя значения по умолчанию. Вы можете опустить фактические параметры для любого параметра со значением по умолчанию, если вы также опускаете фактические параметры всех последующих параметров - компилятор гарантирует, что это объявление допускает это.

Я думаю, что дополнительные параметры переоценены. Они экономят время для (одного) человека, написавшего код, но не для (многих) людей, читающих код. Тот, кто его читает, должен знать, какие значения по умолчанию будут иметь какие-либо неуказанные параметры, поэтому вы можете просто указать все значения явно в любом случае.

Ответ 2

В основном это "компилятор для взлома объектов автоматизации". Иногда мне приходится использовать его для автоматизации Excel и Word.

например.

  MSExcel.Application.Cells.Replace(What:='', Replacement:='', LookAt:=xlPart,
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True);

эквивалентен VBA

Application.Cells.Replace(What='', Replacement='', LookAt=xlPart, _
   SearchOrder=xlByRows, MatchCase=False, SearchFormat=True, ReplaceFormat=True)

Ответ 3

Если вы заявляете свою процедуру следующим образом:

procedure DoSomething(AParam : integer = 0);

... он примет значение 0 для параметра, если оно не задано. Как я помню, параметры со значениями по умолчанию должны быть в конце вызова, так вот:

procedure DoSomething(AFirstParam : string; AParam : integer = 0);

не так:

procedure DoSomething(AParam : integer = 0; ASecondParam : string);