Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Variable.Create; (https://www.delphipraxis.net/179403-variable-create%3B.html)

Medium 6. Mär 2014 00:24

AW: Variable.Create;
 
Unabhängig davon wäre dennoch zumindest eine Warnung angebracht, wenn der Konstruktor einer nicht initialisiertern Variablen aufgerufen wird, wie Himi es eingangs glaube ich meinte. Es mag zwar einer statischen Methode ähneln, aber eine neu initialisierte ungültige Referenz bleibt eine ungültige Referenz.

BUG 6. Mär 2014 00:39

AW: Variable.Create;
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250823)
Ich werde morgen mal versuchen bei einer Komponenten so den Owner zu wechseln, wenn das dann in irgendeiner Art nicht funktioniert, dann schreibe ich einen QC-Eintrag ;)

Da steht nirgendwo, dass auch der Destructor ausgeführt wird, also hast du schlechte Karten.

jfheins 6. Mär 2014 01:46

AW: Variable.Create;
 
Zitat:

Zitat von Sir Rufo (Beitrag 1250823)
Auszug aus der Dokumentation
[...]
Das ist also ein gewolltes Verhalten ... darum stehen die Chancen auf eine Warnung/Fehlermeldung eher schlecht.

Ja, dieses Verhalten ist wirklich ... praktisch.

Ich hoffe, von euch ist keiner auf die bescheuerte Idee gekommen, in Konstruktoren ungeprüft irgendwelche Unterobjekte zu erzeugen. Weil das würde dann ja zu Speicherlecks führen sobald man .Create aufruft :mrgreen:

Also immer schön:
Delphi-Quellcode:
constructor TMyClass.Create();
begin
   inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
   if not Assigned(values)
      values = TStringList.Create();
   if not Assigned(nodes)
      nodes = TObjectList.Create();
end;
Oder irre ich mich da?

jaenicke 6. Mär 2014 06:07

AW: Variable.Create;
 
Zitat:

Zitat von BUG (Beitrag 1250833)
Da steht nirgendwo, dass auch der Destructor ausgeführt wird, also hast du schlechte Karten.

Das wiederum geht mit DisposeOf, auch wenn es nicht empfohlen wird das zu nutzen. Damit wird der Destruktor aufgerufen. Ob das mit dem Konstruktoraufruf wieder rückgängig gemacht wird?

Stevie 6. Mär 2014 06:52

AW: Variable.Create;
 
Zitat:

Zitat von jfheins (Beitrag 1250742)
Ach ja und bei sowas:
Delphi-Quellcode:
var
  Reg : TRegistry;
begin
  Reg.Create; // Compilerfehler bitte hier!
  try
    Reg.RootKey:=HKEY_CLASSES_ROOT;
    Reg.OpenKey('.htm', true);
    Edit1.Text:=Reg.ReadString('');
  finally
    Reg.Free;
  end;
end;
MUSS doch ein Compilerfehler kommen wie "Verwendung der nicht zugewiesenen lokalen Variablen 'Reg'" !?
Aber vermutlich bin ich auch nur von C# verwöhnt :stupid:

Zitat:

Zitat von Medium (Beitrag 1250830)
Unabhängig davon wäre dennoch zumindest eine Warnung angebracht, wenn der Konstruktor einer nicht initialisiertern Variablen aufgerufen wird, wie Himi es eingangs glaube ich meinte. Es mag zwar einer statischen Methode ähneln, aber eine neu initialisierte ungültige Referenz bleibt eine ungültige Referenz.

Ich weiß gar nicht, was ihr habt, im Beispiel oben kommt:
W1036 Variable 'Reg' might not have been initialized

Puke 6. Mär 2014 07:14

AW: Variable.Create;
 
Aber nur weil das Ding lokal deklariert worden ist? Zumindest kommt bei mir kein Hinweis bei Attributen oder globalen Variablen. :?

DeddyH 6. Mär 2014 07:16

AW: Variable.Create;
 
Die sind ja auch initialisiert, da knallt es dann eben erst zur Laufzeit.

Furtbichler 6. Mär 2014 07:28

AW: Variable.Create;
 
Schade, das man das in Object Pascal das 'Create' als Methode vorgesehen und nicht einfach das 'New' erweitert hat. Dabei könnte man jegliche Instantiierungslogik (grauselig!) aus dem Konstruktor und in eine normale Methode verbannen.
Delphi-Quellcode:
Var
  a : TSomeClass;
  c : TClass;
  b : TSomeClassWithParametrizedConstructor;

Begin
  new(a);
  assert (a is TSomeClass);
 
  new(a, TSomeDerivedClass);
  assert (a is TSomeClass);
  assert (a is TSomeDerivedClass);
 
  c := TSomeClass;
  new (a,c);
  assert (a is TSomeClass);

  new(b).MyCreateMethod(x,y,z);
  assert (b is TSomeClassWithParametrizedConstructor);
Dann wäre auch gleich das Problem des Aufrufs virtueller Methoden im Konstruktor vom Tisch. Aber Objectpascal ist ja auch schon bald 30 Jahre alt und bei C# ist das Problem auch noch aktuell.

jfheins 6. Mär 2014 13:59

AW: Variable.Create;
 
Zitat:

Zitat von Stevie (Beitrag 1250842)
Ich weiß gar nicht, was ihr habt, im Beispiel oben kommt:
W1036 Variable 'Reg' might not have been initialized

Eine Warnung, ja, aber es compiliert trotzdem. Ich habe einen Fehler verlangt (der dazu führt, dass der Compiler seine Arbeit ohne Ergebnis beendet).

@Furtbichler: Bitte, werde kein Designer von Programmiersprachen. :stupid: Soweit ich sehen kann, würdest du mehrfache Konstruktoraufrufe weiterhin zulassen? Und die fehlende Variablenzuweisung macht den Code unintuitiv.

stahli 6. Mär 2014 14:09

AW: Variable.Create;
 
Mir gefällt die Syntax mit dem new().

Man weiß einfach, "das Objekt wird hier neu erzeugt" und muss das nicht umständlich über eine Zuweisung und den TClass.Create erledigen (vergisst man in der Eile ja auch nach Jahren nochmal ab und zu).


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Seite 2 von 5     12 34     Letzte »    

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