Interessante Momente in C # (Boxen Unboxing)

    In diesem Artikel werden wir kurz auf die wenig bekannten Funktionen des Boxens / Unboxens eingehen.

    Vorherige Artikel über foreach
    früheren Artikel über Array

    Eine typische Frage im Interview über die Ein- und Auspacken wie folgt - „Was passiert , wenn Sie diesen Code ausführen, und wenn es nicht funktioniert, wie man es beheben?“.

    Testcode:
    object box = (int)42;
    long unbox = (long)box;
    

    Die Antwort kann wie folgt lauten: "Beim Auspacken gibt der erste Bediener nicht Casting, sondern Entpacken ein und muss dem Typ des Werts in der gepackten Form entsprechen."

    Die richtige Antwort lautet:
    object box = (int)42;
    long unbox = (long)(int)box;
    

    Dies wird normalerweise als die richtige Antwort angesehen, ist aber nicht ganz richtig ...

    Unboxing und Enum


    Stellen Sie sich die Überraschung einer Person vor, wenn Sie ihr eine weitere richtige Option schreiben.

    Zweite richtige Antwort:
    public enum EnumType { None }
    ...
    object box = (int)42;
    long unbox = (long)(EnumType)box;
    

    Lassen Sie mich daran erinnern, dass Enum kein fundamentaler Typ ist und nicht von ihm erbt, sondern eine Struktur, die einen fundamentalen Typ (Basis) enthält. Dies deutet darauf hin , dass in .NET es klare Unterstützung für solche Dekompression ist. Es ist auch leicht zu überprüfen, ob die Dekomprimierung die expliziten und impliziten Konvertierungsoperatoren verwendet und die IConvertible-Schnittstelle und ihr Typ nicht von einem fremden Typ erweitert werden können.
    Beim Entpacken einer Aufzählung wird der Basistyp verwendet und das nächste Entpacken funktioniert nicht.

    Falsche Option:
    public enum EnumType : short { None }
    ...
    object box = (int)42;
    long unbox = (long)(EnumType)box;
    

    Das Auspacken für Aufzählungen ist extrem schwach.

    Entpacke int aus enum:
    public enum EnumType { None }
    ...
    object box = EnumType.None;
    long unbox = (long)(int)box;
    

    Entpacke eine Aufzählung von einer anderen:
    public enum EnumType { None }
    public enum EnumType2 { None }
    ...
    object box = EnumType.None;
    long unbox = (long)(EnumType2)box;
    

    Unboxing und Nullable


    Auspacken und unterstützt Nullable - Typen, so scheint es logischer.

    Nullable Art von herkömmlichem Auspacken:
    object box = (int)42;
    long unbox = (long)(int?)box;
    

    Den regulären Typ aus Nullable entpacken:
    object box = (int?)42;
    long unbox = (long)(int)box;
    

    Lassen Sie mich daran erinnern, dass Nullable eine Struktur mit einem verallgemeinerten Werttyp ist und zum Speichern von Daten und der Flagge der Datenpräsenz dient. Dies deutet darauf hin , dass in C # gibt es klare Unterstützung Nullable - Typs zum Auspacken. In neueren Versionen von C # wurde für diese Struktur der Alias ​​"?"

    Nullable:
    public struct Nullable where T : struct
    {
        public bool HasValue { get; }
        public T Value { get; }
    }
    

    Äquivalente Einträge:
    Nullable value;
    int? value;
    

    Vielen Dank für Ihre Aufmerksamkeit!

    Jetzt auch beliebt: