Когда я должен использовать улучшенные типы записи в Delphi вместо классов?

Вы выбираете ee.nombre, COUNT (ve.IdEmpleado), но присваиваете его только 1 переменной

.

15
задан Community 23 May 2017 в 11:52
поделиться

4 ответа

У вас есть записи, объекты и классы.

Записи доступны после turbo pascal 1. Они легкие, могут иметь свойства и методы, но они не поддерживают наследование. Есть некоторые проблемы с функциями, возвращающими записи. Если в этих записях есть методы, это иногда дает внутренние ошибки:

type
  TRec = record 
    function Method1: Integer;
  end;

function Func: TRec;


procedure Test;
var
  x : TRec;

begin
  Func.Method1; // Sometimes crashes the compiler
  // Circumvention:
  x := Func;
  x.Method1; // Works
end;

Объекты вводятся с турбо паскаль 5, если я прав. Затем они предоставили возможность ОО с паскалем. Они более или менее устарели с введением Delphi, но вы все равно можете их использовать. Объекты могут реализовывать интерфейсы.

Классы представлены в Delphi 1 и наиболее универсальны. Они реализуют интерфейсы и поддерживают наследование. Но каждая переменная класса - это скрытый указатель. Это означает, что классы нужно создавать в куче. К счастью, этот процесс в основном скрыт.

Ниже приведена таблица с различиями между ними. Я добавил интерфейс для завершения.

                  |Class|Object|Record|Interface|
------------------|-----------------------------|
Are pointers?     |  y  |  n   |  n   |    y    |
Inheritance       |  y  |  y   |  n   |    y    |
Helpers           |  y  |  n   |  y   |    n    |
Impl. Interface   |  y  |  y   |  n   |    -    |
Visibility        |  y  |  y   |  n   |    n    |
Method            |  y  |  y   |  y   |    y    |
Fields            |  y  |  y   |  y   |    n    | 
Properties        |  y  |  y   |  y   |    y    |
Consts            |  y  |  y   |  y   |    n    |
Types             |  y  |  y   |  y   |    n    |
Variants          |  n  |  n   |  y   |    n    |
Virtual           |  y  |  n   |  y   |    -    |
------------------|-----------------------------|
15
ответ дан 1 December 2019 в 02:10
поделиться

Вы можете использовать перегрузку оператора (например, неявные преобразования). Это можно сделать в Delphi 2007+ или 2006.NET и с объектами, но только с этими записями в Win32 2006 года.

1
ответ дан 1 December 2019 в 02:10
поделиться

В дополнение к другим ответам (перегрузка операторов, легковесные типы значений) рекомендуется делать записи перечислителей вместо классов. Поскольку они размещены в стеке, нет необходимости создавать и разрушать их, что также устраняет необходимость в скрытом блоке try..finally, который компилятор размещает вокруг перечислителей классов.

См. http: //hallvards.blogspot.com/2007/10/more-fun-with-enumerators.html для получения дополнительной информации.

6
ответ дан 1 December 2019 в 02:10
поделиться

Я думаю, что эти возможности также были доступны в Delphi 8 и 2005.

Главное правило: если вы сомневаетесь, используйте класс.

В остальном вы должны понимать главное отличие: объекты класса всегда используются через ссылку и создаются путем вызова конструктора.

Управление памятью и распределение для записей такие же, как и для основных типов ( т.е. целое, двойное). Это означает, что они передаются методам по значению (если не используется var). Также вам не нужно освобождать записи, и поэтому они поддерживают перегрузку операторов. Но без наследования, виртуальных методов и т. Д. Новые записи могут иметь конструктор, но его использование не обязательно.

Основные области и критерии использования записей:

  • при работе со структурами из Win32 API

  • , когда типы не t имеют идентичность (поскольку присваивание означает копирование)

  • , когда экземпляры не слишком велики (копирование больших записей становится дорогостоящим)

  • при построении типов значений, поведение которых должно имитировать числовые типы. Примерами являются DateTime, Комплексные числа, Векторы и т. Д. Перегрузка операторов - хорошая функция, но не делайте это решающим фактором.

И с точки зрения эффективности не переусердствуйте:

  • для меньших типов, которые вы часто вставляете массивы.

И, наконец, правила использования класса или записей практически не изменились по сравнению с более ранними версиями Delphi.

Кроме того, перегрузка операторов - отличная функция, но не делайте ее решающим фактором.

И с точки зрения эффективности не переусердствуйте:

  • для небольших типов, которые вы часто помещаете в массивы.

И наконец, правила использования класса или записей практически не изменились по сравнению с более ранними версиями Delphi.

Кроме того, перегрузка операторов - отличная функция, но не делайте ее решающим фактором.

И с точки зрения эффективности не переусердствуйте:

  • для небольших типов, которые вы часто помещаете в массивы.

И наконец, правила использования класса или записей практически не изменились по сравнению с более ранними версиями Delphi.

8
ответ дан 1 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: