void-Pointer (void*)



  • Hi,

    Ich bräuchte einen void-Pointer(void*) 🙂

    abstract Class Foo
    {
    public abstract VOID-Pointer get();
    }
    
    class Bar : Foo
    {
    public override VOID-Pointer get()
    {
    return...
    }
    }
    
    // ....
    

    Ich müsste mir dann dsa Ergebnis immer richtig casten, aber das wäre es in diesem Fall wert 🙂

    Also was soll ich tun? Habe keinen void-Pointer gefunden 🙂

    Danke im Voraus



  • Du benötigst also den konkreten Typ?
    Warum? Möchtest Du Eigenschaften und Methoden benutzen, die nur die konkreten Typen besitzen?

    Edit: Was hat das mit void* zu tun? Einen allgemeinen Datentyp gibts ja, der heist System.Object



  • simon.gysi schrieb:

    Du benötigst also den konkreten Typ?
    Warum? Möchtest Du Eigenschaften und Methoden benutzen, die nur die konkreten Typen besitzen?

    Edit: Was hat das mit void* zu tun? Einen allgemeinen Datentyp gibts ja, der heist System.Object

    System.Object ist natürlich noch besser. Sowas hatte ich gesucht. Danke!

    PS: Ich komme aus der C/C++ - Ecke und schaue mir in letzter Zeit C# an 🙂

    Danke 🙂



  • Wolkeee schrieb:

    System.Object ist natürlich noch besser.

    Es ist nicht "noch besser" denn das impliziert das ein "void*" bereits eine gute Lösung sei, was es aber nicht ist.

    void* bedeutet immer, daß man sämtliche Typinformationen des Objekts verliert. Im Prinzip kann man das später in alles Mögliche casten und mußt dich drauf verlassen das nicht irgendein Müll übergeben wurde.

    System.Object hingegen behält die Typinformation des ürsprünglichen Objekts. Das bedeutet z.B.: Wenn Du einen String mittels System.Object übergibst _bleibt_ es trotzdem ein String. Würdest Du danach versuchen das object in ein DateTime zu casten gibts ne InvalidCastException.

    Der entscheidende UNterschied ist, beim System.Object kannst Du mittels "is" abfragen was für ein Typ es denn ist. Du castest also nicht blind ins Leere rein sondern kann vor dem cast prüfen ob das Objekt auch vom gewünschten Typ ist.

    z.B.:

    private void Test(object obj)
    {
       if(obj is String)
       {
          ((String)obj).Whatever();
       } 
    }
    


  • Trotzdem ist 'object' selten eine gute Lösung, da alle statischen Typeninformationen verlorengehen und eine statische Typenbindung ist generell zu bevorzugen, da hier der Compiler in der Lage ist, Fehler aufzuzeigen.



  • Trotzdem geht es manchmal kaum anders 😮



  • o_O schrieb:

    Trotzdem geht es manchmal kaum anders 😮

    Ich schrieb ja auch nicht „nie“ sondern „selten“.


Anmelden zum Antworten