Boolean um Enum zu bestimmen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Arby.

    Boolean um Enum zu bestimmen

    Hallo.

    Ich habe folgendes Enum:


    VB.NET-Quellcode

    1. Public Enum IsOnline As Short
    2. DoesnotMatter = 0
    3. Online = 1
    4. End Enum


    Des Weiteren habe ich eine CheckBox.

    Wenn die Checkbock checked ist soll -> Online
    Wenn die CheckBox nicht checked ist -> DoesNotMatter

    Wenn ich jetzt jedoch Cint(CheckBox1.Checked) nutze , erhalte ich ja bei
    .Checked sofern die Box gecheckt ist eine -1 und wenn not .Checked , eine 0.

    Natürlich könnte man jetzt eine Hilfsvariable nehmen z.B:

    VB.NET-Quellcode

    1. Dim B As IsOnline =

    VB.NET-Quellcode

    1. IsOnline.DoesNotMatter
    2. If CheckBox1.Checked Then B = IsOnline.Online


    Aber das kommt mir irgendwie spanisch vor.

    Jetzt habe ich folgendes gedacht:

    VB.NET-Quellcode

    1. CType(Math.Abs(CInt(CheckBox1.Checked)), IsOnline)


    Aber auch das kommt mir irgendwie eher suboptimal vor.

    Wie würdet ihr das lösen?
    hmm... sieht irgendwie nach "doppeltgemoppelt" aus..
    die Checkbox sagt doch schon, das Online ist.
    Oft bringen solche Redundanzen hinterher Probleme mit sich, da du immer 2 Dinge aktuell halten musst.

    Aber im Zweifel lieber eine Codezeile mehr schreiben
    if checkbox1.checked then b=Online else b=doesnotmatter .. damit gehst du allem Ärger aus dem Weg.

    also dein 1. Weg ist soweit schon richtig, z.B. erst auf Doesnotmatter stellen, und wenn Checked dann den anderen Wert.

    RoulettePilot schrieb:


    Aber im Zweifel lieber eine Codezeile mehr schreiben
    if checkbox1.checked then b=Online else b=doesnotmatter .. damit gehst du allem Ärger aus dem Weg.



    Sorry, aber das hat mich jetzt ehrlichgesagt gar nicht weitergebracht.

    Wofür soll das Else gut sein? Die Variable B aus meinem Beispiel hat doch den anderen möglichen Wert als konstanten Wert zugewiesen.

    Daniel Baumert schrieb:

    Die Variable B aus meinem Beispiel
    Brauchst Du sowohl den Wert der Property Checked als auch den Enum-Wert, der ja wohl logisch mit dem Checked-Wert übereinstimmt?
    Wenn ja: Wie verwendest Du den Enum-Wert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Problem ist: Es handelt sich um eine Klassenbibliothek.

    Die Variable As Boolean zu machen wäre zwar praktisch , aber wird dann natürlich von den Benutzern falsch interpretiert.

    Die Funktion erwartet Typ IsOnline , da gibts die zwei Enumelemente "DoesNotMatter" und "IsOnline"

    Dieses DoesNotMatter bedeutet beim Ziel, dass beide Werte möglich sind.

    Genau deshalb habe ich (damit es nicht falsch verstanden wird) ein eigenes Enum definiert.



    Bei der CheckBoxbeschreibung steht auch "Checked = Muss online sein" , "DoesNotmatter = "Egal ob online, oder offline".

    Da aber dieses selbstdefinierte Enum nur diese beiden Zustände hat, dachte ich, man könne das Boolean direkt nutzen (da Boolean ja auch nur zwei Zustände hat).

    Das hatte ich vergessen zu sagen, sorry.

    Das hier klappt ja auch:

    VB.NET-Quellcode

    1. CType(Math.Abs(CInt(CheckBox1.Checked)), IsOnline)


    Aber dachte eben, dass es eine noch elegantere Lösung gäbe.

    Daniel Baumert schrieb:

    Letztendlich benötige ich nur den Wert des Enums.

    @RoulettePilot , das nichtsetzen von Variablen einer selbstdefinierten Structure sollte man lieber vermeiden,
    nachher hat man dann nämlich möglicherweise ein Nothing.


    Du kannst mich erschlagen :) aber ich wette ENUM hat immer einen Wert. (ich wage zu behaupten immer den kleinesten - meist 0 -wenn kein anderer vorgegeben ist- )
    Da es im Prinzip eine Integer ist.

    Aber der Grundgedanke ist viel mehr, das es evtl, keine gute Idee ist für EINEN Zustand 2 VERSCHIEDENE Variablen (Checkbox+b) zu verwenden, da es vorkommen kann, das sie 2 verschiedene Zustände anzeigen.
    (z.B. beim Klcken wird der thread durch ein anderen unterbrochen, dann ist Checkbox zwar True.. aber B noch nicht gesetzt) und dann weiss das Programm nicht "Hü" oder "Hot"
    Hast recht, das ist immer 0, sofern nicht gesetzt . Sorry, hab mich da vertan.

    Aber das mit der Variable b (habe ich ja im Einstiegspost geschrieben) KÖNNTE man machen.
    Habe jedoch nicht geschrieben, dass ich es gemacht habe.
    Meine Lösung war

    VB.NET-Quellcode

    1. CType(Math.Abs(CInt(CheckBox1.Checked)), IsOnline)


    Da dachte ich, gäbe es noch eine elegantere Lösung.

    Daniel Baumert schrieb:

    Dieses DoesNotMatter bedeutet beim Ziel, dass beide Werte möglich sind.
    ah - das hat in meim Fall nicht geholfen - ich hab DoesnotMatter ühaupt nicht verstanden.

    Nenn den Enum OnlineState, und die Member UnKnown, Online - das wäre glaub klarer.
    Und ansonsten kannst du in diesem Fall einfach mit dim IsOnline = cbool(onlineState.Online) umwandeln.

    gugge diese kleine Experiment mit Haltepunkt auf zeile#5 im Lokalfenster:

    VB.NET-Quellcode

    1. Enum OnlineState : Unknown : Online = -1 : End Enum
    2. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    3. Dim b = CBool(OnlineState.Online)
    4. Dim enm = CType(b, OnlineState)
    5. End Sub

    Nein meint sie nicht. Sie meint genau das was sie geschrieben hat. Und das ist von der Syntax her korrekt und entspricht dem folgenden in C#:

    C#-Quellcode

    1. ​checkbox1.Checked ? IsOnline.Online : IsOnline.DoesNotMatter


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Witzig. Mit einem ähnlichen Problem schlage ich mich auch gerade herum.

    Bei mir geht es um eine DLL (weder .NET noch COM) für deren Funktionen es .NET Wrapper Klassen gibt, die uns mit der DLL mitgeliefert werden. Da es regelmäßig Updates gibt, möchte ich die gegebenen Wrapper-Codes so wenig wie möglich (am besten gar nicht) verändern. Blöderweise sind aber auch viele Dinge nicht konsistent.

    Genauer gesagt: Definiert wird ein Enum namens "Bool", mit den Werten TRUE = 1 und FALSE = 0. Es gibt nun einige Declares, die diesen Enum als Parameter und/oder Rückgabewert verwenden, es gibt aber auch viele Declares, die stattdessen den Typ Integer/int verwenden. Völliger Ranz, wenn ihr mich fragt. Aber wie gesagt: Ich würde ungern alle 500+ Declares durchgehen und entsprechend "korrigieren", erst recht nicht jedes Mal wenn es wieder ein API Update gibt. Andererseits ist es klar, dass es sich eigentlich um boolsche Werte handelt. Also habe ich mir folgende Lösung ausgedacht:

    a) eine winzige Änderung im gelieferten Quellcode: Umbenennung des Enums "Bool" in - z.B. - "BoolEnum" (ohne Auto-Refactoring, d.h. in den Declares bleibt der Typ "Bool" stehen) - diese einzelne Änderung ist bei API-Updates vertretbar.
    b) hinzufügen einer eigenen Codedatei, die den Wrapper-Typ "Bool" definiert, der vornehmlich dazu dient, implizite Konvertierungen zwischen bool/int/BoolEnum vorzunehmen. Der bisher unauffäliige Code davon sieht zurzeit so aus:

    C#-Quellcode

    1. public struct Bool
    2. {
    3. public BoolEnum value;
    4. internal Bool(BoolEnum v) { value = v; }
    5. public static Bool FALSE { get { return new Bool() { value = BoolEnum.FALSE }; } }
    6. public static Bool TRUE { get { return new Bool() { value = BoolEnum.TRUE }; } }
    7. public static implicit operator int(Bool a) { return (int)a.value; }
    8. public static implicit operator bool(Bool a) { return (a.value != BoolEnum.FALSE); }
    9. public static implicit operator BoolEnum(Bool a) { return a.value; }
    10. public static implicit operator Bool(int a) { return new Bool((BoolEnum)a); }
    11. public static implicit operator Bool(bool a) { return new Bool(a ? BoolEnum.TRUE : BoolEnum.FALSE); }
    12. public static implicit operator Bool(BoolEnum a) { return new Bool(a); }
    13. public static bool operator ==(Bool a, Bool b) { return a.value == b.value; }
    14. public static bool operator !=(Bool a, Bool b) { return a.value != b.value; }
    15. public override bool Equals(object obj)
    16. {
    17. if (obj.GetType() == typeof(Bool)) return this.value == ((Bool)obj).value;
    18. return base.Equals(obj);
    19. }
    20. public override int GetHashCode()
    21. {
    22. return value.GetHashCode();
    23. }
    24. }


    Vielleicht ist das ja ein Ansatz, der dir auch weiterhelfen könnte?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.