Hur nyttjar jag resultatet min metod returnerar? [C#]

Permalänk
Medlem

Hur nyttjar jag resultatet min metod returnerar? [C#]

Hej,

håller på att ta mina första staplande steg in i programmerings värld och följer Microsofts egna C# för nybörjare där jag just lärt mig vad en metod är och hur man anropar (rätt ord?) den.

Glad i hågen tänkte jag att nu sablar ska jag minsann göra något eget! Jag har gjort en enkel konsolapplikation som tar emot två siffror och sedan frågar vilket av de fyra vanliga räknesätten du vill använda, anropar den korrekta metoden beroende på ditt val och sedan kastar ur sig resultat beroende på vad man väljer. Min kod är följande:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MethodCalculator { class Program { static void Main(string[] args) { Console.WriteLine("Pick a number "); float firstNumber = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Pick another number "); float secondNumber = Convert.ToSingle(Console.ReadLine()); Console.Write("What would you like to do?\n" + "1) Add\n" + "2) Subtract\n" + "3) Multiply\n" + "4) Divide\n" + "5) All of the above\n"); int choice = Convert.ToInt16(Console.ReadLine()); if (choice == 1) { float sum = Add(firstNumber, secondNumber); Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, sum); } else if (choice == 2) { float difference = Subtract(firstNumber, secondNumber); Console.WriteLine("The difference of {0} and {1} is {2}", firstNumber, secondNumber, difference); } else if (choice == 3) { float product = Multiply(firstNumber, secondNumber); Console.WriteLine("The product of {0} and {1} is {2}", firstNumber, secondNumber, product); } else if (choice == 4) { float quotient = Divide(firstNumber, secondNumber); Console.WriteLine("The quotient of {0} and {1} is {2}", firstNumber, secondNumber, quotient); } else if (choice == 5) { float sum = Add(firstNumber, secondNumber); float difference = Subtract(firstNumber, secondNumber); float product = Multiply(firstNumber, secondNumber); float quotient = Divide(firstNumber, secondNumber); Console.WriteLine("You picked {0} as your first number and {1} as your second number.\n" + "If you add them you get {2}\n" + "If you subtract them you get {3}\n" + "If you multiply them you get {4}\n" + "If you divide {0} with {1} you get {5}", firstNumber, secondNumber, sum, difference, product, quotient); } else { Console.WriteLine("That is not an option"); Console.WriteLine("Press any key to exit"); } Console.ReadLine(); } private static float Add( float firstNumber, float secondNumber) { float sum = firstNumber + secondNumber; return sum; } private static float Subtract( float firstNumber, float secondNumber) { float difference = firstNumber - secondNumber; return difference; } private static float Multiply( float firstNumber, float secondNumber) { float product = firstNumber * secondNumber; return product; } private static float Divide( float firstNumber, float secondNumber) { float quotient = firstNumber / secondNumber; return quotient; } } }

Jag undrar nu vad det är jag missförstått då jag trodde att de saker jag returnerar (hoppas det är rätt ord) från metoderna skulle gå att använda direkt utan att deklarera dem. Exempelvis trodde jag att nedanstående skulle fungera:

if (choice == 1) { Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, sum); }

Men då säger kompilatorn att "The name 'sum' doesn't exist in the current context" och jag måste istället göra

if (choice == 1) { float sum = Add(firstNumber, secondNumber); Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, sum); }

Ett annat alternativ som jag först använde var

if (choice == 1) { Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, Add(firstNumber, secondNumber)); }

men det kändes krånligare att läsa i min mening, mycket möjligt att det är mer korrekt dock?

Att koden i övrigt troligen går att förbättra på massor av sätt är jag medveten om, speciellt så gillar jag inte den gigantiska IF prylen och antar att det går att göra mycket snyggare men det är ett problem för en annan dag, såtillvida det inte är den som strular till det för mig?

Min fundering efter denna gigantiska vägg av information är alltså följande: Kan jag på något sätta nyttja det jag får ut ur metoderna utan att behöva deklarera dem eller gör jag så som man ska göra?

Förhoppningsvis betyder den frågan ungefär vad jag tror att den gör

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

@Daz: I dina metoder så returnerar du inte variabeln sum, du returnerar värdetsum. Du måste alltså tilldela det returnerade värdet till en variabel för att kunna använda det, eller direkt skicka det som argument till någon annan funktion/metod. D.v.s. precis som du gör i de två alternativen du listar.

Rent allmänt i C# (och många liknande språk) är att en variabel bara lever i sitt "scope", som definieras av { och }. D.v.s. i t.ex. Add så är variabeln sum en lokal variabel i den metoden, och när koden når } i slutet av metoden så slutar sum att existera. Detsamma gäller i t.ex.:

if (choice == 1) { float sum = Add(firstNumber, secondNumber); Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, sum); }

Här existerar bara sum från det att du deklarerar variabeln till slutet av }, så det går inte att använda variabeln utanför detta scope.

Ett slags undantag mot detta är metod-parametrar, som i stort sett fungerar som lokala variabler även om de tekniskt sett är deklarerade utanför metodens { }. D.v.s. firstNumber och secondNumber i Add är lokala variabler som har värdena Add anropades med, och är inte samma variabler som firstNumber och secondNumber i Main.

Sen är egentligen t.ex. sum helt onödig i Add, du kan bara returnera summan direkt:

private static float Add(float firstNumber, float secondNumber) { return firstNumber + secondNumber; }

Skrivet av Daz:

... speciellt så gillar jag inte den gigantiska IF prylen ...

Man brukar vanligtvis använda switch för sån kod.

Permalänk
Medlem
Skrivet av perost:

@Daz: I dina metoder så returnerar du inte variabeln sum, du returnerar värdetsum. Du måste alltså tilldela det returnerade värdet till en variabel för att kunna använda det, eller direkt skicka det som argument till någon annan funktion/metod. D.v.s. precis som du gör i de två alternativen du listar.

Rent allmänt i C# (och många liknande språk) är att en variabel bara lever i sitt "scope", som definieras av { och }. D.v.s. i t.ex. Add så är variabeln sum en lokal variabel i den metoden, och när koden når } i slutet av metoden så slutar sum att existera. Detsamma gäller i t.ex.:

if (choice == 1) { float sum = Add(firstNumber, secondNumber); Console.WriteLine("The sum of {0} and {1} is {2}",firstNumber, secondNumber, sum); }

Här existerar bara sum från det att du deklarerar variabeln till slutet av }, så det går inte att använda variabeln utanför detta scope.

Ett slags undantag mot detta är metod-parametrar, som i stort sett fungerar som lokala variabler även om de tekniskt sett är deklarerade utanför metodens { }. D.v.s. firstNumber och secondNumber i Add är lokala variabler som har värdena Add anropades med, och är inte samma variabler som firstNumber och secondNumber i Main.

Tack! Detta var extraordinärt lärorikt och nu förstår jag mycket bättre varför det fungerar som det gör. Kändes som att jag satt och slog mot en mental vägg när jag försökte få rätsida på det här och exemplen jag hittade på nätet ville inte riktigt klicka.

Skrivet av perost:

Sen är egentligen t.ex. sum helt onödig i Add, du kan bara returnera summan direkt:

private static float Add(float firstNumber, float secondNumber) { return firstNumber + secondNumber; }

Jag gjorde som i ditt exempel ovan först men bestämde mig för att göra en överdriven lösning istället. Jag förstår dock varför man vill göra som i ditt exempel nu när jag förstått att det är just värdet och inte variabeln som sådan som skickas tillbaka.

Skrivet av perost:

Man brukar vanligtvis använda switch för sån kod.

Har sett referenser till Switch tidigare när jag petat runt lite i powershell men aldrig riktigt behövt ta reda på vad det är. Hoppas på att Switch täcks med exempel senare i denna kurs, annars kommer jag experimentera med det själv senare.

Om jag kunde klicka på "Bra inlägg" fler gånger hade jag gjort det

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |