【问题标题】:Read-only Property or Function?只读属性还是函数?
【发布时间】:2014-01-09 00:22:06
【问题描述】:

对于只读属性,使用带有私有 getter 的属性和提供公共函数有什么区别:

function GetCount : Integer;
property Count : Integer read GetCount;

对比

function Count : Integer;

就调用语法而言,这两者似乎是相同的。我经常倾向于使用第二个,因为它的代码更少,尤其是在不能选择字段支持属性的接口中。

有什么不同吗? (当然仅限于只读属性)

【问题讨论】:

  • 我认为区别主要在于未来可能的扩展。您可以将 getter 更改为函数或变量,您可以向其添加 setter,您可以将属性移动到发布部分,您可以创建一些基于 RTTI 的引擎以通过名称或注释等统一读取属性。甚至到点在基类中拥有两个具有相同 getter 的属性,并在专门的派生类中赋予它们不同的 getter(例如使用索引属性 getter)。也相关q:stackoverflow.com/questions/6391632
  • 当你暴露一个函数时,你是在声明here be side effect
  • @FreeConsulting 我通常会同意。在这种情况下,虽然代码读取完全相同SomeType.Count - 所以你的观点只会在你写它的时候应用一次。
  • 如果你不关心 RTTI 也没什么区别。
  • 但是当您引用一个符号时,您可以轻松查找它是字段、属性还是方法。事实上,生产力工具正在为您做到这一点。

标签: delphi delphi-xe2


【解决方案1】:
  1. “属性用于实现接口”

  2. 看起来在您的简单情况下没有区别。

好的,还有一点:

当你使用函数时

附:接口 == 对象 - 实现

原码:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    var
            x   : integer;
  public
    { Public declarations }
        function GetX : integer;
        property MyX : integer read x;
  end;

……

procedure TForm1.Button1Click(Sender: TObject);
var
    s   : integer;
begin
    s := GetX;
    s := MyX;
end;

有什么不同吗? (仅限于只读属性 当然)

如果相信汇编器——这些结构完全一样。

【讨论】:

  • 请同时显示生成此汇编代码的原始代码(优化打开还是关闭?)。另外,我知道接口是什么,只是不明白为什么它对这个问题有影响。
  • 您的比较无效。我不是在谈论字段支持的属性,而是在谈论带有 getter 的属性。当然,字段支持的属性由编译器优化,效率更高
猜你喜欢
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多