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

Svi*_*vip 4 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

[dcc32 Error] Unit1.pas(51): E2124 Instance member 'FTest' inaccessible here
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 6

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

在类方法中Self引用类.该文件说:

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

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

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

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

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

我没有看到这部分语言固有的特殊危险.事实上,使用Self缩小范围可以减少无意中引用局部变量而不是类成员的危险.

  • @LeonardoHerrera 这不是惯用的意思。您可以说,在 C++ 中,将常量放在比较表达式的左侧是惯用的做法(以防止在您的意思是 == 时写 =),但在 Delphi 中,即使您可以这样做,也不会这样做。换句话说,惯用语不是关于语言中的可能性,而是关于大多数程序员如何表达事物。 (2认同)