Delphi中的实例引用是什么?

7

在Delphi中,“this”的等效物是“Self”。您能否举几个例子来说明其用法?

2个回答

9

在Delphi中,Self相当于this。它也可以像这里描述的那样进行赋值。


3
请注意,由于它是按值传递的,因此对Self进行赋值并没有太大用处,尽管可以这样做。它不会像一些人可能期望的那样从构造函数中“返回”nil(实际上,构造函数并没有“返回”任何东西-赋值语法只是一种便利方式)。 - Rudy Velthuis
1
嗯...我看到你提供的SO问题链接中的人们也说了同样的话。 - Rudy Velthuis
1
禁止使用with语句,因为它会使事情变得更加复杂。 - too
嗯,是的,但这与Self有什么关系呢? - Rudy Velthuis
@Mikey:好的,但不知怎么回事,他写的东西有点说不通。Self 参与了很多事情,当然没错,但 with 和将 Self 设置为 nil 是正交的。 - Rudy Velthuis
显示剩余5条评论

4

在大多数情况下,你不应该在方法中使用self

事实上,在类方法中访问类的属性和方法时,就像有一个隐式的self.前缀一样:

type
  TMyClass = class
  public
    Value: string;
    procedure MyMethod;
    procedure AddToList(List: TStrings);
  end;


procedure TMyClass.MyMethod;
begin
  Value := 'abc';
  assert(self.Value='abc'); // same as assert(Value=10)
end;

self关键字用于将当前对象传递给另一个方法或对象。

例如:

procedure TMyClass.AddToList(List: TStrings);
var i: integer;
begin
  List.AddObject(Value,self);
  // check that the List[] only was populated via this method and this object
  for i := 0 to List.Count-1 do 
  begin
    assert(List[i]=Value);
    assert(List.Objects[i]=self);
  end;
end;

上面的代码将向TStrings列表添加一个元素,其中List.Objects[]指向TMyClass实例。它还会检查所有列表项是否都是这种情况。


@AB - “implicit self” - 自从我开始使用需要在引用任何内部类成员时使用“self”的Python,我也开始在Delphi中这样做了-不确定我是否喜欢它的风格,但它似乎有助于更快地扫描代码。 - Vector
@Mikey 在 Delphi 中的常见做法是不使用 self. 前缀。实际上,IDE 智能感知功能允许您快速访问属性名称,或通过鼠标弹出提示或 Ctrl+单击查看声明 - 因此没有必要指定此前缀。如果您不在代码中定义全局变量(这是良好代码所必需的),则知道方法代码中的标识符是属性/方法名称。因此,在方法中不应使用 self. 前缀(除非在 with 语句内部)。 - Arnaud Bouchez
@AB - 我知道并同意你所说的一切,但这并不否定我使用它的原因。如果你想要扫描/快速阅读一段代码,“self”有帮助——通常我喜欢坐下来只是阅读代码,没有任何鼠标或交互,我还喜欢打印出代码然后阅读。所以这是一种“自助”的方法...哈哈 - Vector
@Mikey 我明白一开始这样做可能会“帮助你自己” ;) 但是当你对Delphi中的隐式标识符(如单元名称或self类实例)有了一些了解后,你会发现它具有某种优雅性并且输入量更少。在Python中,用缩进替换begin/end可以减少输入(即使我通常不写任何end因为我的IDE会为我完成,而且在法语键盘上键入begin{键更快),但是self.使得Python代码变得冗长。;) - Arnaud Bouchez
@AB-我一直在使用Delphi编程,从1.0版本开始就不断地进行 - 我有大量的隐式标识符样式的经验 - 这就是为什么我说,在风格上我对限定“self”并非很热衷。除非绝对必要,我从未限定过self(或Delphi中的任何其他东西)。但在使用C#和Python之后,我发现限定名称可以帮助提高清晰度和安全性。因此,我对这个问题持有矛盾的态度 - 隐式解析的简洁性、效率和优雅性值得一提,但限定语法也能提供更多的清晰度和安全性。 - Vector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接