Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TDictionary als const (https://www.delphipraxis.net/193124-tdictionary-als-const.html)

wurzelzwerg 22. Jun 2017 12:00

TDictionary als const
 
Moin,

wie deklariert man in Delphi ein TDictionary<string,string> als Konstante?
Das geht ja nicht:
Delphi-Quellcode:
const
  MD: TDictionary<string, string> = ( ('A', 'xxx'), ('B', 'yyy') );
// oder
// MD: TDictionary<string, string> = ( ('A': 'xxx'), ('B': 'yyy') );
danke

SneakyBagels 22. Jun 2017 12:05

AW: TDictionary als const
 
Das hier könnte weiterhelfen:

Zitat:

You cannot write a constant expression that is an instance of a class. So what you are attempting to do is not possible.
https://stackoverflow.com/questions/...-default-value

TDictionary ist hier eindeutig nicht das was du suchst.

wurzelzwerg 22. Jun 2017 12:18

AW: TDictionary als const
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375161)
TDictionary ist hier eindeutig nicht das was du suchst.

danke, was sollte ich denn suchen?
Irgenwas wo ich über den key an value komme(readonly).

stahli 22. Jun 2017 12:27

AW: TDictionary als const
 
Warum muss es denn eine Konstante sein?

Wenn es irgendeine Objektinstanz (Liste, Dictionary o.ä.) ist, wirst Du deren Daten immer verändern können.

Du könntest evtl. ein Singleton verwenden:

Delphi-Quellcode:
function MyDic: TDictionary<string, string>
begin
  if not Assigned(_MyDic) then
  begin
    _MyDic := TDictionary<string, string>.Create;
    _MyDic...DatenAnlegen;
  end;
  Result := _MyDic;
end;
Dann kannst Du MyDic zumindest nicht neu zuweisen freigeben aber immer noch).

Du kannst natürlich auch eine Funktion oder statische Klasse schreiben, der Du einen String übergibst und hard codiert einen anderen zurück erhältst.

Ist halt die Frage, was Du genau brauchst...

Der schöne Günther 22. Jun 2017 12:28

AW: TDictionary als const
 
Wäre die Referenz eine Konstante (oder Singleton, oder ...), würde dir das auch nicht helfen, denn jeder kann ja die Referenz nehmen und Methoden wie
Delphi-Quellcode:
Remove(..)
oder
Delphi-Quellcode:
Clear()
aufrufen.

Unter System.Generics.Collections gibt es leider kein "Read Only"-Dictionary.

Mit den Standard-Delphi-Collections bin ich nie lange glücklich geworden, die Collections von Spring4D sind fantastisch. Da gibt es dann z.B. auch ein IReadOnlyDictionary<X, Y>


Ansonsten wenn es nur für diesen einen Anwendungszweck ist, mach dir doch eine eigene Klasse um ein TDictionary<X, Y> welches nur Methoden zum Nachschlagen, nicht modifizieren anbietet.

wurzelzwerg 22. Jun 2017 12:40

AW: TDictionary als const
 
OK, danke. Werde mir dann wohl selbst was bauen.

Zacherl 22. Jun 2017 15:05

AW: TDictionary als const
 
Zitat:

Zitat von stahli (Beitrag 1375166)
Warum muss es denn eine Konstante sein?

Wenn es irgendeine Objektinstanz (Liste, Dictionary o.ä.) ist, wirst Du deren Daten immer verändern können.

Um die Konstante ansich geht es ja nicht, sondern um die Möglichkeit der statischen Initialisiertung, wie sie z.b. gültig ist für
  • Arrays
    Delphi-Quellcode:
    const
      MyArray: array[0..1] of Integer = (0, 1);
  • Records
    Delphi-Quellcode:
    const
      MyRecord: TRecord = ( Foo: 1; Bar: 'test' );
  • etc

In C++ kann man auch fast alle standard Container der STL mit solchen Initializer-Lists statisch initialisieren, selbst wenn es sich um dynamisch erstellte Instanzen handelt. Delphi kann das meines Wissens nach nur für dynamische Arrays des Typs
Delphi-Quellcode:
type TXArray = array of X
:
Delphi-Quellcode:
var
  A: TStringArray;
begin
  A := TStringArray.Create('test', '123', '456');

Uwe Raabe 22. Jun 2017 16:10

AW: TDictionary als const
 
Zitat:

Zitat von Zacherl (Beitrag 1375173)
Delphi kann das meines Wissens nach nur für dynamische Arrays des Typs
Delphi-Quellcode:
type TXArray = array of X
:
Delphi-Quellcode:
var
  A: TStringArray;
begin
  A := TStringArray.Create('test', '123', '456');

Das geht mittlerweile auch so:
Delphi-Quellcode:
const
  cStrings: TArray<string> = ['A', 'B', 'C'];


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 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