Именованные / необязательные параметры в Delphi? - PullRequest
12 голосов
/ 20 мая 2009

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

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

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

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

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

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

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


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

Ответы [ 3 ]

19 голосов
/ 20 мая 2009

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

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

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

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

5 голосов
/ 20 мая 2009

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

procedure DoSomething(AParam : integer = 0);

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

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

не так:

procedure DoSomething(AParam : integer = 0; ASecondParam : string);
4 голосов
/ 20 мая 2009

Это в основном "взлом компилятора для объектов автоматизации". Мне иногда приходится использовать его для автоматизации 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...