Laden...

getter/setter frage bezüglich möglichen eintretenden Spezialfall

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 904 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
getter/setter frage bezüglich möglichen eintretenden Spezialfall

Guten Morgen,

Nachdem ich den newtonsoft deserialisierer aufgrund eines manifests/assembly Problems nicht zum laufen bekomme, möchte ich gerne den JavaScript deserialisierer benutzen.

Den hab ich soweit bislang auch genutzt, ist soweit kein problem.

Jetzt ist es aber so, das bei einer WinApi Abfrage, es sein kann, das ein value, das normalerweise aus einem Array besteht, auch mal ein leerstring sein kann.

Ich müßte also dem getter setter sagen - hey, wenn du nur einen leerstring bzw. null hast, dann führe get set nicht aus, sondern befülle, die erwarteten felder mit den und den daten.

Im Prinzip ne if anweisung, klar.

ich habe das noch nicht getestet, weils auch falsch ist ist mir klar, aber das müßte im prinzipi so aussehen.


public class JSONObjects
{
public class List<JSONValues> result { get; set }
}

public class JSONValues
{
public SpezielleKlasse specialclass
{

(pseudocode)

wenn specialclass == ""
dann specialclass.link = ""
        specialclass.value =""
ansonsten
{ get; set; }
}

wobei

public SpezielleKlasse
{
 public string link {get; set;}
 public string value { get; set;}
}

wie setze ich das richtig um ?

4.942 Beiträge seit 2008
vor 5 Jahren

Dann mußt du eben auf die automatischen Getter/Setter verzichten und diese selber implementieren (mit einem BackingField).

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

ich hab das momentan so gelöst....


 private Cmdb_ci myVar;
            public Cmdb_ci cmdb_ci
            {
                get
                {
                    if (!(myVar.ToString() == "")) // funktioniert auch nicht  if (!(myVar is String))
                    {
                        return myVar;
                    }
                    else
                    {
                        return new Cmdb_ci();
                    }
                }
                set { myVar = value; }
            }

scheint so als würde der Deserialiser bei der Typenüberprüfun eine Exception schmeißen.

P
1.090 Beiträge seit 2011
vor 5 Jahren

Dein Getter schmeißt eine Nullreferenz Exeption wenn myVar null ist (myVar.toString()).

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

3.003 Beiträge seit 2006
vor 5 Jahren

private Cmdb_ci myVar;
public Cmdb_ci cmdb_ci
{
    get
    {
        return !string.IsNullOrEmpty(myVar) 
           ? myVar
           : (myVar = Cmdb_ci());
     }
     set { myVar = value; }
}

Bitte [Artikel] C#: Richtlinien für die Namensvergabe beachten. Cmdb_ci klingt eher nach einem Lungentumor als nach einer Variable.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 5 Jahren

Hallo,

hier mal ein Beispiel wie es damals umständlich jedoch einfach ersichtlich gemacht wurde:


            private Cmdb_ci myVar;
            public Cmdb_ci cmdb_ci
            {
                get
                {
                    if(myVar == null) 
                    {
                         myVar = new Cmdb_ci()
                         return myVar;
                    }
                    // Hier stellt sich die Frage, was bei .ToString() zurückgegeben werden kann?: (Könnte man unter Umständen String.IsNullOrEmpty oder String.IsNullOrWhitespace verwenden)
                    if(myVar.ToString() == String.Empty) 
                    {
                         myVar = new Cmdb_ci()
                         return myVar;
                    }
                    return myVar;
                }
                set { myVar = value; }
            }

Natürlich ist @LaTino's Beispiel die bessere Alternative, wobei bei


!string.IsNullOrEmpty(myVar)

ich mir nicht sicher bin, ob das auch für Objekte funktioniert, die kein 'string' sind?

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

3.003 Beiträge seit 2006
vor 5 Jahren

Hast recht, dass das gar kein String ist, habe ich nicht gesehen. Dann ergibt das noch viel weniger Sinn mit dem ToString(), weil das nur "" werden kann, wenn jemand die ToString()-Methode der kryptisch benannten Klasse absichtlich kaputt gemacht hat.

Dann also einfach nur lazy initialisiert:


private Cmdb_ci _objectValue;
public Cmdb_ci ObjectValue => _objectValue ?? (_objectValue = new Cmdb_ci()); 

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)