Typedefs oder Ähnliches



  • Typedefs gibts ja nicht in C#. Nun wäre aber etwas Ähnliches für mich sehr Sinnvoll. Folgender Anwendungsfall:

    Ich möchte Objekte eineindeutig Referenzieren. Dabei muss ich die Objekte ja irgendwie mit einen Schlüssel markieren (Ähnlich den Primary-Keys in einer DB). Ich könnte jetzt Stur einfach so einen Schlüssel als int Festlegen und gut ist. Wenn ich aber spätestens in 3 Wochen drauf komme aus den int ein string zu machen trifft mich das an den verschiedensten Stellen. Im C++ würde ich ein Typedef machen. Kurzum der Key ist ein Typedef. Und ich hätte ein Container der mir den Keys irgendwelchen Objekten zuordnen kann, mit Typedef auch kein Problem. Ich könnte an zentraler Stelle aus den ints, strings machen. In C# fällt mir da aber nichts einfaches dazu ein.



  • Warum kein enum? Hört sich doch eigentlich perfekt für das an was du willst.



  • //using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace csharp01
    {
        using MyConsole = System.Console;
    
        public class Program
        {
            static void Main(string[] args)
            {
                MyConsole.WriteLine("Hallo");
            }
        }
    }
    


  • Ggf erkläre ich mal das problem genauer.
    Ich möchte verschiedene Daten die eigentlich zusammengehören getrennt speichern. Das rührt daher das ich nicht unbedingt zeitgleich alle Daten benötige. Das System auf dem das ganze Später mal zum Einsatz kommt ggf sehr beschränkt ist (Speicherplatz). Und meine Daten nicht das einzige sind was auf dem System existiert. Daher muss ich möglichkeiten bieten Daten die auf dem Zielsystem gebraucht werden explizit weg zu lassen. Man könnte also sagen es gibt einmal den vollen Datensatz und einmal einen Abgespeckten. Da ich damit die Daten aus verschiedenen Streams beziehen muss, sind diese ja nicht automatisch untereinander referenziert. Schlimmer noch, ich muss die einzelnen Member sogar Transient machen bzw das Speichern selber übernehmen. Über die Details mach ich mir noch keine Gedanken. Es geht jetzt nur darum die Zusatzdaten wieder den eigentlichen Daten zu zuordnen.
    Das ganze sieht momentan so aus:

    BasisStruktur->Aggregiert BasisElement(0-n)
    AdditionalStruktur->Aggregiert Subelement(0-n)->Referenziert auf Basiselement aus BasisStruktur(0..1-0) 
    [Nicht für jedes BasisElement existiert ein SubElement aber jedes Subelement zeigt auf exakt 1 Basiselement]
    

    Die AdditionalStruktur wird aus einen anderen Stream als BasisStruktur geladen bzw Gespeichert. D.H. nach dem ersten Laden kennen die Subelemente nicht mehr ihre zugeörigen Datenelemente. Diese Verbindungen müssen über irgendwelche eindeutigen Schlüssel wiederhergestellt werden.

    Meine Idee war halt. Ich erzeuge zu jeden BasisElement einen Key der Eindeutig sein muss. Zusätzlich besitzt die BasisStruktur Funktionen wie GetElementByKey... Darüber könnte ich die Verlinkung nach dem Laden wiederherstellen. Das Problem ist, das ich mich jetzt auf den Typ des Schlüssels festlegen müsste. Ich möchte den aber gerne so allgemein halten das ich den Typ auch ggf später nochmal leicht ändern könnte. Ggf gibt es sogar Ansätze wo micht der Typ des Schlüssels gar nicht interessiert oder ich sowas gar nicht brauche sondern anderweitig die Referenzen wieder richtig setzen kann.



  • Ich steige zwar nicht ganz durch dein Problem durch, aber warum nutzt du keine Generics, um den Schlüsseltyp per Typparameter festzulegen?



  • GPC schrieb:

    Ich steige zwar nicht ganz durch dein Problem durch, aber warum nutzt du keine Generics, um den Schlüsseltyp per Typparameter festzulegen?

    Das war mein erster Gedanke, leider löst es das Problem nicht. Meist sieht das ganze ja dann irgendwie so aus:

    class MyData<T>
    {
       T Key
       Object dataset1;
       Object dataset2;
    ...
    }
    
    class MyDataContainer<T>
    {
        public T InsertData(MyData data); //returns the new key for data
        public void UpdateData(MyData data);
        public MyData GetData(T key);
       ...
    }
    
    class KeyGenerator<T>
    {
       public T GenerateNextKey();
    }
    

    Problem ist immer noch, ich muss T mehrfach spezifizieren. Prinzipiell ist aber spätestens zur Compilezeit bekannt, welchen Typ T genau hat. Ich würde mir wünschen das an zentraler Stelle einstellen zu können.



  • define???



  • Fedaykin ließ mal nochmal über Generics dein T sind nicht definiert. Erst mit der Instanzierung deiner "Generic Klass" ist T defniniert.



  • Ich hatte meinen Gedanken hier nicht zuende gedacht. Prinzipell wären Generics nicht die lösung des ursprungsproblems gewesen. Hätten aber dazu geführt das ich nicht wirklich typesafe wäre. Jetzt arbeite ich mit Generics und Verschiedenen Key-Klassen damit kann ich zumindest keine unterschiedlichen Keys verschiedener "Datentypen" miteinander vergleichen und die Art des Key schnell innerhalb der jeweiligen KeyKlasse schnell austauschen.


Anmelden zum Antworten