AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschied zwischen Variant und Generics

Ein Thema von Gravitar · begonnen am 6. Jun 2014 · letzter Beitrag vom 7. Jun 2014
Antwort Antwort
Seite 1 von 2  1 2      
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#1

Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 10:07
Delphi-Version: 5
Hallo,

bin gerade dabei mir Swift anzuschauen. Dort bin ich über die Beschreibung zu Generics gestolpert und habe mich gefragt, wo eigentlich der Unterschied zwischen dem Datentyp Variant in Delphi und dem Datentyp Generic in Swift ist.

Hier mal das exemplarische Beispiel einer Vertauschfunktion (SwapToValues) von zwei Werten (egal welchen Typs) in Swift:

Code:
    func swapTwoValues<T>(inout a: T, inout b: T) {
      let temporaryA = a
      a = b
      b = temporaryA
    }
In Delphi (7) würde das Ganze mit Variant nun so aussehen:

Delphi-Quellcode:
Procedure swapTwoValues(Var a,b:Variant)
var
  temporaryA : variant;
begin
  temporaryA := a;
  a := b;
  b := temporaryA;
end;
Auch diese Procedure läßt sich mit beliebigen Typen (int, float, string...) aufrufen und taucht die Werte gegeneinander aus.

Wo ist jetzt also der große Unterschied?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 10:12
Hallo,

Generics funktionieren z.B. auch mit Records
Ansonsten liegt die Stärke auch eher in generischen Klassen (und dazugehörigen) generischen Methoden.

Hast du dir schon mal die generischen Listen in Delphi angeschaut? Sowas kriegst du nicht mit Varianten hin.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 10:38
Auch diese Procedure läßt sich mit beliebigen Typen (int, float, string...) aufrufen und taucht die Werte gegeneinander aus.
Hast du das ausprobiert?

Das sollte so aber nicht gehn, denn VAR-Parameter und übergebene Variable müssen eigentlich den selben Typ besitzen.
Und genau da haben die Generics ihren Vorteil, denn man kann den Typ ändern auswählen.
$2B or not $2B

Geändert von himitsu ( 6. Jun 2014 um 10:40 Uhr)
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 10:49
Hast du das ausprobiert?

Jup, mit INT und STRING habe ich das getestet. Klar ist natürlich, dass a und b den gleichen Typ haben müssen. Dies galt aber auch bei dem Swift-Beispiel.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 11:40
Ich meinte das so:
Delphi-Quellcode:
var
  a, b: Variant;
  x, y: Integer;
begin
  SwapTwoValues(a, b);
  SwapTwoValues(x, y); // geht nicht
end;
Natürlich ist es nahezu egal, was man in die Variant-Variablen rein packt, (der Funktion ist es total egal, nur es passt nicht alles in einen Variant rein)

aber man kann meine keine Variablen anderer Typen übergeben und genau das meinte ich.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 11:56
Hast du das ausprobiert?

Jup, mit INT und STRING habe ich das getestet. Klar ist natürlich, dass a und b den gleichen Typ haben müssen. Dies galt aber auch bei dem Swift-Beispiel.
Bei dem Swift-Beispiel kann diese Prüfung schon beim Kompilieren erfolgen. Bei den Variants fällt das erst zur Laufzeit auf.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 12:19
Ja, das ist bei den Generics auch ein Vorteil ... die Typsicherheit.

Wobei der Beispielfunktion das nicht auffällt, da der ja egal ist, was im Variant steckt.
Aber grundsätzlich stimmt das.

Für ein paar Projekte hatte ich mir da z.B. einen Record selber geschrieben, da Default-ArrayProperty nicht überladen werden konnten.
Das war dann ein kleiner Record, welcher über implizite Casts mit String oder Integer gefüllt werden konnte, so daß das die Parameter des Property nur die beiden Typen annehmen konnten, wohingegen der Variant ja erstmal alles rein lässt (was er versteht).
$2B or not $2B
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 14:57
Ich meinte das so:
Delphi-Quellcode:
var
  a, b: Variant;
  x, y: Integer;
begin
  SwapTwoValues(a, b);
  SwapTwoValues(x, y); // geht nicht
end;
Natürlich ist es nahezu egal, was man in die Variant-Variablen rein packt, (der Funktion ist es total egal, nur es passt nicht alles in einen Variant rein)

aber man kann meine keine Variablen anderer Typen übergeben und genau das meinte ich.
Ja, stimmt. In Swift ist mit Generics das hier möglich:

Code:
    var someInt = 3
    var anotherInt = 107
    swapTwoValues(&someInt, &anotherInt)
    // someInt is now 107, and anotherInt is now 3
   
    var someString = "hello"
    var anotherString = "world"
    swapTwoValues(&someString, &anotherString)
    // someString is now "world", and anotherString is now "hello"
In Delphi darf ich nur Variants übergeben und erhalte natürlich auch nur Variants zurück. Dort könnte ich z.B. auch a= "Hallo" und b = 5 übergeben. Dies würde dann in der Procedure krachen. Swift läßt sowas nicht zu. Schon der Aufruf schlägt wegen unterschiedlicher Typen fehl.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 15:03
In Delphi ist das mit den Generics auch möglich.
(seit 5 Jahren und seit 7 in der .Net-Ecke)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Unterschied zwischen Variant und Generics

  Alt 6. Jun 2014, 15:22
In Delphi:

Delphi-Quellcode:
procedure TForm1.swapTwoValues<T>(var Value1, Value2: T);
var tmp: T;
begin
  tmp := Value1;
  Value1 := Value2;
  Value2 := tmp;
end;
Aufruf:

Delphi-Quellcode:
swapTwoValues<Integer>(someInt1, someInt2);
swapTwoValues<String>(someStr1, someStr2);
swapTwoValues<TMyRecord>(someRec1, someRec2);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 6. Jun 2014 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz