Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么要保留字符串变量来执行TStringStream的默认初始化?_Delphi - Fatal编程技术网

Delphi 为什么要保留字符串变量来执行TStringStream的默认初始化?

Delphi 为什么要保留字符串变量来执行TStringStream的默认初始化?,delphi,Delphi,这是出于好奇的问题。我在研究前一个问题的ObjectBinaryToText行为时偶然发现了这个示例。第5行声明string变量,然后代码隐式地依赖于管理的长字符串,从不初始化该字符串,然后在第9行中使用它初始化TStringStream。我认为这个代码不是100%正确,但我想知道为什么这里包含s?(看不出背后有任何理由) 资料来源:。这只是一段略显草率的代码。应该这样写: StrStream := TStringStream.Create; 不需要变量s,但由于它是受管理的,因此它被初始化为

这是出于好奇的问题。我在研究前一个问题的ObjectBinaryToText行为时偶然发现了这个示例。第5行声明
string
变量,然后代码隐式地依赖于管理的长字符串,从不初始化该字符串,然后在第9行中使用它初始化
TStringStream
。我认为这个代码不是100%正确,但我想知道为什么这里包含
s
?(看不出背后有任何理由)


资料来源:。

这只是一段略显草率的代码。应该这样写:

StrStream := TStringStream.Create;
不需要变量
s
,但由于它是受管理的,因此它被初始化为
nil
,因此代码的含义是正确的。在你问题中的代码中,
s='
,因此该代码相当于调用无参数构造函数

即使原因如Mason假设的那样(这当然是合理的),代码也应该被编写成
TStringStream.Create(“”)
,以便在缺少无参数构造函数的旧版本的Delphi上工作


在问题代码中声明
s
的一个副作用是在方法周围添加了一个不必要的隐式try/finally块。同样,这是良性的,但您也可以避免它。

很难说清楚,但如果我不得不猜测,答案可能是“TStringStream在当前版本中不需要将字符串传递给构造函数,但在Delphi的早期版本中它需要,而且这段代码非常古老,(可能可以追溯到D1)所以它仍然是这样写的,因为它工作得很好,从来没有人修改过它。”

这仍然不能解释为什么创建字符串变量而不是传递空字符串常量。@smasher:很晚了,我已经有几次吉尼斯世界纪录了,但都是旧的代码您可能会遇到错误“数据类型必须相同”@Dispatcher只有当参数声明为
var
时才会发生这种情况。花了一些时间,但我发现关于字符串参数的断言是绝对正确的(不知道D3是什么,但从D4开始)。而且这个参数始终是
const
(同样,D4)这是否意味着接口也被初始化为
nil
?这很好。@smasher字符串、接口、动态数组、匿名方法-我认为这涵盖了所有内容。@Rob Argh,你比我快了20秒!但我想现在真的是这样:…以及包含引用计数类型的记录(注意这里的strings=AnsiString+UnicodeString+WideString),甚至是递归的。它是在System.pas单元中的
\u InitializeArray()
低级过程中完成的,用于动态数组和记录,并通过自动生成的代码初始化局部变量的堆栈来完成的。:)
StrStream := TStringStream.Create;