当类方法使用self时,为什么Delphi编译器不会发出警告?

时间:2013-04-17 08:12:57

标签: delphi

在我的工作场所,我们有一些代码class function引用Self,如果对象未初始化,则会有效地创建潜在的访问冲突。 Self的含义是否在类方法中更改为引用类而不是对象?

我认为这是唯一的原因是因为Self引用了另一个class function,而不是常规方法。

我创建了以下测试类:

constructor TTest.Create;
begin
  FTest := 'Hej';
end;

procedure TTest.GoTest;
begin
  ShowMessage(FTest);
end;

class procedure TTest.Test;
begin
  Self.GoTest;
end;

但是,编译它会引发错误:

[dcc32 Error] Unit1.pas(51): E2076 This form of method call only allowed for class methods or constructor

我还测试直接参考FTest,这给出了另一个错误:

[dcc32 Error] Unit1.pas(51): E2124 Instance member 'FTest' inaccessible here

但我想知道,是否有可能出现Self在类方法中存在潜在危险的情况。

我知道,指的是全局物体,并假设它们总是坏的。

1 个答案:

答案 0 :(得分:6)

  

Self的含义是否在类方法中更改为引用类而不是对象?

在类方法Self中引用类。 documentation说:

  

在类方法的定义声明中,标识符Self表示调用方法的类(可以是定义它的类的后代。)如果在类C中调用该方法,则Self属于C的类型类。因此,您无法使用Self访问实例字段,实例属性和普通(对象)方法。您可以使用Self来调用构造函数和其他类方法,或者访问类属性和类字段。

     

可以通过类引用或对象引用来调用类方法。当通过对象引用调用它时,对象的类将成为Self的值。

编译器不会使用Self反对您,因为它是合法且受支持的事情。当你尝试使用实例成员,实例方法等时,它就会抱怨。

Self在类方法中具有这种含义,其原因与实例方法中存在的完全相同。它允许您完全指定符号,从而避免范围模糊。更重要的是,它允许您访问调用该方法的实际类。这可能是定义方法的类的后代。

  

但是,我想知道是否有可能出现Self在类方法中存在潜在危险的情况。

我认为这部分语言没有特别的危险。事实上,Self的使用减少了范围,因此降低了无意中引用局部变量而不是类成员的危险。