没有类型的参数是什么类型,如类TStringStream:
function Read(var Buffer; Count: Longint): Longint; override;
Buffer参数的类型是什么(它是一种Pointer?)。
答案 0 :(得分:21)
几年前我写了一篇关于这个话题的文章:
在少数情况下使用无类型参数;您询问的TStream.Read
方法与我撰写的Move
程序最匹配。这是一段摘录:
procedure Move(const Source; var Dest; Count: Integer);
Move
过程从任意变量复制数据 进入任何其他变量。它需要接受来源和目的地 所有类型,这意味着它不需要任何单一类型。程序,流程 不会修改为Source
传递的变量的值,所以 参数的声明使用const
而不是var
,即{。}} 更常见的无类型参数修饰符。
对于TStream.Read
,源是流的内容,因此您不会将其作为参数传递,但目标是问题中显示的Buffer
参数。您可以为该参数传递任何所需的变量类型,但这意味着您需要小心。它是您的作业,而不是编译器,以确保流的内容确实是您提供的参数类型的有效值。
阅读本文的其余部分,了解Delphi使用无类型参数的更多情况。
答案 1 :(得分:3)
查看“无类型参数”的Delphi帮助
您可以传入任何类型,但必须在实现中强制转换它。帮助说你不能传递数字或无类型的数字常量。所以基本上你必须知道期望什么类型,编译器无法帮助你,所以你需要一个很好的理由这样做。我想如果你需要这个方法来处理不兼容的类型,它可能会有用,但是你可以为每个预期的类型编写几个重载版本,我建议这是一个更好的解决方案。
答案 2 :(得分:0)
var
是call 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()的参数是指针,那可能会更容易,但这可能不在你的控制之下。