27

我使用 Delphi 已经有一段时间了,但我不是来自 CS 背景,而是“在工作中”学习的——主要是从我的老板那里学到的,并通过从网络、用户指南、示例中收集的点点滴滴来增强, ETC。

现在我的老板是老派,开始使用 Pascal 进行编程,并且不一定跟上 Delphi 的最新变化。

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

我们的大多数应用程序都与 MySQL 交互。一般来说,我们会创建一个record结构来存储从数据库读取的数据,这些记录将存储在一个TList. 通常,我们将有一个单元来定义我们在应用程序中拥有的各种记录,以及播种和读取记录的函数和过程。我们不使用此处概述的记录程序

在查看了一些示例后,我开始想知道我们是否会更好地使用classes而不是记录,但无论哪种方式我都很难找到强有力的指导。

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

4

1 回答 1

43

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

  1. 对于值类型,当您使用赋值时a := b,会创建一个副本。有两个不同的实例,ab
  2. 对于引用类型,当您使用赋值时a := b,两个变量都引用同一个实例。只有一个实例。

这样做的主要后果是在您编写a.Field := 42. 对于记录,值类型,分配a.Field更改成员的值 in a,但不更改 in b。那是因为ab是不同的实例。但是对于一个类,因为ab都引用同一个实例,所以在执行之后a.Field := 42你可以安全地断言b.Field = 42.

没有硬性规定说您应该始终使用值类型或始终使用引用类型。两者都有自己的位置。在某些情况下,最好使用一个,而在其他情况下,最好使用另一个。本质上,决定总是归结为您希望赋值运算符的含义。

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

此外,您声明您的类型不使用方法。仅由数据组成且没有与之关联的方法的类型很可能最好由值类型表示。我不能肯定地说,但我的直觉告诉我,最初的开发人员做出了正确的选择。

于 2013-10-17T11:15:29.117 回答