Entwickler-Ecke

Basistechnologien - eigene struct mit nullable


m.keller - Di 20.01.15 13:48
Titel: eigene struct mit nullable
Hallo Entwicklergemeinde,

ich habe eine Frage die scheinbar etwas komplexer ist.
Vielleicht kann mir jemand helfen.
Vermutlich sehe ich mal wieder den Wald vor lauter Bäumen nicht ;-)

Nun zu meinem Problem.
Ich habe eine eigenen eigenen Variablen Struktur diese wird in einer Methode als out Parameter verwendet.
nun ist es so das in der Methode mehrere abfragen gibt die mit return aus der Methode geht.
Somit müsste der out Parameter mit null raus gehen.
Schön und gut aber dann komme ich nicht mehr auf die Variablen Struktur und kann keine Werte mehr zuweisen, was aber am ende der Methode geschieht.

hört sich glaube ich alles sehr verwirrend an.
Hier mal ein paar Zeilen


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
 public struct Maschineninformation
        {
            public string Pruefstandsname;
            public string Prufstandsnummer;
            public string Pruefstandseriennummer;
            public string Hardwarestand;
            public string Softwarestand;
            public DateTime Abnahmedatum;
            public DateTime letzteWartung;             
        }

  public int gibMaschinenInfo( out Maschineninformation? Value)
        {
            int result = 0;
            string[] outAbfrage;

            
            ....
            result = abfrageAusfuehren(command, out outAbfrage);
            if (result != RES_OK)
            {
                Value = null;
                return -1;
            }

....

return 0;



und ohne "?" im out Paramerter kann ich so auf Value zugreifen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            Value.Pruefstandsname = outAbfrage[0].ToString();
            Value.Prufstandsnummer = outAbfrage[1].ToString();
            Value.Pruefstandseriennummer = outAbfrage[2].ToString();
            Value.Hardwarestand = outAbfrage[3].ToString();
            Value.Softwarestand = outAbfrage[4].ToString();
            Value.Abnahmedatum = DateTime.Parse(outAbfrage[5].ToString());
            Value.letzteWartung = DateTime.Parse(outAbfrage[6].ToString());

            return 0;

aber wie kann ich werte zuweisen wenn ich die Variable nullable fähig mache?


Ralf Jansen - Di 20.01.15 14:50

Zitat:
aber wie kann ich werte zuweisen wenn ich die Variable nullable fähig mache?


Gar nicht? Wenn die null ist kann man der nix zuweisen. Wenn du was zuweisen willst erzeuge vorher eine Instanz von Maschineninformation.

Es ist hier sehr wahrscheinlich kontraproduktiv einen struct zu verwenden. Auch structs sind nur Klassen die sind nicht weniger aufwendiger oder sonstwie sparsamer als eine Klasse. Ein struct wäre hilfreich wenn man automatische Initialisierung will (die du ganz offensichtlich nicht willst da du das Ding wieder nullable machst) oder die Kopiersemantik beim zuweisen möchtest. Da dein Maschineninformation aber scheinbar einen mutierender Typ ist (du willst während seiner Existenz Felder des structs ändern) willst du das eher auch nicht weil man sich damit wunderbar in den Fuß schießen kann weil man glaubt den Struct zu ändern aber nicht merkt das man aufgrund der Art wie man auf den struct zugreift schon längst an einer Kopie des structs hängt.


Th69 - Di 20.01.15 19:06

Sehe ich auch so: mach daraus besser eine Klasse (da Klasseninstanzen automatisch Referenztypen sind, d.h. auch den Wert null annehmen können), so daß du kein Nullable<> (bzw. ?) mehr benötigst.

In der Methode mußt du dann (egal ob Klasse oder Struktur) aber natürlich dann mittels new eine neue Instanz erzeugen.