Delphi中的无类型/无类型参数

时间:2009-12-18 14:19:41

标签: delphi parameters typing

没有类型的参数是什么类型,如类TStringStream:

function Read(var Buffer; Count: Longint): Longint; override;

Buffer参数的类型是什么(它是一种Pointer?)。

4 个答案:

答案 0 :(得分:21)

几年前我写了一篇关于这个话题的文章:

  

What is an untyped parameter?

在少数情况下使用无类型参数;您询问的TStream.Read方法与我撰写的Move程序最匹配。这是一段摘录:

procedure Move(const Source; var Dest; Count: Integer);
     

Move过程从任意变量复制数据   进入任何其他变量。它需要接受来源和目的地   所有类型,这意味着它不需要任何单一类型。程序,流程   不会修改为Source传递的变量的值,所以   参数的声明使用const而不是var,即{。}}   更常见的无类型参数修饰符。

对于TStream.Read,源是流的内容,因此您不会将其作为参数传递,但目标是问题中显示的Buffer参数。您可以为该参数传递任何所需的变量类型,但这意味着您需要小心。它是您的作业,而不是编译器,以确保流的内容确实是您提供的参数类型的有效值。

阅读本文的其余部分,了解Delphi使用无类型参数的更多情况。

答案 1 :(得分:3)

查看“无类型参数”的Delphi帮助

您可以传入任何类型,但必须在实现中强制转换它。帮助说你不能传递数字或无类型的数字常量。所以基本上你必须知道期望什么类型,编译器无法帮助你,所以你需要一个很好的理由这样做。我想如果你需要这个方法来处理不兼容的类型,它可能会有用,但是你可以为每个预期的类型编写几个重载版本,我建议这是一个更好的解决方案。

答案 2 :(得分:0)

参数列表中的

varcall by reference的Delphi语法。它可以是键入,例如Listview的OnChanging处理程序中的AllowChange参数:

procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
  if SomeProblemOccurred then
    AllowChange := False;
end;

无类型,如您的示例所示。

答案 3 :(得分:0)

也许令人惊讶的是,将解除引用的指针作为无类型参数传递是合法的。指针本身甚至不必有类型。

procedure SomeMethod(var aParameter);
  ∶

procedure CallSomeMethod(aIsInteger : Boolean);
type
  buffer    : Pointer;
  intValue  : Integer;
  realValue : Single;
begin
  if aIsInteger then
  begin
    buffer := @intValue;
  end
  else
  begin
    buffer := @realValue;
  end;
  SomeMethod(buffer^);

当然,如果SomeMethod()的参数是指针,那可能会更容易,但这可能不在你的控制之下。