我是Delphi的新手,我一直在运行一些测试来查看默认情况下初始化了哪些对象变量和堆栈变量:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Run Code Online (Sandbox Code Playgroud)
这是我习惯使用其他语言的行为,但我想知道在Delphi中依赖它是否安全?例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作.依赖于对象的默认初始化值是正常的,还是在构造函数中显式设置所有实例变量?
至于堆栈(过程级)变量,我的测试显示单位化布尔值为真,单位化整数为2129993264,未初始化对象只是无效指针(即不是nil).我猜测规范是在访问它们之前始终设置过程级变量?
函数的Result变量是否有任何保证的默认值,如0,''或nil?或者结果总是在使用前初始化?
我有一个函数返回一个这样的字符串:
function Foo(): String
begin
while {...} do
Result := Result + 'boingbumtschak';
end;
Run Code Online (Sandbox Code Playgroud)
它运行正常,但现在我得到一些字符串,其中包含之前调用该函数的内容.当我Result := ''在开头添加一个,它没关系.我什么时候应该初始化Result变量,什么时候不需要?(字符串,基元,类实例(零))
我在类的方法中使用由字符串,布尔值,整数,货币和其他记录数组组成的记录.我想以递归方式初始化基本类型的所有字段为空/假/零.默认情况下,Delphi似乎不这样做.是否有一种直接的方法来实现这一点,不涉及通过名称访问每个字段并手动设置它?
我需要澄清这个案子.
根据我的测试,Result变量定义为:Boolean = False,Integer = 0,String ='',Object = nil等来自第一行.但我从未见过这方面的官方参考.它也有意义,因为这给出了提示.
[DCC警告] Unit1.pas(35):H2077分配给'TForm1.Test'的值从未使用过
function TForm1.Test: Boolean;
begin
Result := False;
// Some arbitrary code here
Result := True;
end;
Run Code Online (Sandbox Code Playgroud)
但是如果我注释掉第一行并且在最后一行之前的某个地方有异常会发生什么?结果=假吗?
如果Result未定义,这意味着我总是必须通过在以后异常的情况下定义Result来启动每个函数.这对我来说毫无意义.
当我编译这段代码
{$WARNINGS ON}
function Test(s: string): string;
var
t: string;
d: double;
begin
if s = '' then begin
t := 'abc';
d := 1;
end;
Result := t + FloatToStr(d);
end;
Run Code Online (Sandbox Code Playgroud)
我收到警告"变量'd'可能尚未初始化",但我没有得到变量't'的相同警告.这似乎不一致.这段代码只是一个显示编译器警告的简单示例,但我刚刚在我的实时代码中发现了一个错误,该错误会被未初始化的字符串变量的编译时警告捕获.我可以在Delphi 6中以某种方式切换此警告吗?或者在较新版本的Delphi中?
综述:
请查看以下知识渊博的评论.
================================================== ============
我已经看到了managed types 很多stackoverflow Delphi主题中提到的术语.例如,它在主题中提到correctly initializing/finalizing.但是,当我谷歌时managed types,似乎大多数链接都与C++或.NET有关.例如,请参阅MSDN页面.有人可以帮助评论Delphi中定义的托管类型吗?鉴于Delphi for POSIX/MacOS正在诞生,是Windows特有的托管类型吗?感谢您提前付出的努力和时间!
PS:主题correctly initializing/finalizing:
在Delphi中初始化哪些变量?
delphi变量是否默认使用值初始化?
我应该如何在Delphi 7析构函数中释放一组对象?
在Delphi 2009中,我是否需要释放变体数组?
type Tmyclass = class(TObject)
somearray: array of TSometype
FBool: Boolean;
Fint: Integer;
Fstr: string;
constructor Create;
destructor Destroy; override;
end;
implementation
constructor Tmyclass.Create;
begin
inherited;
SetLength(somearray,0); //is this needed?
end;
destructor TmyClass.Destroy;
begin
SetLength(somearray,0); //this IS needed!
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
还有什么类型在创建时初始化?例如我在课堂上宣布的内容.FBool被保证是假的吗?是FInt保证是0吗?是Fstr保证是''?
当地情况怎么样?只有字符串?
我使用Delphi XE.
我需要在框的中心绘制文本.必须在每行上以一个字符水平对齐绘制文本.
我附上了一个字符串"class"的例子.

我可以绘制单个字符,但我希望有更快的方法来实现它.
有没有办法通过使用代码计算数组中有多少元素?
例如:
arrName : array[1..20] of string;
Run Code Online (Sandbox Code Playgroud)
我已经知道该数组中存储了6个名称,但是如何使用编码来确定?
在较旧的程序代码的审查过程中出现以下问题:方法中的所有局部变量在开始之后立即初始化.通常局部变量未初始化.但我们有一个程序,所有变量都初始化为0.是否有人知道如何发生这种情况?
例:
type
TPrices = array[0..10, 0..5] of Integer;
procedure DoSomething();
var
mPrices : TPrices;
mValue : Integer;
begin
if (mPrices[0,0] = 0) then
MessageDlg('Zero', mtInformation, [mbOK], 0);
if (mValue = 0) then
MessageDlg('Zero Integer', mtInformation, [mbOK], 0);
end;
Run Code Online (Sandbox Code Playgroud)