Mall för ett C#-program /* * Här kommenteras vad programmet (klassen) skall göra */ class ProgramNamn { public static void Main () // Här står källkoden för det som skall // utföras när programmet exekveras } // Efter definitionen av Main kan det // följa definitioner av andra metoder.
Namnsättning kompilering class MyClass { } MyClass.cs MyClass.exe
Main - startpunkten class ProgramNamn { public static void Main () // Huvudflödet… } Ordet void innebär att metoden main inte lämnar något returvärde. Ordet public betyder att metoden skall vara åtkomlig utifrån. Det måste den vara för att interpretatorn skall kunna anropa den. Ordet static anger att metoden main är en klassmetod (statisk metod). En klassmetod är en metod som inte är speciell för något visst objekt, utan som har att göra med själva klassen. Eftersom det inte finns något objekt när programmet startar, måste main vara en klassmetod.
Kompilera och exekvera
Literaler Primärminnet ”Hej” 345 -267.678 Hej 345 -267.678
Variabler a = b = c = ”Hej” 345 -267.678 a = ”Hej då” b = -987 Primärminnet a = b = c = ”Hej” 345 -267.678 Symboliska adresser a b c Hej då -987 35.231 Hej 345 a = ”Hej då” b = -987 c = 35.231 -267.678 Variabler kan ändra innehåll
Literaler public class ProgramEtt { public static void Main ( ) System.Console.WriteLine("Hej"); System.Console.WriteLine(345); System.Console.WriteLine(-267.678); }
Variabler public class ProgramEtt { public static void Main ( ) string a = "Hej"; int b = 345; double c = -267.678; System.Console.WriteLine(a); System.Console.WriteLine(b); System.Console.WriteLine(c); } a = "Hej då!"; b = -987; c = 35.231;
Variabler, datatyper En variabel är ett utrymme i datorns arbetsminne som reserveras eller används av ett program under en kortare eller längre del av programmets exekvering. I C# måste alla variabler måste typdeklareras. Det finns följande primitiva datatyper : heltal (sbyte, byte,short, ushort, int, uint, long, ulong) flyttal (float, double, decimal) boolsk typ (bool) tecken (char, string) Övriga datatyper i C# är referenstyper (ej strukter). Värden i dessa typer kallas objekt
variabeldeklarationer int heltal; double flyttal; char tecken; bool klar; string namn; Exempel på tilldelning: heltal = 2; flyttal = 9.0/heltal; flyttal = 9/heltal; tecken = 't'; klar = false; namn = "Göran"; Här blir flyttal = 4.5 Här blir flyttal = 4.0 Observera skillnaden i apostrofer om det är en textsträng eller ett enskilt tecken!
Konstanter Som variabler, men värdet kan inte ändras! const string a = ”Hej”; a = ”Hej då”;
Literaler, variabler och konstanter public class VariabelTesta { public static void Main ( ) int a = 45678; double b = 4.567; System.Console.WriteLine(a * (b + 2)); string s = “Helledudanedå”; System.Console.WriteLine(s); }
OBS! C# är ”case sensitive” ! Identifierare class Loneberakning { public static void Main ( ) const int TIMLÖN = 90; int antaltimmar = 40; int summa = TIMLÖN * antaltimmar; System.Console.WriteLine(summa); } OBS! C# är ”case sensitive” !
Kommentarer Allt mellan /* och */, samt allt efter // på en rad hoppar kompilatorn över class ProgramNamn { // Kommentar på en rad public static void Main () // Kommentar i slutet av rad } /* * En kommentar över * flera rader */
Operationer En operator är en symbol som samverkar på något sätt med operander a = b + c operatorer operation operander operation
Uttryck Ett uttryck är en representation av ett värde, framställt med ett värde eller en operation a = b + c uttryck uttryck uttryck
Uttryck sammansatta uttryck a = b + c primära uttryck
Aritmetiska operatorer * Multiplikation / Division % Rest (modulo) + Addition - Subtraktion = Tilldelning
Särskilda aritmetiska operatorer ++ Ökning av variabelvärdet med 1 -- Minskning av variabelvärdet med 1 *= Tilldelning efter multiplikation /= Tilldelning efter division %= Tilldelning efter modulo += Tilldelning efter addition -= Tilldelning efter subtraktion
Datatyper primitiva datatyper Datatyp Bitar Alias för boolsk boolean 1 Datatyp Bitar Alias för boolsk boolean 1 System.Boolean heltal sbyte 8 System.Sbyte byte System.Byte short 16 System.Int16 ushort System.UInt16 int 32 System.Int32 uint System.UInt32 long 64 System.Int64 ulong System.UInt64 char System.Char flyttal float System.Single double System.Double decimal 128 System.Decimal text string System.String generisk typ object System.Object primitiva datatyper Även om string inte är en primitiv datatyp, kan den ofta användas på ett likartat sätt, ur programmerarens synvinkel, så vi tar med även den redan nu.
Vektorer namn[3] namn ålder
Flerdimensionella vektorer 1 56 2 1 2 3 4
Flerdimensionella vektorer rad kolumn djup
Vektoradressering 3 4 5 2 1 public class ArrayTest { public static void Main () int[] betyg = {3, 4, 5, 2, 4, 3, 1, 3, 2, 4, 2, 3, 4}; int längd = betyg.length; // Antal element System.Console.WriteLine(längd); System.Console.WriteLine(betyg[6]); } Skriver ut ”1” betyg betyg[2] Indexnumreringen börjar med ”0” Primärminnet 3 4 5 2 1
Vektoradressering 3 4 5 2 1 Primärminnet public class ArrayTest { public static void Main () int[][] lista = {{3}, {2, 4, 3}, {1, 4}, {5, 3, 2, 3, 4}}; längd = lista.length; // Antal rader System.Console.WriteLine(längd); längd = lista[3].length; // Antal element i rad 4 } Primärminnet 3 4 5 2 1 lista[2][1] C# är ett av de få programmeringsspråk som kan hantera ”assymetriska” matriser
Vektorer Stack Heap ”objektet” Att C# är ett av de få programmeringsspråk som kan hantera ”assymetriska” matriser beror till viss del på hur dessa lagras. I de flesta språk/miljöer lagras arraymedlemmarna i en enda rad på variabeladressens plats, och adresseringen utav de enskilda elementen sker genom en intern omräkning baserad på datatypens storlek. I C# är vektorer egentligen objekt! I C# är alla objekt referenstyper (till skillnad från de primitiva värdetyperna) Primärminnet Primärminnet är partitionerat i flera olika delar. Alla variabler hamnar i en del som kallas ”stack”. Stack Heap lista ”objektet” När det gäller referenstyper, läggs inte värdet i behållaren på ”stacken”, utan värdet läggs i något som kallas ”heap” adress till objektet Variablens plats håller då en referens till värdet på ”heapen”
Vektoradressering 3 4 5 2 1 Primärminnet Stack Heap ”matris-objektet” lista referens till objektet ”matris-objektet” referens till vektor 0 3 4 5 2 1 referens till vektor 1 referens till vektor 2 referens till vektor 3
variabeltyper Det finns inom grundläggande programmering i huvudsak två slags variabeltyper: värdetyper referenstyper ... int heltal; float flyttal; char bokstav; ... string textsträng; Bok boken; int[] poängen;
Posttyp En struct är en sammansatt typ där flera värden av olika typ kopplas till en enhet. struct Bok { public string namn; public string författare; public float pris; }
Procedurer och funktioner public class SumTest { public static void Main () Summera(); } public static void Summera () System.Console.Write(“Ange tal: “); int a = int.Parse( System.Console.ReadLine() ); int b = int.Parse( System.Console.ReadLine() ); System.Console.WriteLine( a + b );
Procedurer och funktioner public static void Main () { Summera(); } public static void Summera () { System.Console.Write(“Ange tal: “); int a = int.Parse( System.Console.ReadLine() ); int b = int.Parse( System.Console.ReadLine() ); System.Console.WriteLine( a + b ); } Vid anropet av en metod ”hoppar” exekveringen till den punkten i programmet När metoden kört klart, hoppar exekveringen tillbaks, och kör vidare på raden efter anropet
Funktioner I Excel använder vi färdiga funktioner. static int heltal (double tal) { return (int) tal; } Som programmerare gör vi också funktioner själva:
Funktioner & procedurer En procedur var en del utav ett program, som brutits ut för att få det programmet överskådligt, eller för att slippa upprepa kod. Jobbar mot programmets data Därför inget returvärde En funktion sågs från början inte som en del utav programmet, utan snarare ett ”hjälpprogram” för att få fram resultatet utav en viss beräkning eller liknande Jobbar mot data som fåtts i parameterlistan Returnerar resultatet
Metoder I dagens moderna programmeringsspråk har detta oftast förenklats till en enda gemensam konstruktion, vilket vi kallar metod. Varför man använder metoder: för att programmet skall bli mera lättläst för att kunna återanvända kod
Metodens signatur public static int minstaTalet (int a, int b) { Ordet public anger att metoden är synlig utifrån, dvs att även andra program (klasser) kan anropa den. Ordet static anger att metoden är en klassmetod (statisk metod). Detta nyckelord utelämnas helt, om vi vill använda det för objekt. Om en metod skall returnera något måste rätt datatyp anges här. Om metoden inte lämnar något returvärde skriver man istället void. Parametrar till metoden. Dessa fungerar inom metoden som lokala variabler. Metodens namn public static int minstaTalet (int a, int b) { if (a < b) return a; return b; } Kombinationen utav metodnamn, formella parametrar och returtyp, kallas för metodens ”signatur”
Funktioner class GradTest { static double Fahrenheit (double c) return (c * 9 / 5 + 32); } static double Celcius (double f) return ((f - 32) * 5 / 9); public static void Main () System.out.println("Fahrenheit:" + Fahrenheit(37.2) ); System.out.println("Celcius:" + Celcius(99) );
Procedurer class ProcedurTest { static hälsning = "Hello World!"; static void proceduren () System.out.println(hälsning); } public static void main (String[] args) ProcedurTest.proceduren();
Metoder y = Math.Sqrt(x); Metoden finns i .NETs klassbibliotek. Sqrt( ) är en statisk metod (klassmetod). Den anropas via klassnamnet. Klassen Math finns i namnrymd System och är deklarerad: public static double Sqrt(double d)
using Vill man använda funktioner i ett program (en klass) från .NETs standardbibliotek måste man inleda med using för den namnrymd där klasserna finns: using System; using System.Collections; Därigenom har man tillgång till alla klasser i den namnrymd man angett. Titta på egen hand i dokumentationen för System.Math System.String System.DateTime System.Random
Metoder i String-biblioteket Studera nu några användbara metoder i klassen System.String Vad kan vi behöva? Vi vill jämföra två strängar veta längden av en sträng plocka ut delar av en sträng Studera metoden Equals ( ) public virtual bool Equals(Object o) Antag följande deklaration: string namn1 = "Ola"; string namn2 = "Olle";
Metoder if (namn1.Equals(namn2)) Skriv ”lika” O Skriv ” olika” if (namn1.Equals(namn2)) System.Console.WriteLine("Lika namn"); else System.Console.WriteLine("Olika namn");
String informatik värden En sträng är en ändlig följd av tecken. OBS!!! När en sträng väl är skapad går det ej att göra några ändringar. string str1 = "informatik"; str1 är en referensvariabel som pekar på det utrymme i primärminnet där strängkonstanten "informatik" ligger. informatik värden 0 1 2 3 4 5 6 7 8 9 index str1 En sträng har en fast längd: str1.Length // str1 har längden 10
String informatik värden Informatik värden Antag att jag vill ha ändra i till I i str1. Hur göra? Svar: Man måste skapa en ny sträng, tex str1 = ”informatik"; str1 = "I" + str1.Substring(1); informatik värden 0 1 2 3 4 5 6 7 8 9 index str1 Informatik värden 0 1 2 3 4 5 6 7 8 9 index
Skillnaden mellan parameter och argument public class Meddelande { public static void Main() Skriv(5); // argumentet är 5 } public static void Skriv(int antalGgr) { //formell parameter är antalGgr for (int i = 0; i < antalGgr; i++) System.Console.WriteLine("Hej Nisse!");
Parametrar antalGgr är en formell parameter och en lokal variabel. i är också en lokal variabel. Dessa är endast definierade inne i metoden. Kom ihåg när ni anropar en metod att alltid kontrollera att de formella och de aktuella parametrarna överensstämmer till antal, ordning och typ!!! Ändra i Meddelande så att Main-metoden endast innehåller anropet skriv(”Cecilia”,5); Utskriften vid körning skall se ut som tidigare, men metoden skall hälsa på rätt person, dvs det som kommer in som argument 1.
Parametrar och argument skall stämma public class Meddelande { public static void Main(String[] args) skriv("Cecilia", 5); // två argument } public static void Skriv(string namn, int antalGgr) { // två formella parametrar for (int i = 0; i < antalGgr; i++) System.Console.WriteLine("Hej " + namn + "!");
return Avslutningen utav en funktion sker med det reserverade ordet return, tillsammans med värdet av det som skall returneras. public class Test { public static void Main(String[] args) int a = Plus(4, 5); System.Console.WriteLine(a); } int Plus(int x, int y) int z = x + y; return z; Där avslutas exekveringen av metoden och exekveringen av programmet där metodanropet ingick fortsätter. Värdet av anropet är värdet av uttrycket efter return.
Returvärden public class Test { public static void Main(String[] args) int a = Plus(4, 5); System.Console.WriteLine(a); } int Plus(int x, int y) return x + y; När return följt av ett uttryck exekveras beräknas värdet av uttrycket. Värdet i det som returneras måste naturligtvis stämma med returtypen, eller kunna omvandlas till samma typ med implicit typkonvertering.
Lär er att hitta i klassbiblioteket Färdiga funktioner Lär er att hitta i klassbiblioteket Funktioner för stränghantering och numerisk omvandling hittar ni bl.a. i: System.String (string) System.Double (double) System.Single (float) System.Int32 (int) System.Int64 (long) Grundläggande matematiska funktioner hittar ni bl.a. i : System.Math
Stack och Heap i primärminnet Operativ-systemarea Stack Heap Maskininstruktioner för varje procedur/funktion inklusive huvudprogrammets kod. Koden är fix, den ändras inte under exekveringen. ”statiska” data: ”värdet” i värdetyper och referenstypernas adresser på heapen ”dynamiska” data: ”värdet” för referenstyperna Instruktionsarea
Sammansatta typer och minnet Beroende på kompilator/språk läggs sammansatta typer i minnet på olika sätt (något förenklat exempel): C++: Bok bokEtt (”Java från grunden”, ”Franzén”, ”Studentlitteratur”, 440); Värdena hamnar på ”stacken”. C++/Java: Bok bokTvå = new Bok(”Java från grunden”, ”Franzén”, ”Studentlitteratur”, 440); Värdena hamnar på ”heapen”. C# skiljer på ”struct” och ”class”, där en variabel för en instans av en struct blir av värdetyp, dvs värdena hamnar på ”stacken”, medan en variabel för en instans ur en class blir av referenstyp, dvs värdena hamnar på ”heapen”.
Vektorer och minnet Beroende på kompilator/språk läggs vektorer i minnet på olika sätt (något förenklat exempel för den grundläggande principen): int[] poängen = {45, 13, 67}; Primärminnesadress: (stacken) Variabeln poängen[0] refererar nu till adress 102. För att kompilatorn skall hitta till poängen[1], lägger den på storleken av en int för varje index. Men i C# fungerar inte vektorer på detta sätt…
Vektorer och minnet I C# är en vektor alltid en referenstyp! int[] poängen = {45, 13, 67}; Primärminnesadress: (stacken) Här refererar variabeln poängen till adress 102. För att kompilatorn skall hitta till poängen[n], går den till adressen på heapen (något förenklat):
Variabler och minnet Olika variabler använder minnet på olika sätt. I C# sker det på följande sätt: variablerna hamnar på ”stacken” Om variablerna är ”värdetyper” hamnar värdena på ”stacken” Om variablerna är ”referenstyper” hamnar värdena på ”heapen” string textsträng = ”Hej!”; r204 Hej! int heltal = 45; 45 float flyttal = (float) 14.6; 14.6 char bokstav = ’a’; 97 45 13 67 r206 int[] poängen = {45,13,67};
Tilldelning med värdetyper Primärminnet 5 kopiering 5 a b
Tilldelning med referenstyper Primärminnet Objektet Ref kopiering Ref a b
Block { } kan uppfattas som en slags parentes. Ibland måste vi använda detta när vi skall ”samla” flera programsatser för att hanteras som ett block. Varje programsats avslutas med semikolon.
Variablers synlighet och räckvidd Finns och syns i hela programmet class MinaVariabler { static int x = 8; public static void Main() int y = 16; MinMetod(); } public static void MinMetod() int z = 32; Finns och syns bara i metoden Main Finns och syns bara i metoden MinMetod Block Här går z ur räckvidden (ur ”scope”) och upphör att existera
Block och lokala variabler using System; public class Lokal { public static void Main ( ) int c = 111; int b = 333; int a = 222; Console.WriteLine(a + b); } Console.WriteLine(c); Block Block
Det utrymme som vi allokerar för programmet måste vi också deallokera. Skräpsamling Det utrymme som vi allokerar för programmet måste vi också deallokera. Minnesutrymmen för värden på stacken återvinns automatiskt (lokala variabler av värdetyp) när variabeln ”gått ur räckvidden”. Minnesutrymmen på heapen måste återvinnas aktivt (värden för variabler av referenstyp och ev variabler av värdetyper som de i sin tur refererar till) I .NET återvinns utrymmen på heapen av en skräpsamlare (Garbage Collector), vid behov.
I .NET finns datatypen System.DateTime Håller både datum och klockslag DateTime lucia = new DateTime(2004, 12, 13); DateTime idag = DateTime.Today; DateTime nu = DateTime.Now;