13

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

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

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

4

4 回答 4

24

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

什么是无类型参数?

在少数情况下使用无类型参数;你问的TStream.Read方法最接近Move我写的程序。这是一段摘录:

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

Move过程将数据从任意变量复制到任何其他变量。它需要接受所有类型的源和目标,这意味着它不能要求任何单一类型。该过程不会修改为 传递的变量的值Source,因此参数的声明使用const代替var,这是无类型参数更常见的修饰符。

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

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

于 2009-12-18T15:38:23.517 回答
4

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

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

于 2009-12-18T14:59:17.170 回答
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() 的参数是一个指针,这可能会更容易,但这可能不在您的控制之下。

于 2010-08-23T10:02:08.267 回答
-1

var在参数列表中是引用调用的 Delphi 语法。它可以键入为例如 Listview 的 OnChanging 处理程序中的 AllowChange 参数:

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

或在您的示例中未键入。

于 2009-12-18T15:06:03.863 回答