Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 20.01.15 13:48 
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

ausblenden 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
ausblenden 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?

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.