Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.011 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#19

AW: Generisches ToString für Enumerations

  Alt 1. Mai 2011, 14:10
Hmm, hatte mir nur TValue in den API Docs auf Embacadings.com angesehen. Hatte einfach erwartet dass es in beide Richtungen geht. Embarcadings scheint wohl auf Öhm-Momente in ihren APIs viel Wert zu legen, oder einfach nur keinen Anspruch zu haben...
Allein aufgrund der automatischen Garbage Collection bei Records kann ich verstehen, warum es so gemacht ist, wie es gemacht ist. Sonst müsstest du ja jedes mal ein TValue-Objekt erzeugen und freigeben, wenn du damit arbeiten willst. Records machen das halt sehr viel bequemer. Klar, in meinem Fall ändert sich nicht wirklich viel, aber ich hab mir mal den TValue-Record näher angeschaut und allein schon diese Zeile spricht für sich, wie ich finde:
Delphi-Quellcode:
TValue = record
public
  { ... }
  class function From<T>(const Value: T): TValue; static;
  { ... }
end;
Wäre TValue eine Klasse, dann müsste man die Speicherverwaltung teilweise intern, ebenso aber auch extern durch den Programmierer vornehmen, dass immer alles passt und keine Speicherleaks entstehen. Klar, man könnte den Record (bzw. dann evtl. die Klasse) anders gestalten, aber was genau spricht gegen eine solche Verwendung?

Ich bin echt gerne bereit, meine Ansichten zu ändern, wie schon gesagt, aber ich verstehe den Grund, warum ich das tun sollte, nicht wirklich?! Ich habe extra nochmals auf Wikipedia nachgelesen, wofür Records (bzw. Structs) eigentlich da sind, aber nachdem deren Funktionalität erweitert wurde, sehe ich weniger Probleme darin auch deren Vorteile zu verwenden.
Ihr redet aneinander vorbei. Bei TValue handelt es sich um einen Wertetypen. Bei deinem record nicht, denn er hat keinen State sondern nur 2 Methoden. Und dafür kann man auch ohne Probleme eine Klasse benutzen, weil man für die Benutzung von class methods nix instanzieren muss. Aber wie ich bereits sagte, spielt es für diesen konkreten Fall (Containertyp für parametriesierte Methoden) keine Rolle, ob du eine Klasse mit class methods nutzt oder einen record mit static methods.

Übrigens:
Du könntest auch einen record helper für TValue schreiben
Und schau dir mal die Implementierung von TRttiEnumerationType.GetValue in der Rtti.pas an.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 1. Mai 2011 um 14:27 Uhr)
  Mit Zitat antworten Zitat