Autor Beitrag
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 18:18 
Zitat:
user profile iconRalf JansenIch meinte deinen Taschenrechner. Die Calculation Methode ist so schon richtig. Der Aufruf der Methode macht aber keinen Sinn wenn man den Return Wert nicht benutzt.
Du hast einfach Calculation(userInput1, userInput2); aufgerufen aber mit dem Ergebnis das aus der Methode fällt nichts gemacht. Du mußt es schon z.b. in einer Variablen ablegen um damit weiterzuarbeiten, so ist es einfach weg.

Im Quellcode von Michael Bonacina wird bei der 'double HouseVolume()' Methode auch nirgendwo dem Rückgabewert einer Variable zugeordnet? Sollte ich mich jetzt irren: hilf mir bitte, diesbezüglich. Das jedenfalls ist der Grund, warum ich auch keine benutze. Werde aber die von Dir vorgeschlagene result-Variable dafür nutzen. :wink:
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 18:34 
@user profile iconRalf Jansen

Hier mal ein ganz rudimentäres Konstrukt, der mich auf den richtigen Weg bringen soll. Hier habe ich es geschafft, die 'int Calculation()' Methode immerhin richtig einzusetzen...?

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:
// using System;

namespace RückgabewerteInMethoden
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            int result = Calculation(b, a);
            System.Console.WriteLine(result);

            System.Console.ReadKey();
        }

        private static int Calculation(int x, int y)
        {
            return x * y;
        }


    }
}
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 29.11.21 19:23 
So macht man das, ja.

Jeder Methode erfüllt eine Aufgabe, nur eine.
Eine Methode berechnet etwas und gibt dir das Ergebnis zurück.
Die zweite Methode zeigt das Ergebnis an.
Dafür brauchst Du den Rückgabewert, um das Ergebnis der Berechnung anderswo weiter benutzen zu können, ohne dass Du ständig die Berechnung wiederholen musst..

In diesem Beispiel mag das vielleicht unnötig aussehen, aber z.B. könntest Du auf diese Weise das Ergebnis in der Konsole ausgeben lassen, oder in eine Datei schreiben lassen, um es später automatisch auszuwerten.
Oder Du willst eine richtige Benutzeroberfläche haben, dann könntest Du das Ergebnis dort anzeigen lassen.

Das Entscheidende ist, dass Du dabei die Ausgabe in der Konsole, einer Datei oder einer richtigen Benutzeroberfläche so viel bearbeiten kannst, wie Du willst, die tatsächliche Berechnung bleibt unberührt und Du riskierst keine Fehler, nur weil Du die Ausgabe anpassen willst.

Bei größeren Projekten ist das ganz normal, darauf bauen viele andere Konzepte auf.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.11.21 09:56 
Ein wichtiger Aspekt ist z.B., dass du die Funktion Calculation so einfach in ein anderes Projekt kopieren kannst. Dort wird sie dann einfach funktionieren, weil sie in sich abgeschlossen ist.

Würdest du darin auf Felder deiner Klasse zugreifen, würde das nicht so einfach gehen, weil die in dem anderen Projekt gar nicht existieren. Du müsstest diese also auch hinüberkopieren und einbinden oder deine Funktion an vorhandene Felder anpassen.

Du kannst das vergleichen mit einem Mechaniker, der mit einem Werkzeugwagen irgendwo hingeschickt wird um eine bestimmte Wartung durchzuführen. Er weiß ganz genau was er dafür braucht (wo steht die entsprechende Anlage?) und was er mit seinem Werkzeug machen soll. Und am Ende gibt er eine Wartungsbescheinigung heraus.

Fährt er aber ohne Werkzeugwagen, braucht er vor Ort nicht nur die Angabe wo er hin muss, sondern muss sich auch noch vor Ort fremdes Werkzeug zusammensuchen und sich darauf einstellen. Das ist natürlich weniger effizient und vor allem je nach Umgebung unterschiedlich.

Für diesen Beitrag haben gedankt: OldCat
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 11:07 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ein wichtiger Aspekt ist z.B., dass du die Funktion Calculation so einfach in ein anderes Projekt kopieren kannst. Dort wird sie dann einfach funktionieren, weil sie in sich abgeschlossen ist.

Würdest du darin auf Felder deiner Klasse zugreifen, würde das nicht so einfach gehen, weil die in dem anderen Projekt gar nicht existieren. Du müsstest diese also auch hinüberkopieren und einbinden oder deine Funktion an vorhandene Felder anpassen.

Du kannst das vergleichen mit einem Mechaniker, der mit einem Werkzeugwagen irgendwo hingeschickt wird um eine bestimmte Wartung durchzuführen. Er weiß ganz genau was er dafür braucht (wo steht die entsprechende Anlage?) und was er mit seinem Werkzeug machen soll. Und am Ende gibt er eine Wartungsbescheinigung heraus.

Fährt er aber ohne Werkzeugwagen, braucht er vor Ort nicht nur die Angabe wo er hin muss, sondern muss sich auch noch vor Ort fremdes Werkzeug zusammensuchen und sich darauf einstellen. Das ist natürlich weniger effizient und vor allem je nach Umgebung unterschiedlich.
Diese bildliche Veranschauung hat mir sehr weiter geholfen! Das erinnert mich daran, dass auch Ralf Jansen oder Palladin007 etwas von Modularität im Code sprachen. Darauf war ich bisher nicht eingegangen. Muss aber sagen, dass ich Modularität grundsätzlich sehr mag. Daher werde ich jetzt mich an den Taschenrechner setzen, und dabei alle von euch gemachten "Vorgaben" umsetzen:

* Code möglichst modular.
* Der Anwender kann zwischen den arithmetischen Operatoren wählen (ich belasse es erst mal bei den Grundrechenarten).
* Nutzung von Rückgabewerten und Eingabeparametern in Methoden.
* Möglichst das EVA Prinzp anwenden.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 14:03 
Okay, ich habe jetzt einen Taschenrechner programmiert, der die "Vorgaben" von euch einhält (so gut ich es hinbekomen habe).


Ich habe den Quellcode in 5 verschiedene Klassen gegliedert: MainClass, RunProgram, CalcInput, Calculation und CalcOutput.
Leider habe ich immer noch Schwierigkeiten, was die im EVA-Prinzip die Ausgabe (CalcOutput) angeht. Bisher ist die CalcOutput Klasse funktionslos. Die Ausgabe an den Anwender (Ergebnis) wird über eine Anweisung innerhalb der CalcInput Klasse vorgenommen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// using System;

// Ich versuche es, Klassen und Methoden modular aufzubauen.
 

namespace Taschenrechner2
{
    internal class MainClass
    {
        static void Main(string[] args)
        {
            RunProgram myCalc = new RunProgram();
            myCalc.Run();
        }
    }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
namespace Taschenrechner2
{
    internal class RunProgram
    {
        private const string AppTitle = "Mini Calculator";
        public void Run()
        {   System.Console.Title = AppTitle;

            System.Console.WriteLine("###############");
            System.Console.WriteLine(AppTitle);
            System.Console.WriteLine("###############\n");

            CalcInput.ChooseInputs();

            System.Console.WriteLine("\nPress any key to exit...");
            System.Console.ReadKey();
        }
    }
}


ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
namespace Taschenrechner2
{
    internal class CalcInput
    {
        // NumeralsChoice() und OperatorChoice() zusammelegen, als ChooseInputs()?
        public static void ChooseInputs()
        {
            System.Console.WriteLine("Please enter your first digit: ");
            double digit1 = double.Parse(System.Console.ReadLine());
            System.Console.WriteLine($"You chose: {digit1}");

            System.Console.WriteLine("Please enter your second digit: ");
            double digit2 = double.Parse(System.Console.ReadLine());
            System.Console.WriteLine($"You chose: {digit2}");

            System.Console.WriteLine(@"Choose your operator by number and hit enter:

> 1.) Addition
> 2.) Subtraction
> 3.) Multiplication
> 4.) Division"
);

            int userChoice = int.Parse(System.Console.ReadLine());
            // TODO: switch_case userChoice to either Addition(), Subtraction(), Multiplication() or Division() Methods.

            switch (userChoice)
            {
                case 1:
                    Calculation.Addition(digit1, digit2);
                    break;
                case 2:
                    Calculation.Subtraction(digit1, digit2);
                    break;
                case 3:
                    Calculation.Multiplication(digit1, digit2);
                    break;
                case 4:
                    Calculation.Division(digit1, digit2);
                    break;
            }

            // Hier ist die bisherige Ausgabe:
            System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");
        }
    }
}


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:
namespace Taschenrechner2
{
    internal class Calculation
    {
        public static double Addition(double x, double y)
        {
            return x + y;
        }

        public static double Subtraction(double x, double y)
        {
            return x - y;
        }

        public static double Multiplication(double x, double y)
        {
            return x * y;
        }

        public static double Division(double x, double y)
        {
            return x / y;
        }
    }
}


Problem:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
namespace Taschenrechner2
{
    public class CalcOutput
    {
        public static void Results()
        {
            System.Console.WriteLine(Calculation.Addition();
        }
    }
}
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 30.11.21 14:11 
Spontan sehe ich zwei Probleme:

- Was passiert, wenn man vor dem userChoice-switch einen Wert eingibt, den Du nicht definiert hast?
- Du nutzt wieder nicht die Rückgabewerte der Berechnungsmethoden

Warum nutzt Du nicht wie vorher den Rückgabewert und gibst den aus?
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 14:25 
Zitat:
user profile iconPalladin007- Was passiert, wenn man vor dem userChoice-switch einen Wert eingibt, den Du nicht definiert hast?
Danke für den Hinweis! Habe den default case hinzugefügt.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
switch (userChoice)
            {
                case 1:
                    Calculation.Addition(digit1, digit2);
                    break;
                case 2:
                    Calculation.Subtraction(digit1, digit2);
                    break;
                case 3:
                    Calculation.Multiplication(digit1, digit2);
                    break;
                case 4:
                    Calculation.Division(digit1, digit2);
                    break;
                default:
                    System.Console.WriteLine("Your input is invalid. Try again, with numerals 1 - 4.");
                    break;
            }

Jetzt nur noch den Rückgabewert hin bekommen 8)

Sehe gerade, da muss ich auch noch mal ran ... (switch_case default)...
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 15:15 
Die revisionierte CalcInput() Methode... sieht das besser aus?

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
namespace Taschenrechner2
{
    internal class CalcInput
    {
        // NumeralsChoice() und OperatorChoice() zusammelegen, als ChooseInputs()?
        public static void ChooseInputs()
        {
            System.Console.WriteLine("Please enter your first digit: ");
            double digit1 = double.Parse(System.Console.ReadLine());
            System.Console.WriteLine($"You chose: {digit1}");

            System.Console.WriteLine("Please enter your second digit: ");
            double digit2 = double.Parse(System.Console.ReadLine());
            System.Console.WriteLine($"You chose: {digit2}");

            System.Console.WriteLine(@"Choose your operator by number and hit enter:

> 1.) Addition
> 2.) Subtraction
> 3.) Multiplication
> 4.) Division"
);

            int userChoice = int.Parse(System.Console.ReadLine());
            // TODO: switch_case userChoice to either Addition(), Subtraction(), Multiplication() or Division() Methods.

            switch (userChoice)
            {
                case 1:
                    Calculation.Addition(digit1, digit2);
                    break;
                case 2:
                    Calculation.Subtraction(digit1, digit2);
                    break;
                case 3:
                    Calculation.Multiplication(digit1, digit2);
                    break;
                case 4:
                    Calculation.Division(digit1, digit2);
                    break;
                default:
                    System.Console.WriteLine("Your input is invalid. Try again, with numerals 1 - 4.");
                    ChooseInputs();
                    break;
            }

            // System.Console.WriteLine(Calculation.Addition(digit1, digit2));
            double result = Calculation.Addition(digit1, digit2);
            System.Console.WriteLine(result);
        }
    }
}
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 15:51 
Sollte ich vom Prinzip her nun den Rückgabewert der Addition() Methode richtig verwendet haben, wurmt mich allerdings noch eine Sache gehörig:

Wie bekomme ich "double result" in eine eigene Klasse-> Methode()? Bisher scheitere ich immer an ungültigen Eingabeparameter...
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 30.11.21 15:55 
Du kannst im Switch auch Variablen zuweisen.
Vorher definieren, im switch zuweisen, danach ausgeben.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Di 30.11.21 16:27 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst im Switch auch Variablen zuweisen.
Vorher definieren, im switch zuweisen, danach ausgeben.
Entschuldige, wenn ich jetzt möglicherweise Korinthen kacke, aber meinst Du: definieren = deklarieren & zuweisen = initialisieren? :angel: :hair:

Allerdings kann ich mit dem Hinweis ad hoc nichts anfangen :nixweiss: Durch das Initialisieren von zuvor deklarierten Variablen im switch_case Statement kann ich das Problem lösen? Hmmm...
Falls ich Dich jetzt komplett missverstehe, wäre ich für einen Hinweis dankbar :beer:
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 30.11.21 16:36 
Zitat:
definieren = deklarieren


Ja - ich dachte, "definieren" klingt einfacher.

Die zwei Wörter "zuweisen" und "initialisieren" sagen aber etwas anderes aus.
Initialisieren ist nur initial, also der erste Wert für die Variable, damit sie überhaupt einen hat. Innerhalb einer Methode ist das notwendig, sonst lässt es der Compiler nicht zu.
Mit Zuweisen meine ich jede weitere Änderung.

Für diesen Beitrag haben gedankt: OldCat
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mi 01.12.21 09:43 
Ich sehe jetzt, wieso du tatsächlich glaubst, Rückgabewerte sind sinnlos. Denn das Problem, in dem der Hund begraben ist, ist diese Codestelle:

ausblenden C#-Quelltext
1:
2:
// Hier ist die bisherige Ausgabe:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");


Wie in jedem vorher gezeigten Codebeispiel machst du immer denselben Fehler, der - frei nach Einstein - immer wieder Wahnsinn ist, also unsere Versuche, dir Rückgabewerte klar zu machen, sabotiert.

Ist dir klar, das dein Taschenrechner ausschließlich und nur addieren kann ? Das es vollkommen egal ist, was der Benutzer für eine Rechenoperation wählt, es immer wieder nur eine Addition ist ? Und warum das so ist ? Ist dir klar, das man in solche Ausgaben auch Variablen als Platzhalter schreiben kann, z.B. so:

ausblenden C#-Quelltext
1:
2:
// Hier ist die bisherige Ausgabe:
System.Console.WriteLine($"The result of your operation is: {myResult}");


Das sollte als Denksanstöße erst mal genügen ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 01.12.21 10:22 
ausblenden C#-Quelltext
1:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");					

Lustigerweise nutzt Du da auch Rückgabewerte, sogar mehrere ;)
Der Compiler macht nix anderes daraus, als eine Variable mit dem Rückgabewert der Methode zu initialisieren und das dann in den String zu schreiben.

Ergo:

ausblenden C#-Quelltext
1:
2:
double result = Calculation.Addition(digit1, digit2);
System.Console.WriteLine($"The result of your addition is: {result}");

Und es geht noch weiter:

ausblenden C#-Quelltext
1:
2:
3:
double result = Calculation.Addition(digit1, digit2);
string message = $"The result of your addition is: {result}";
System.Console.WriteLine(message);

Und das $"" heißt String Interpolation und wird zu Folgendem übersetzt:

ausblenden C#-Quelltext
1:
2:
3:
double result = Calculation.Addition(digit1, digit2);
string message = string.Format("The result of your addition is: {0}", result);
System.Console.WriteLine(message);

(Noch - mit .NET 6 wurde das grundlegend überarbeitet und wurde sehr viel komplexer, das Ergebnis bleibt aber gleich)

Also wieder ein Rückgabewert - Du nutzt an jeder Ecke und Kante Rückgabewerte und merkst es gar nicht.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mi 01.12.21 17:22 
Zitat:
user profile iconOlafSt Ich sehe jetzt, wieso du tatsächlich glaubst, Rückgabewerte sind sinnlos.
Das ist nicht richtig. Ich habe niemals an irgendeiner Stelle behauptet, dass Rückgabewerte sinnlos seien.
Sondern: Ich bin ein Anfänger der Rückgabewerte nicht versteht. Und fragte mehrmals die Frage: Wofür sind Rückgabewerte notwendig, bzw. zwingend notwendig? Wofür brauche ich sie? Wann kann ich sie weg lassen?

Zitat:
Wie in jedem vorher gezeigten Codebeispiel machst du immer denselben Fehler, der - frei nach Einstein - immer wieder Wahnsinn ist, also unsere Versuche, dir Rückgabewerte klar zu machen, sabotiert.
Das vermute ich auch. Und welcher Fehler ist das? Ich sehe ihn ja nicht, den Fehler.

Zitat:
Ist dir klar, das dein Taschenrechner ausschließlich und nur addieren kann ? Das es vollkommen egal ist, was der Benutzer für eine Rechenoperation wählt, es immer wieder nur eine Addition ist ? Und warum das so ist ?

Entschuldigt bitte. Das hätte ich natürlich erwähnen müssen: Ich habe bisher absichtlich nur die Addition implementiert, bis ich das Thema mit den Rückgabewerten richtig vertanden habe und diese auch richtig einsetze. Daher sind die anderen Grundrechenarten erstmal nur //TODO:

##################################################################

Hey Palladin007,
jetzt bin ich doch wieder recht verwirrt:

Wird denn mit:
ausblenden C#-Quelltext
1:
2:
double result = Calculation.Addition(digit1, digit2);
System.Console.WriteLine($"The result of your addition is: {result}");
... nicht der Rückgabewert der Methode public static int Addition(int x, int y) aus der Calculation Klasse genutzt, wie es sein sollte? Die Frage hatte ich ja weiter oben direkt gestellt. Hatte nur keiner drauf geantwortet.

Hiermit konnte ich jetzt gar nichts anfangen. Das hab ich ja nirgends geschrieben. Was soll mir dieses Beispiel sagen?
ausblenden C#-Quelltext
1:
2:
3:
double result = Calculation.Addition(digit1, digit2);
string message = $"The result of your addition is: {result}";
System.Console.WriteLine(message)


Zitat:
Also wieder ein Rückgabewert - Du nutzt an jeder Ecke und Kante Rückgabewerte und merkst es gar nicht.
Ja, das ist nicht gut. Wohl deswegen wende ich mich ja auch an euch.

Was also machen wir jetzt mit mir?

Was ist jetzt an meinem Code explizit falsch/fehlerhaft, was die Rückgabewerte angeht?
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 01.12.21 18:01 
Das war vielleicht nicht ganz fair.
Ich habe deinen Code mit meinem Wissen über die C#-Technologien auseinander genommen und das geschrieben, was im Hintergrund tatsächlich passiert.
Bei C# passiert viel automatisch oder der Compiler generiert Code, ich wollte dir zeigen, dass Du praktisch nichts machen kannst, ohne direkt oder indirekt Rückgabewerte zu verwenden.

Zitat:
... nicht der Rückgabewert der Methode public static int Addition(int x, int y) aus der Calculation Klasse genutzt, wie es sein sollte?

Das wird sie. Du hattest den Aufruf der Addition-Methode aber direkt im String stehen:

ausblenden C#-Quelltext
1:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");					

Beachte den Teil im String in den geschweiften Klammern. Das ist ein Methoden-Aufruf und der Rückgabewert der Methode wird in den String geschrieben.
Hierzu geht der Compiler hin und "schreibt" dafür eine Variable in den Code und verwendet dann die Variable.
Das Ergebnis:

ausblenden C#-Quelltext
1:
2:
double result = Calculation.Addition(digit1, digit2);
System.Console.WriteLine($"The result of your addition is: {result}");

Vergleich mal die letzten beiden Code-Snippets, sie tun das gleiche, aber beim zweiten Snippet steht die Variable (die sowieso da ist), direkt im Code, sodass Du sie direkt sehen kannst.

Und genau da verwendest Du den Rückgabewert der Addition-Methode.
Du deklarierst eine Variable, initialisierst sie mit dem Rückgabewert deiner Methode und übergibst sie an den String, damit er angezeigt werden kann.
Ohne Rückgabewerte wäre das nicht möglich, wie sollte das Ergebnis der Berechnung sonst in den String kommen?

Zitat:
Hiermit konnte ich jetzt gar nichts anfangen. Das hab ich ja nirgends geschrieben.

Hast Du schon, Du wusstest es nur nicht, das ist das, was der Compiler daraus macht:
Du rufst deine Addition-Methode auf und der Rückgabewert wird an die string.Format-Methode übergeben. Der Rückgabewert davon wird an die Console.WriteLine-Methode übergeben.

Du verwendest also ganz viele Rückgabewerte, ohne es wirklich zu merken.
Jede Methode mit einem Rückgabewert liefert ein Ergebnis zurück, damit Du, ohne diese andere Methode bearbeiten zu müssen, etwas mit dem Ergebnis machen kannst.
Ohne Rückgabewert wäre das nicht möglich.


Zuletzt bearbeitet von Palladin007 am Mi 01.12.21 18:13, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: OldCat
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: Mi 01.12.21 18:03 
So langsam wird dies ein Endlos-Thema. Es kann doch nicht sein, daß du immer noch nicht die gezeigten Code-Beispiele verstehst?

Dein expliziter Fehler in deinem zuletzt gezeigten Taschenrechner-Code ist, daß du zwar in dem switch-Block die Berechnungsmethoden aufrufst, aber eben nicht das zurückgegebene Ergebnis speicherst (und somit diese Aufrufe sinnlos sind - der Compiler diese sogar evtl. eliminiert). Du mußt also eine Zuweisung vornehmen (das, was Palladin007 dir auch mitgeteilt hat)!

Das ist, als wenn du einkaufen gehst, aber die gekauften Lebensmittel beim Markt zurückläßt...
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 01.12.21 18:11 
Ich versuchs nochmal.

Folgender Code:

ausblenden C#-Quelltext
1:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");					

Daraus wird:

ausblenden C#-Quelltext
1:
2:
double result = Calculation.Addition(digit1, digit2);
System.Console.WriteLine($"The result of your addition is: {result}");

Daraus wird:

ausblenden C#-Quelltext
1:
2:
3:
double result = Calculation.Addition(digit1, digit2);
string message = $"The result of your addition is: {result}";
System.Console.WriteLine(message);

Alle drei Snippets sind technisch identisch, sie tun alle das gleiche.

Ganz oben ist dein Code, die beiden anderen Snippets sind die Schritte, was der Compiler aus deinem Code macht, bevor er wirklich kompiliert wird.
Das letzte Snippet ist für dich in diesem Moment nicht so wichtig, ich wollte nur verdeutlichen, dass sich selbst ganz tief versteckt noch Rückgabewerte verstecken.

Wenn ich nun deinen Code mit dem Switch nehme:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
switch (userChoice)
{
    case 1:
        Calculation.Addition(digit1, digit2);
        break;
    case 2:
        Calculation.Subtraction(digit1, digit2);
        break;
    case 3:
        Calculation.Multiplication(digit1, digit2);
        break;
    case 4:
        Calculation.Division(digit1, digit2);
        break;
}

// Hier ist die bisherige Ausgabe:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");

... und die letzte Zeile einmal auseinander nehme:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
switch (userChoice)
{
    case 1:
        Calculation.Addition(digit1, digit2);
        break;
    case 2:
        Calculation.Subtraction(digit1, digit2);
        break;
    case 3:
        Calculation.Multiplication(digit1, digit2);
        break;
    case 4:
        Calculation.Division(digit1, digit2);
        break;
}

// Hier ist die bisherige Ausgabe:
double result = Calculation.Addition(digit1, digit2);
System.Console.WriteLine($"The result of your addition is: {result}");

Und nun sag mir: Wie viel Sinn ergibt bei diesem Code das switch?

Wäre es nicht klüger, die letzte Zeile zu entfernen und das Ergebnis der einzelnen Methodenaufrufe im switch in die Variable und den String zu schreiben?

Für diesen Beitrag haben gedankt: OldCat
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mi 01.12.21 18:33 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
So langsam wird dies ein Endlos-Thema. Es kann doch nicht sein, daß du immer noch nicht die gezeigten Code-Beispiele verstehst?

Dein expliziter Fehler in deinem zuletzt gezeigten Taschenrechner-Code ist, daß du zwar in dem switch-Block die Berechnungsmethoden aufrufst, aber eben nicht das zurückgegebene Ergebnis speicherst (und somit diese Aufrufe sinnlos sind - der Compiler diese sogar evtl. eliminiert). Du mußt also eine Zuweisung vornehmen (das, was Palladin007 dir auch mitgeteilt hat)! [...]


Okay alles klar, dann beende ich das Thema mal lieber.

Tut mir leid, dass ich so dumm bin. Ich werde mich dann auch erstmal einfach weiter bilden und mich irgendwann zum Thema "Rückgabewerte in Methoden" befassen. Vielleicht macht es bis dahin auch einfach von selbst "klick", während ich für mich weiter lerne. Im Grunde hab ich ja jetzt gelernt, wie man sie schreibt. Und bedingt auch, wofür sie gut sind ... denke ich jedenfalls. Ein paar bestimmte Sätze von euch notiere ich mir zum Thema und dann soll's gut sein.

Ein riesen Dankeschön geht an dieser Stelle an Palladin007, der mir wirklich sehr geholfen hat, bis hier hin. Ein wirklich fettes Dankeschön!! :zustimm: