全局变量

全局变量的所有类型,默认编译器都会初始化成“ 零值” ,你懂得 零值的意思,即:integer = 0; string = ''; class = nil;

我用class举个例子,其它的请自测:

先定义两个类用于测试:

  TAddress = class
  private
    province: string;
    city: string;
    district: string;
  end;

  TPerson = class
  private
    name: string;
    add: TAddress;
  end;

image

局部变量

从上面的例子我们就可以看到,若局部变量是 class类型,则没有初始化,其它类型呢?

先说结论:局部变量若是 string/variant/interface 这类生命周期 自动管理的会初始化,其它非生命周期自动管理的不初始化,接下来

用string举个例子,其它的自测:

image

类字段变量

image

结论

  1. 所有全局变量,不论何种类型,都会自动初始化的(0),而局部变量中只有string/variant/interface 类型的才初始化;

  2. 类变量 会在类初始化的时候,初始化所有字段 归为“零值”;这个很好,就是要这样,避免程序出问题;

  3. 一定要避免开发中,使用局部指针类型,不初始化的情况下 判断 是否为nil,举例:

    procedure TForm2.Button2Click(Sender: TObject);
    var
      p1: TPerson;
    begin
      if p1 = nil then
      begin
        //p1 一定不为nil,所以写代码时候,要避免这样
      end;
    end;
    

原因猜测

局部变量不初始化的原因可能是节省cpu时间,初始化是需要时间的,虽然很小,但是有时候做的是无用功,
比如
var
i: integer;

如果初始化为0,但是我希望的是1,
则出现两次初始化了
begin
i := 1;
...

至于string/variant/interface类型,因为是生存期自管理对象,函数退出前会自动减少它们的引用计数,所以必须初始化为nil

另外,不初始化局部变量也算是编译器的一种简化或者说节省编译器开发人的开发和调试时间吧,我个人认为自动初始化局部变量比较好,,,起码我们这些使用者不用打那么多初始化代码,

posted on 2024-02-21 14:21  del88  阅读(91)  评论(0编辑  收藏  举报