Именованные и необязательные параметры в Дельфи?

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

// ......DemosDelphiWin32VCLWin32ActiveXOleAutoSrvCompWord    
// Main.pas, line 109

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

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

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

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

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


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

3 ответов


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

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

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

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


Если вы объявите свою процедуру так:

procedure DoSomething(AParam : integer = 0);

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

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

не так:

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

это в основном "некоторый взлом компилятора для объектов автоматизации". Иногда мне приходится использовать его для автоматизации 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)