Använd vänsterpil och högerpil för att navigera

Eller Ctrl+P för att skriva ut till PDF (eller på papper)

Lektion 6

Metoddeklarationer

Metod

Indata
Beräkning
Utdata

Varför behöver vi metoder?

Summera en array

  1. // indata
  2. int[] numbers = {5, 2, 10, 42, 7};
  3. // beräkning
  4. int sum = 0;
  5. for (int i = 0; i < numbers.Length; i += 1) {
  6. sum += numbers[i];
  7. }

Två listor på samma körning

  1. int[] numbers1 = {5, 2, 10, 42, 7};
  2. int[] numbers2 = {9, 14, 26};
  3. int sum1 = 0;
  4. for (int i = 0; i < numbers1.Length; i += 1) {
  5. sum1 += numbers1[i];
  6. }
  7. // samma kod igen
  8. int sum2 = 0;
  9. for (int i = 0; i < numbers2.Length; i += 1) {
  10. sum2 += numbers2[i];
  11. }

Gemensam kod i egendefinierad metod

  1. int[] numbers1 = {5, 2, 10, 42, 7};
  2. int[] numbers2 = {9, 14, 26};
  3. int sum1 = SumArray(numbers1);
  4. int sum2 = SumArray(numbers2);

Exempel på egen metod

Maximumfunktionen

  1. int largest1 = Math.Max(2, 5);
  2. int largest2 = Math.Max(5, 2);
  3. int largest3 = Math.Max(10, 17);

Metodsignatur för Math.Max

  1. int Math.Max(int val1, int val2)
  2. // int Math.Max(int val1, int val2)
  3. // returtyp namn argument 1 argument 2

Deklaration av egen metod

  1. using ...;
  2. namespace ConsoleApp {
  3. class Program {
  4. static void Main(string[] args) {
  5. ...
  6. }
  7. // egna metoder
  8. static int Max(int val1, int val2) {
  9. ...
  10. }
  11. }
  12. }

Dags att implementera maximumfunktionen!

Implementation av maximumfunktionen

  1. static int Max(int val1, int val2) {
  2. if (val1 > val2) {
  3. return val1;
  4. } else {
  5. return val2;
  6. }
  7. }

Anrop av metoden

  1. static void Main(string[] args) {
  2. int a = Max(2, 5);
  3. int b = Max(5, 2);
  4. int c = Max(10, 17);
  5. }
  6. static int Max(int val1, int val2) {
  7. if (val1 > val2) {
  8. return val1;
  9. } else {
  10. return val2;
  11. }
  12. }

Parameternamn

  1. static void Main(string[] args) {
  2. int val1 = 100;
  3. int val2 = 200;
  4. int result = Max(2, 5);
  5. }
  6. static int Max(int val1, int val2) {
  7. if (val1 > val2) {
  8. return val1;
  9. } else {
  10. return val2;
  11. }
  12. }

Call stack i Visual Studio

  1. static void Main(string[] args) {
  2. int a = Max(2, 7);
  3. int b = Max(5, 9);
  4. }
  5. static int Max(int val1, int val2) {
  6. if (val1 > val2) {
  7. return val1;
  8. } else {
  9. return val2;
  10. }
  11. }

Flera nivåer av call stack

  1. static void Main(string[] args) {
  2. double a = Tax("Göteborg", 400000);
  3. double b = Tax("Jönköping", 350000);
  4. }
  5. static double Tax(string city, double salary) {
  6. double tax = 0;
  7. ...
  8. tax += FederalIncomeTax(city, salary);
  9. ...
  10. return tax;
  11. }
  12. static double FederalIncomeTax(string city, double salary) {
  13. return ...;
  14. }

"Call stack" i verkligheten

Motsvarande call stack i C#

Strukturera program med metoder

Program med indata och utdata

  1. static void Main(string[] args) {
  2. // indata
  3. double salary = ...;
  4. string city = ...;
  5. // beräkning
  6. ...
  7. // utdata
  8. double tax = ...;
  9. }

Motsvarande metod

  1. // indata
  2. static double Tax(double salary, string city) {
  3. // beräkning
  4. ...
  5. // utdata
  6. return ...;
  7. }

Anropa metoden

  1. static void Main(string[] args) {
  2. double salary = double.Parse(Console.ReadLine());
  3. string city = Console.ReadLine();
  4. double result = Tax(salary, city);
  5. Console.WriteLine("Skatt: " + result);
  6. }
  7. // indata
  8. static double Tax(double salary, string city) {
  9. // beräkning
  10. ...
  11. // utdata
  12. return ...;
  13. }

Metod med sidoeffekter

  1. static void Main(string[] args) {
  2. while (true) {
  3. CalculateTax();
  4. }
  5. }
  6. static void CalculateTax() {
  7. // indata
  8. double salary = double.Parse(Console.ReadLine());
  9. string city = Console.ReadLine();
  10. ...
  11. // utdata
  12. double tax = ...;
  13. Console.WriteLine("Skatt: " + tax);
  14. }

Overloading (överlagring)

Metoder som kan anropas på flera sätt

Maximumfunktionen med strängar

  1. static void Main(string[] args) {
  2. string largest = Max("Hello", "Goodbye");
  3. }
  4. static int Max(int val1, int val2) {
  5. ...
  6. }

Överlagrad maximumfunktion

  1. static int Max(int val1, int val2) {
  2. ...
  3. }
  4. static string Max(string s1, string s2) {
  5. if (s1.Length > s2.Length) {
  6. return s1;
  7. }
  8. else {
  9. return s2;
  10. }
  11. }

Anrop av överlagrad maximumfunktion

  1. int largestInt = Max(5, 7);
  2. string largestString = Max("Hello", "Goodbye");

Mutation av argument

Mutation av primitiva datatyper

  1. static void Main(string[] args) {
  2. int x = 5;
  3. ChangeSomething(x);
  4. Console.WriteLine(x);
  5. }
  6. static void ChangeSomething(int x) {
  7. x = 10;
  8. }

Mutation av komposita datatyper

  1. static void Main(string[] args) {
  2. Person p = new Person { Name = "Barack", Age = 56 };
  3. ChangeSomething(p);
  4. Console.WriteLine(p.Name);
  5. Console.WriteLine(p.Age);
  6. }
  7. static void ChangeSomething(Person p) {
  8. p = new Person { Name = "Donald", Age = 71 };
  9. }

Mutation av värden inuti komposita datatyper

  1. static void Main(string[] args) {
  2. Person p = new Person { Name = "Barack", Age = 56 };
  3. ChangeSomething(p);
  4. Console.WriteLine(p.Name);
  5. Console.WriteLine(p.Age);
  6. }
  7. static void ChangeSomething(Person p) {
  8. p.Name = "Donald";
  9. p.Age = 71;
  10. }