我们为什么要使用类而不是记录,反之亦然?

时间:2013-10-17 11:00:36

标签: delphi class record

我一直在使用Delphi很长一段时间了,但是我没有从CS背景中学到“在工作中” - 主要来自我的Boss,并且通过网络上的点点滴滴进行增强,用户指南,例子等。

现在我的老板已经上学了,开始使用Pascal进行编程,并且不一定了解最新的Delphi更新。

就在最近,我一直想知道我们的核心技术之一是否“错误”。

我们的大多数应用程序都与MySQL连接。通常,我们将创建一个record,其结构用于存储从数据库读取的数据,这些记录将存储在TList中。通常,我们将有一个单元,用于定义应用程序中的各种记录,以及种子和读取记录的功能和过程。我们不使用记录程序,例如概述here

在回顾了一些例子之后,我开始怀疑使用classes而不是记录是否更好,但我无论如何都难以找到强有力的指导。

我们正在处理的事情是用户信息:名称,DOB,事件,事件类型。或时间表信息:小时,工作等......

1 个答案:

答案 0 :(得分:38)

最大的区别是记录是值类型,类是引用类型。简而言之,这意味着:

  1. 对于值类型,当您使用赋值a := b时,会生成副本。有两个不同的实例ab
  2. 对于引用类型,当您使用赋值a := b时,两个变量都引用同一个实例。只有一个例子。
  3. 这样做的主要结果是当你写a.Field := 42时会发生什么。对于记录,值类型,作业a.Field会更改a中成员的值,但不会更改b中的成员值。这是因为ab是不同的实例。但对于一个类,由于ab都引用同一个实例,因此在执行a.Field := 42之后,您可以安全地断言b.Field = 42

    没有严格的规则说你应该总是使用值类型,或者总是使用引用类型。两者都有自己的位置。在某些情况下,最好使用一种,在其他情况下,最好使用另一种。从本质上讲,决策总是取决于您希望赋值运算符的含义。

    你有一个现有的代码库,并且可能是熟悉它的程序员,它已经做出了特别的选择。除非您有令人信服的理由转而使用引用类型,否则进行更改几乎肯定会导致缺陷。现有代码中的缺陷(切换到引用类型会改变赋值运算符的含义),以及将来编写的代码中的缺陷(您和您的同事已经对特定上下文中赋值运算符的含义产生了直觉,并且直觉会破坏如果你换了)。

    更重要的是,您声明您的类型不使用方法。只包含数据且没有与之关联的方法的类型很可能最好用值类型表示。我不能肯定地说,但我的直觉告诉我原始的开发者做出了正确的选择。