(funktioner) Murach s: kap 6 2013-01-23 1 Winstrand Development
Metoder I C# kan vi dela in koden i block en kodsekvens ska köras likadant på flera ställen i applikationen. Detta block kallas för en metod (ibland även funktion) Exempel på en metod kan vara att: Utföra samma beräkningssteg flera gånger Hämta standardinställningar när programmet startar eller användaren önskar detta Spara ett dokument Hämta data från, eller skriva till, en databas Winstrand Development 2013-01-23 2
Metoder Istället för att skriva samma saker på flera ställen kan man göra en metod av sekvensen och anropa detta när det behövs. Du får en bättre överblick på koden och kan enklare organisera om/ändra funktionalitet. Metoder är en grundläggande faktor för att kunna jobba objektorienterat Winstrand Development 2013-01-23 3
Syntax för metoder: En metod är uppbyggd av fyra delar, varav två är obligatoriska, returntype och MethodName acccessor returntype MethodName([parameterList]) //Skriv kod för metoden här Namn accessor returntype MethodName Beskrivning Metodens åtkomst, synlighet, antingen public eller private. Med public tillåts andra klasser komma åt metoden. Om denna utelämnas blir åtkomsten automatiskt private. Definierar den datatyp som returneras. Kan vara de inbyggda (int, double etc), klasser eller void. Måste anges. Det namn som används för att anropa metoden. Måste anges. parameterlist Ett antal variabler, parametrar, som skickas till metoden. Winstrand Development 2013-01-23 4
Exempel på metoder: private void InitializeWindow() //Beräkningar... public decimal GetDiscountRate(decimal subtotal) decimal discountrate = 0m; //Beräkningar... return discountrate; int Sum(int start, int stop) int result = 0; //Beräkningar... return result; Åtkomst Privat Returtyp Ingen (void) Parametrar Inga Åtkomst Publik Returtyp decimal Parametrar decimal subtotal Åtkomst Privat Returtyp int Parametrar int start int stop Winstrand Development 2013-01-23 5
Returtyp Den del i metoden som betecknas returntype är den datatyp som returneras från metoden. En metod kan returnera ett värde eller inget alls. Om inget returneras så är typen void. Nyckelordet return används i metoden för att returnera värdet. Returtypen är int. I metoden returneras värdet på variabeln result int Sum(int start, int stop) int result = 0; //Beräkningar... return result; Winstrand Development 2013-01-23 6
Returtypen void Om inte metoden ska returnera något värde anges void (tom, ogiltig) framför metodens namn. Nyckelordet return utesluts i metoden då void specificerar att ingenting ska returneras när anropet är klart. Inget returneras return är utelämnat. void InitializeWindow() Console.Clear(); Console.WriteLine("Welcome to my store"); Winstrand Development 2013-01-23 7
Parameterlista I parentesen efter metodens namn finns parameterlistan. En metod kan genom denna lista ta emot ingen, en eller flera parametrar. Parametrarna separeras med kommatecken. En parameter är en variabel som används inuti metoden. Parametrarna skickas med vid anropet av metoden. Winstrand Development 2013-01-23 8
Parameterlista Precis som med vanliga variabler måste både dess datatyp och namn definieras. Variablerna är inom metodens scope de kan inte användas utanför detta public decimal GetDiscountRate(decimal subtotal) decimal discountrate = 0m; // more discount when buying for more if (subtotal >= 1000m) discountrate = 0.2m; else if (subtotal >= 500m) discountrate = 0.1m; return discountrate; Winstrand Development 2013-01-23 9
Exempel Några metoder redo för användning. Metoderna är XML-dokumenterade /// <summary> /// Returns an int and takes 2 ints as parameters /// </summary> /// <param name="start">minimum value</param> /// <param name="stop">maximum</param> /// <returns> /// The sum of the integers between start and stop /// </returns> int Sum(int start, int stop) int result = 0; for (int i = start; i <= stop; i++) result += i; return result; /// <summary> /// Neither returns anything nor takes any parameters. /// </summary> private void InitializeWindow() Console.Clear(); Console.WriteLine("Welcome to my store"); /// <summary> /// Returns a decimal value and takes /// 1 decimal parameter /// </summary> /// <param name="subtotal"> /// The total cost before any discount /// </param> /// <returns>the discount rate</returns> public decimal GetDiscountRate(decimal subtotal) decimal discountrate = 0m; // more discount when buying more if (subtotal >= 1000m) discountrate = 0.2m; else if (subtotal >= 500m) discountrate = 0.1m; return discountrate; Winstrand Development 2013-01-23 10
Anropa metoder För att kunna använda en metod måste den anropas Anropet till en metod sker med hjälp av punktoperatorn (.). Vi har använt flera metoder tidigare via denna operator: //Returnerar inget (void) - tar en parameter Console.WriteLine("Hello"); //Returnerar en string - tar ingen parameter string input = Console.ReadLine(); //Returnerar en decimal - tar en string-parameter decimal value = Convert.ToDecimal(input); Winstrand Development 2013-01-23 11
Anropa metoder Alla metoder tillhör en klass. Så länge metoden vi anropar är i en annan klass måste punkten användas. Är däremot metoden i samma klass kan man använda nyckelordet this eller helt utelämna punkten. Nyckelordet this är bra att använda för att förtydliga att det är just detta objekt som vi arbetar med. Winstrand Development 2013-01-23 12
Anropa metoder /// <summary>en applikation med några metoder/// </summary> public partial class MethodsExampleForm : Form /// <summary> /// Anropas när användaren trycker på knappen btncalculate /// </summary> private void btncalculate_click(object sender, EventArgs e) decimal price, rate; price = Convert.ToDecimal(txtPrice.Text); rate = GetDiscountRate(price); txtrate.text = rate.tostring("p") ; Anrop till en metod i samma klass public decimal GetDiscountRate(decimal subtotal) decimal discountrate = 0m; if (subtotal >= 1000m) discountrate = 0.2m; else if (subtotal >= 500m) discountrate = 0.1m; return discountrate; //Resterande delar är utelämnade... Winstrand Development 2013-01-23 13
Anropa metoder Antalet parameterar i parameterlistan, samt deras datatyper, måste matcha definitionen av metoden. Variablernas namn behöver inte överensstämma med det namn parametern har. Det är utvecklarens (din) uppgift att se till så du skickar rätt parameter på rätt plats! private void btncalculate_click(object sender, EventArgs e) decimal price, rate; price = Convert.ToDecimal(txtPrice.Text); rate = GetDiscountRate(price); txtrate.text = rate.tostring("p"); public decimal GetDiscountRate(decimal subtotal) //... Winstrand Development 2013-01-23 14
Anropa metoder I exemplet nedan anropas metoden Sum. Villkoren för att koden ska kompileras är uppfylld, men resultatet kommer alltid vara 0 då vi skickar parametrarna i fel ordning! private void btnsum_click(object sender, EventArgs e) int max, min, result; min = 0; max = 10; //skickar parametrarna i fel ordning! result = Sum(max, min); //ger alltid värdet 0 txtsum.text = result.tostring(); int Sum(int start, int stop) int result = 0; for (int i = start; i <= stop; i++) result += i; return result; Winstrand Development 2013-01-23 15
Identifiera metoder Ofta finns det delar av koden man skrivit som kan brytas ut till en metod. Upprepas samma rader kod flera gånger är det alltid en bra idé att bryta ut en metod. Om vi vill ändra koden vid ett senare tillfäller kan det räcka att ändra koden i metoden. Har vi inte skapat metoder kan vi vara tvingade att göra samma ändringar på flera ställen i koden. Risken för att vi missar ett ställe är stort risken för buggar ökar! Winstrand Development 2013-01-23 16
Identifiera metoder Exempel Utför samma operation flera gånger. Winstrand Development 2013-01-23 17
Identifiera Metoder Exempel Slutresultatet är det samma Winstrand Development 2013-01-23 18
Riktlinjer för att skapa metoder Varje metod ska utföra en distinkt uppgift samt vara kort Ett bra mått är att en metod inte ska överstiga 20 rader. Om så är fallet ska metoden brytas ner i flera delar. Namnet ska återspegla metodens uppgift Namn på metoder skrivs med stor bokstav i början, så kallad PascalCase. Använd gärna ett verb i namnet ex. GetUserData() och CalculateSubTotal() Metoden ska dokumenteras. Använd XML-dokumentation för alla metoder. Detta skapas genom att använda /// (tre st. slash). Visual Studio genererar automatiskt de taggar som behövs. Använd kommentarer (// eller /* */) där du behöver förtydliga vad som görs. Winstrand Development 2013-01-23 19