【问题标题】:Instance reference in Delphi?Delphi中的实例引用?
【发布时间】:2011-07-22 22:14:07
【问题描述】:

C++ 中“this”的 Delphi 等价物是什么?你能举一些它的使用例子吗?

【问题讨论】:

    标签: delphi freepascal


    【解决方案1】:

    在delphi中Self相当于这个。它也可以按照here 中的说明进行分配。

    【讨论】:

    • 请注意,由于是传值,所以赋值给 Self 用处不大,虽然可以做到。它不会像某些人所期望的那样从构造函数“返回” nil(构造函数实际上不会“返回”任何东西 - 赋值语法只是为了方便)。
    • 嗯...我看到您所链接的 SO 问题中的人也这么说。
    • 分配给 Self 是一个极端情况,通常你不需要这样做,因为它可能被认为是一种不好的做法。然而,仅当使用非标准命名约定时,使用 Self 作为对类的引用才有用。标准约定是使用 F 作为类变量的前缀(例如 FIsCorrect)和 A 作为过程/函数参数(AIsCorrect)。然后,类变量的分配就像 FIsCorrect := AIsCorrect 一样简单,或者如果函数(过程)参数为:IsCorrect: Boolean,则需要使用 Self.IsCorrect := IsCorrect。
    • 应该禁止使用 with 语句,因为它会使事情变得更加复杂。
    • 也是:嗯,是的,但这与自我有什么关系?
    【解决方案2】:

    在大多数情况下,您不应在方法中使用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 - “隐式自我” - 因为我开始使用 Python,它在引用任何内部类成员时需要“自我”,所以我也开始在 Delphi 中这样做 - 不确定我是否风格上喜欢与否,但它似乎有助于更快地扫描代码。
    • @Mikey Delphi 中的常见做法是不使用self. 前缀。事实上,IDE intellisense 允许您快速访问属性名称,或者通过鼠标弹出提示或 Ctrl+Click 查看声明 - 因此无需指定此前缀。如果您没有在代码中定义全局变量(这是好的代码所必需的),您知道方法代码中的标识符是属性/方法名称。因此,您不应在方法中使用 self. 前缀(除非在 with 语句中)。
    • @AB - 我知道并同意你所说的一切,但这并不能否定我使用它的理由。如果您想扫描/快速阅读一段代码,“自我”会有所帮助 - 通常我喜欢坐下来阅读代码,而无需任何鼠标或交互,我也仍然喜欢打印代码并阅读它。所以这是“自助”方法....大声笑
    • @Mikey 我知道它起初可能会“帮助你自己”;)但是当你对 Delphi 中的隐式标识符(如单元名称或自身类实例)有所了解时,你会发现它有点优雅,打字更少。在 Python 中,用缩进替换 begin/end 有助于减少输入(即使我通常不写任何 end,因为我的 IDE 为我完成了它,并且在法语键盘上输入 begin 比在 @987654332 上输入更快@ 键),但 self. 在 python 代码中让它变得冗长。 ;)
    • @AB-自 1.0 版以来,我一直在使用 Delphi 进行编程-在隐式标识符样式方面拥有丰富的经验-这就是为什么我说在风格上我对限定“自我”并不那么热心。除非绝对必要,否则我从不限定 self(或 Delphi 中的任何其他内容)。但是在使用 C# 和 Python 之后,我发现为了清晰和安全起见,限定名称可能会有所帮助。所以我对这个问题持矛盾态度——对于隐式解析的简洁、高效和优雅有很多话要说,但对于资格提供的清晰度和安全边际也有很多话要说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多