Laden...

Nach dem Return ist die Variable "zurückgesetzt"? [GELÖST]

Erstellt von XqepX vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.092 Views
X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren
Nach dem Return ist die Variable "zurückgesetzt"? [GELÖST]

Moin miteinander,

ich habe ein kleines Problemchen das ich nicht verstehe. Ich hab versucht es zu Googlen und hab auch hier auf der Website gesucht, jedoch nichts gefunden. Liegt entweder daran das ich zu doof bin oder es einfach nicht in anständige Worte fassen kann. Is ja auch egal..

Folgendes:
Ich habe eine void-Funktion, in der ein string deklariert und mit nichts initialisiert ist (also = "";).

Diesen übergebe ich an eine string-Funktion und bearbeite ihn dort. Jetzt geb ich den string von der string-Funktion zurück und Schwupps die Wupps steht nicht das drin was in der string-Funktion rein geschrieben wurde, sondern wieder nur nichts ("");.

Könnt ihr mir da weiterhelfen? 😃

PS: Sorry für die schlampigen Kommentare


        void Main_Game()
        {
            string sDatenTyp = "";                                    //1 leerer String initialisiert

            WelcherDatenTyp(sDatenTyp);                        //2 string-Funktion wird aufgerufen

            Hinweis_Stufe1(sDatenTyp);                           //6 Hier ist sDatenTyp wieder leer
        }

        string WelcherDatenTyp(string sDatenTyp)
        {
            Random rIndikator = new Random();
            int iIndikator = rIndikator.Next(1, 6);              //3 Hier wird ein zufälliger int generiert

            switch (iIndikator)                                          //4 Mit dem jeweiligen int wird in den
            {                                                                  //String sDatenTyp ein Datentyp 
                case 1: sDatenTyp = "char";                       //geschrieben und zurückgegeben
                    break;
                case 2: sDatenTyp = "int";
                    break;
                case 3: sDatenTyp = "double";
                    break;
                case 4: sDatenTyp = "float";
                    break;
                case 5: sDatenTyp = "string";
                    break;
                case 6: sDatenTyp = "bool";
                    break;
            }
            return sDatenTyp;                                          //5 Hier ist der sDatenTyp z.b. "double"
        }

P
1.090 Beiträge seit 2011
vor 9 Jahren

Schau dir mal den unterschied zwischen Referenztypen und Valuetypen an.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

R
228 Beiträge seit 2013
vor 9 Jahren

Du solltest dir mal Referenztypen und Wertetypen ansehen (genau genommen ist String ein Referenztyp, der sich aber wie ein Wertetyp verhält). Außerdem nimmst du das Return nicht entgegen und so verschwindet es im Nirvana.

Edit: Sorry zu spät

771 Beiträge seit 2009
vor 9 Jahren

Es geht hier aber eigentlich nicht um den Unterschied zwischen Referenz- und Valuetyp, sondern darum, dass (wie Rioma richtigerweise schrieb) der Rückgabetyp gar nicht verwendet wird bzw. Methodenparameter immer per Value übergeben werden (solange man nicht 'ref' oder 'out' benutzt).

189 Beiträge seit 2014
vor 9 Jahren

Im Übrigen ist <<"">> ungleich <<NULL>>! Genauso wie Zahl 0 != NULL.
NULL bedeutet nicht initialisiert bzw. der Objektverweis ist nicht festgelegt.
"" ist ein leerer String. -> Es ist ein gülitges Objekt enthalten, nämlich ein leeres.

X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren

Hab mich mal kurz über Referenz- und Wertetypen informiert und habs folgendermaßen gelöst


void Main_Game()
{
        string sDatenTyp = WelcherDatenTyp();

        Hinweis_Stufe1(sDatenTyp);
}

string WelcherDatenTyp()
{
         string sDatenTyp = "";
         //Zufallsgenerator + schreiben in lokalen String
         return sDatenTyp;
}

So hats jetzt funktioniert aber Cat kannst du das mit dem verwenden vom Rückgabetyp noch bissel genauer erläutern?

Und Ezio, danke für den Hinweis 😛

189 Beiträge seit 2014
vor 9 Jahren
X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren

Ich meinte deine Aussage das ein string der folgendermaßen deklariert ist, kein NULL-string ist, sondern ein leerer string 😉


string sTest = "";

189 Beiträge seit 2014
vor 9 Jahren

Ich meinte deine Frage an Cat. 😉
(Übrigens befinden wir uns mit dem Thema im low-level Grundlagenbereich. Deshalb verweise ich dich zusätzlich auch mal mit auf [FAQ] Wie finde ich den Einstieg in C#? )
Edit: sorry, falscher Link

X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren

Achso,

Er meinte doch das mein Rückgabetyp beim ersten Code ,,gar nicht verwendet wird bzw. Methodenparameter immer per Value übergeben werden". Ich wolle nur seinen Lösungsvorschlag dazu wissen 😃

(das mag sein aber ich bin ja auch kein Profi 😄 Außerdem muss ich in der Schule noch C++ lernen..)

189 Beiträge seit 2014
vor 9 Jahren

Die Methoden-Verwendung ist so in Ordnung. Würde man an vergleichbaren Stellen nicht anders machen.

Das was ich angesprochen habe ist aber bei C#, C++, Java, ... gleich [EDIT] Korrigiere: vom Grundprizip her gleich. Was dann bezüglich Referenzen ins Detail geht, muss man aufpassen[/EDIT]. Das sind wie gesagt low-level Grundlagen, die man durch Lektüre oder Unterricht (oder beidem 😉 ) einfach lernen muss.
Da geht es nicht darum dich zu ärgern. Das ist aber fast wie die Frage was das komisch x in der Mathe-Funktion zu suchen hat. 🤔 😉
Lies dir einfach mal alle gegebnen Links durch und schnapp dir z.B. http://openbook.galileocomputing.de/visual_csharp_2012/

X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren

Danke für dein Aufwand aber ich bin kein "strickter Lernen" ^^ ich hab mir das Rheinwerk Openbook zu C# 2012 schon echt n gutes Stück durchgelesen aber ich lern so einfach ziemlich schlecht. Ich lern eher kreuz und quer und vor allem sehr praxislastig was natürlich weniger sinnvoll ist aber so is es nunmal.

Wenn ich n Problem hab oder was ned funzt dann schau ich halt einfach im Internet ob es Leute gibt die das selbe Problem haben/hatten oder zumindest ein ähnliches und versuch es dann davon abzuleiten, wenn nicht meld ich z.B. hier 😉

771 Beiträge seit 2009
vor 9 Jahren

Du hast es ja jetzt richtig gelöst:


string sDatenTyp = WelcherDatenTyp();

In deinem ersten Code hast du dagegen den Rückgabewert gar nicht verwendet gehabt und daher wurde der leere String ausgegeben.

Und die Lösung mittels 'out' sieht so aus (mit 'ref' wäre es genauso):


void Main_Game()
{
    string sDatenTyp;

    WelcherDatenTyp(out sDatenTyp);

    Console.WriteLine(sDatenTyp);
}

void WelcherDatenTyp(out string typ)
{
    typ = "string";
}

X
XqepX Themenstarter:in
15 Beiträge seit 2015
vor 9 Jahren

Ahh okay. Ja das schaut auch interessant aus.. Erinnert mich klein Bisschen an Pointer.
Aber danke für die Lösung noch, vielleicht kann ichs wann anderst mal so gebrauchen 👍 😁