TStringStream 类中没有类型的参数是什么类型:
function Read(var Buffer; Count: Longint): Longint; override;
Buffer 参数的类型是什么(它是 Pointer 的类型吗?)。
TStringStream 类中没有类型的参数是什么类型:
function Read(var Buffer; Count: Longint): Longint; override;
Buffer 参数的类型是什么(它是 Pointer 的类型吗?)。
几年前我写了一篇关于这个话题的文章:
在少数情况下使用无类型参数;你问的TStream.Read
方法最接近Move
我写的程序。这是一段摘录:
procedure Move(const Source; var Dest; Count: Integer);
该
Move
过程将数据从任意变量复制到任何其他变量。它需要接受所有类型的源和目标,这意味着它不能要求任何单一类型。该过程不会修改为 传递的变量的值Source
,因此参数的声明使用const
代替var
,这是无类型参数更常见的修饰符。
在 的情况下TStream.Read
,源是流的内容,因此您不要将其作为参数传递,但目标是Buffer
问题中显示的参数。您可以为该参数传递所需的任何变量类型,但这意味着您需要小心。确保流的内容确实是您提供的参数类型的有效值是您的工作,而不是编译器的工作。
阅读我文章的其余部分,了解更多 Delphi 使用无类型参数的情况。
查看 Delphi 帮助中的“无类型参数”
你可以传入任何类型,但你必须在实现中强制转换它。帮助说您不能将数字或无类型的数字常量传递给它。所以基本上你必须知道期望什么类型,编译器无法帮助你,所以你需要一个很好的理由这样做。我想如果您需要该方法来处理不兼容的类型,它可能会很有用,但是您可以再次为每种预期类型编写几个重载版本,我建议将其作为更好的解决方案。
也许令人惊讶的是,将取消引用的指针作为无类型参数传递是合法的。并且指针本身甚至不必具有类型。
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() 的参数是一个指针,这可能会更容易,但这可能不在您的控制之下。
var
在参数列表中是引用调用的 Delphi 语法。它可以键入为例如 Listview 的 OnChanging 处理程序中的 AllowChange 参数:
procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
if SomeProblemOccurred then
AllowChange := False;
end;
或在您的示例中未键入。