该类TStream
包含许多WriteData
具有这种形式的重载:
function WriteData(const Buffer: Int32; Count: Longint): Longint; overload;
所有常见的嫌疑人都有重载,AnsiChar
, Char
, UInt32
,Double
等等。同样对于ReadData
。我试图了解该Count
参数的用途。上面提到的重载的实现如下:
function TStream.Skip(Amount: Integer): Integer;
var
P: Integer;
begin
P := Position;
Result := Seek(Amount, soCurrent) - P;
end;
function TStream.WriteData(const Buffer: Int32; Count: Longint): Longint;
const
BufSize = SizeOf(Buffer);
begin
if Count > BufSize then
Result := Write(Buffer, BufSize) + Skip(Count - BufSize)
else
Result := Write(Buffer, Count)
end;
我显然可以看到这段代码做了什么,但我不明白为什么执行部分写入是有意义的。为什么用 调用这个函数有意义Count < BufSize
?然后行为非常奇怪。
有谁知道为什么要添加这些重载以及它们的目的是什么?自然地,我查看了对这些方法无话可说的文档。
顺便说一句,我将提交有关此行的错误报告:
Result := Write(Buffer, BufSize) + Skip(Count - BufSize);
假设调用 toWrite
将发生在调用 to 之前是错误的Skip
。+
未定义运算符的操作数的评估顺序。这段代码应该这样写:
Result := Write(Buffer, BufSize);
inc(Result, Skip(Count - BufSize));