Objekt-Orienteret Programmering (OOP)

Slides:



Advertisements
Lignende præsentationer
SPBG.  Test driven development  Unit test frameworks  MOSS TDD  Mocking  Design patterns.
Advertisements

Velkommen til Softwarekonstruktion
C# introduktion. using System; Namespace MyFirst { class eks1 { public static void Main() { Console.WriteLine("Hej!"); Console.Write("Skriv dit navn her:
Februar 2005Sprog-nyheder i C# og VB1 Captator Tlf: Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark.
C#: Data Typer. Indhold: “.NET is designed around the CTS, or Common Type System. The CTS is what allows assemblies, written in different languages, to.
07 – Kort om OO Introduktion.
Perspektiverende Datalogi Internetalgoritmer MapReduce Gerth Stølting Brodal.
T1 – OPGAVE 14.2 LINETT & SABRINA Klasse Varer namespace Opgave_14._2 { class Varer { private string vare; private string farve; private double.
Array og ArrayList Et slideshow. Som er sødt.. Hvordan virker ArrayList?  ArrayList NAVN = new ArrayList ();  NAVN.add(”Værdi”);  NAVN.add(index, ”værdi”)
Effective Java items Orange gruppe Thuy, Janne, Mads T.P., Oliver og Sebastian.
C#: Udtryk og metoder. Indhold “With regards to programming statements and methods, C# offers what you would come to expect from a modern OOPL…” Udtryk.
Datastrukturer og Collections Oversigt og forskel imellem Jave og.net Collections library Collection interfaces ArrayList IList interface Hashtable Hashtable.
06 – Java Packages Packages og ClassPath. 2 NOEA2009Java-kursus – Packages og class path Hvad er Packages? En package er en gruppering af relaterede typer.
Item gennemgang  Item: 01 – Static factory methods  Item: 09 – Override hashCode  Item: 17 – Design & document inheritence  Item: 25 – Lists over arrays.
Programmeringsteknologi: Lektion 1
Object-Orienteret Programmering og Design. 2 Nordjyllands Erhvervakademi – 2009 Indhold “Classes, objects and object-oriented programming (OOP) play a.
Collectionklasser Klassifikation og anvendelse. Collections Motivation –hvorfor bruge collections? Realisering af en-til-mange relationer –Importer, erklær,
Array vs. ArrayList. Arrays Et array er en struktureret metode til at gemme flere værdier af den samme datatype. Data’en i et array ligger op ad hinanden.
Objekter og klasser Applikationsdesign Code Namespace Value og reference typer Reference type Rasmus D. Lehrmann1.
12 – GUI med Swing. 2 NOEA2009Java-kursus – GUI med Swing Designer view Komponenter Frame Properties Inspector.
Hvordan man skriver koden.
Tietgen Skolen Syntaks: while ( betingelse for loop ) statement; Eksempel: int tal = 0; while ( tal/3 != 4 ) { System.Console.WriteLine(tal); tal = tal.
WCF service Hostet på website x. Opret tomt web applikations projekt.
Introduktion til.NET- platformen og version 2.0 Michell Cronberg Microsoft MVP
Eksekvering/Otto Knudsen 1 Udrulning Publicering af en web-applikation.
Introduktion Bjørk Boye Busch Otto Knudsen
Distribution af funktionalitet Webservice med WCF x.
Distribution af funktionalitet Webservice med WCF x.
Web service - elementer SOAP (Simple Object Access Protocol) WSDL (Web Service Description language) UDDI (Universal Description, Discovery and Integration)
Web service - elementer SOAP (Simple Object Access Protocol) WSDL (Web Service Description language) UDDI (Universal Description, Discovery and Integration)
ASP.NET Custom Web Controls Deployment. Agenda – ASP.NET Web User Controls Composite Control Rendered Custom Control Deploy en Web Applikation.
Abstrakte klasser og interfaces i Java
Object-Orienteret Programmering og Design Kilde: Joe Hummel.
GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
Programering af mobile enheder Windows Phone Storage.
FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
NOEA/IT - FEN1 Typeparametisering/Genericity Generics i.NET 2 og C#
Begreber og Redskaber 9. Plan for idag I dag: Datastrukturer Tabeller Lister, mængder, maps, grafer Hægtede lister.
Intro Forelæsning 6 Linux Install Party i PC-Cafeen i morgen.
Session Når man hoster en WCF Service på ASP.NET website, kan man bruge ASP.NET’s Session.
Gruppe sort Morten, Peter, Jesper, Spencer & Støving.
Collectionklasser Ekstra materiale. Collections Motivation – hvorfor bruge collections? Realisering af en-til-mange relationer – Importer, erklær, initialiser.
Begreber og Redskaber 5. Collections i Java 1.2 Framework: samling af datastrukturer og algoritmer som generelt værktøj. En ramme til at arbejde med søgning.
Begreber og Redskaber 5. Plan for idag Overblik over klasser,objekter,nedarvning –Repetition fra Dat A/Indledende programmering –Centrale begreber om.
MSBuild & Team Build i C#/C++ solutions VSTS ERFA d. 25 November.
Delphi og C++ Builder C++ Builder. C++ Historie Sproget blev designet for AT&T af danskeren Bjarne Stoustrup En objektorienteret videreudvikling.
Grunde til at jeg elsker dig
Items 4, 14, 24, 34, 44, 54 Orange gruppe Liv, Jonas, Thorkil, Søren S og Martin D.
Lektion 7 Læsestof: Kopier fra Caranno
Fundamentale datastrukturer
1..NET Arkitektur. 2 Nordjyllands Erhvervakademi Mål “Microsoft.NET is based on the Common Language Runtime (CLR) and an extensive set of Framework.
10. Datastrukturer. 2 Nordjyllands Erhvervakademi Collections library Datastrukturer i.NET kaldes normalt Collections Findes i namespace System.Collections.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Repetition: Introduktion til OOP med C# og .NET
Procestræ under afvikling af cp init login shell cp cp src dest.
Paradigmer i Programmering 2. Sammensatte typer Tupler og lister Programmering med rekursion Programmering med pipe-lines Programmering med polymorfe.
Validering af bruger-input i.NET WebForms Valideringsmuligheder i ASP.NET Fordele og ulemper Server-side vs. client-side Formatering vs. Validering.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
C#: Udtryk og metoder Kilde: Joe Hummel. 2 Nordjyllands Erhvervakademi – 2008 Indhold “With regards to programming statements and methods, C# offers what.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner findEn findAlle Primitive typer (forfremmelse og begrænsning) Identitet versus lighed.
ASP.NET – web site publish. ASP.NET – site-version.
C#: Data Typer. 2 Nordjyllands Erhvervakademi Indhold: “.NET is designed around the CTS, or Common Type System. The CTS is what allows assemblies,
Blå gruppe: Søren, Alexander, Torben, Lasse. De 4 vigtige items: - Singelton - Override clone judiciously - Use interfaces only to define type - Prefer.
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Variabler, klassevariabler, identitet og lighed, collections
Præsentationens transcript:

Objekt-Orienteret Programmering (OOP)

Oversigt Introduktion til kurset Introduktion til C# Common Language Infrastructure Data typer Indbyggede vs. Brugerdefinerede typer Værdi- vs. Referencetyper Metoder og parametermekanismer

OOP Kurset Projektenhedkursus for Dat1 og SW3 Kurset skal støtte projektarbejdet Kurset eksamineres af projektvejlederen gennem den afleverede projektrapport Endvidere eksamineres Dat1 og SW3 studerende i OOP via MIP

Miniprojekt i Programmering (MIP) Indhold: I skal udvikle, i grupper på højst 4 deltagere, et program, som skal løse et på forhånd formuleret og afgrænset problem. (Se eksempler på hjemmesiden) Programmet skal laves på 48 timer. Ved udløbet af tidsrummet afleveres programmet samt kortfattet dokumentation (efter nærmere retningslinier) i udskrift og på elektronisk form. Prøveform: Intern mundtlig prøve. Bedømmelse: Individuel bedømmelse bestået/ikke bestået.

Miniprojekt i Programmering (MIP) Mål: Efter et gennemført miniprojekt i programmering skal den studerende kunne: udvikle et program, som opfylder relativt præcist beskrevne krav forklare og argumentere for sammenhænge og detaljer i et program, som den studerende har udarbejdet sammen med andre studerende demonstrere forståelse af nøglebegreber og -mekanismer i det objekt-orienterede programmeringsparadigme relativt til det udviklede program udforme et program som er forståeligt/læsbart af andre programmører benytte korrekt fagterminologi

Kursusplan Introduktion til kurset og C# Klasser og objekter Nedarvning og polymorfisme Interfaces Generiske typer og metoder Delegates, lamda udtryk og events Collections Exception Handling Testing 1 Testing 2 Design By Contract Design Patterns TBA

Litteratur Primært: ”Essential C# 4.0” af Mark Michaelis Derudover ”C# 4.0 In a Nutshell” af Joseph & Ben Albahari MSDN Library (http://msdn.microsoft.com/en-us/library/kx37x362.aspx) Fri-tekst søgning, fx ”int”, ”string”, … IDE Programming Guide Reference, inkl. Language Specification Diverse online materiale

Installation af C# Windows: .NET Framework og command-line: http://msdn.microsoft.com/en-us/netframework/default.aspx Visual C# 2010 Express (gratis, kræver registrering) http://www.microsoft.com/express/downloads/ Visual Studio 2010 Professional, Premium eller Ultimate (gratis via MSDNAA) http://msdn60.e-academy.com/elms/Storefront/Home.aspx?campus=msdnaa_DK9220 Linux/Windows/Mac OS X: Mono (cross-platform, open source implementation af .NET Framework) MonoDevelop http://www.mono-project.com/Main_Page Statisk og dynamisk typetjek – dyn: når der foretages et downcast Strongly typed (strikse regler for lovlige operationer på typer, type-konverteringer, exceptions)

Introduktion til C# Implementation af det objekt-orienterede paradigme der inkluderer indkapsling, nedarvning og polymorfisme. Bygger på C, C++ (& Java) syntaks og features Dog Pascal casing i C# Del af en større eksekveringsplatform kaldet Common Language Infrastructure (CLI)

Common Language Infrastructure (CLI) Åben specifikation (ECMA-335) der specificerer følgende (MS: .NET Framework): Common Type System (CTS) Common Language Specification (CLS) [assembly: CLSCompliant(true) ] Common Intermediate Language (CIL) Virtual Execution System (VES) (MS: CLR) Base Class Library (BCL) (MS: FCL) Sprog-interoperabilitet, platforms portabilitet, managed execution COMMON LANGUAGE INFRASTRUCTURE Common Language Infrastructure (CLI): A specification for the format of executable code, and the runtime environment that can execute that code.   COMMON TYPE SYSTEM Hvordan typer erklæres, bruges og håndteres af runtime. - Indbyggede typer, semantik for værdi- og ref typer, regler for type-konvertering, System.Object arv. Og synlighed, nedarvnings-regler Ensartet typesystem – data mellem sprog Vi kommer ind på reglerne løbende i kurset. COMMON LANGUAGE SPECIFICATION Regler om case-insensitivity, kompatible returtyper Kun offentlige medlemmer Klassebiblioteks-design COMMON INTERMEDIATE LANGUAGE Instruktionssættet der forstås af VES VES: Loader og eksekverer CLI-kompatible programmer (assemblies) Managed execution: Hukommelses-allokering/deallokering, Exception handling, Tråd-synkronisering *http://www.ecma-international.org/publications/standards/Ecma-335.htm

Kompilering til CIL *.dll eller *.exe <- VES http://en.wikipedia.org/wiki/Common_Language_Infrastructure

Typer Indbyggede typer: Direkte understøttet af CTS Brugerdefinerede typer: komplekse typer sammensat af andre typer. Værdityper vs. referencetyper

Indbyggede typer Værdityper (primitive typer): Referencetyper Numeriske typer: Positive Helttal (Z+): byte, ushort, uint, ulong Helttal (Z): sbyte, short, int, long Reelle tal (R): float, double, decimal Logisk type: bool Karakter: char Referencetyper string object

Indbyggede heltals-typer Size Range (Inclusive) BCL Name Signed sbyte 8 bits -128 to 127 System.SByte Yes byte 0 to 255 System.Byte No short 16 bits -32,768 to 32,767 System.Int16 ushort 0 to 65,535 System.UInt16 int 32 bits –2,147,483,648 to 2,147,483,647 System.Int32 uint 0 to 4,294,967,295 System.UInt32 long 64 bits –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 System.Int64 ulong 0 to 18,446,744,073,709,551,615 System.UInt64 8- og 16-bit integers har ingen aritmetiske operatorer. Base 16 Decimal notation: int x1 = 127; Hexadecimal notation (0x præfix, 0-9, A-F): int x2 = 0x7F

Indbyggede komma-tals typer Size Range (Inclusive) BCL Name Significant Digits float 32 bits ±1.5 × 10⁻⁴⁵ to ±3.4 × 10+38 System.Single 7 double 64 bits ±5.0 × 10−324 to ±1.7 × 10+308 System.Double 15-16 Større tal, mindre præcision (afrundings-fejl) – videnskabelig beregninger Mindre tal, større præcision (ingen afrundings-fejl) – finansielle beregninger Type Size Range (Inclusive) BCL Name Significant Digits decimal 128 bits 1.0 × 10−28 to approximately 7.9 × 10+28 System. Decimal 28-29 positiveInfinity, negativeInfinity, NaN – double og float Decimal notation: double billion1 = 1000000000 Exponential notation (E): double billion2 = 1E9

Numerisk Suffiks Type-inferens: Hardcodede værdier (litteraler) fortolkes som int (derefter uint, long, ulong) eller double (afhængig af . ) Suffiks kan tilføjes for at tvinge litteral til en bestemt data type: Suffix Type Numeric Suffix Example unsigned int U or u uint x = 100U; long L or l long x = 100L; unsigned long UL or ul ulong x = 100UL; float F or f float x = 100F; double D or d double x = 100D; decimal M or m decimal x = 100M; float f = 6.5; Decimal d = 6.5; Kan ikke kompilere – brug hhv. f og d

Numeriske konverteringer Er implicit når destinationstypen kan holde alle værdier fra source-typen. Ellers kræves eksplicit konvertering (cast). short s1 = 10; int i1 = s1; short s2 = (short)s1; sbyte short int long float double byte ushort uint ulong decimal char

Eksplicit konvertering Kan resultere i tab af præcision eller OverflowException. decimal -> helttal: Værdi afrundes Værdi uden for range : OverflowException double/float -> heltal: Værdi kappes af efter komma. Værdi uden for range: Checked: OverflowException Unchecked: Uspecificeret Double -> float: Afrunding Værdi uden for range: 0 eller infinity. float/double -> decimal: Konvertering til decimal repræsentation Værdi for lille: 0. Værdi er NaN (not a number), infinity, eller for stort: OverflowException Decimal -> float/double: Afrunding til nærmeste værdi double d = double.MaxValue; int x = checked ( (int) d ); http://msdn.microsoft.com/en-us/library/yht2cx7b(VS.80).aspx Værdi = resulterende værdi For lille til at blive repræsenteret som decimal Source og destinationtypens værdi

bool og char bool: true eller false. char Ingen konvertering til/fra andre typer char Unicode tegn (karakter) Konverteres til ushort (og derfra videre) http://www.unicode.org/charts/ Bool - kontrolstrukturer char x1 = 'X'; // Character literal char x2 = '\x0058'; // Hexadecimal char x3 = (char)88; // Cast from integral type char x4 = '\u0058'; // Unicode

Unicode Escape Characters Escape Sequence Character Name Unicode Encoding \’ Single quote \u0027 \” Double quote \u0022 \\ Backslash \u005C \0 Null \u0000 \a Alert (system beep) \u0007 \b Backspace \u0008 \f Form feed \u000C \n Newline \u000A \r Carriage return \u0009 \v Vertical tab \u000B \uxxxx Unicode character in hex \u0029 (example) Alle unicode karakterer har en 4-cifret unicode encoding

String string klassen repræsenterer et array af char. String klassen har et rigt API bestående af statiske metoder (kaldes via klassenavn) og instans-metoder (kaldes via variabel-navn). static Main { string s1 = new string(new char[] {’H’, ’e’, ’l’, ’l’, ’o’}); string s2 = ”hello world”; string stutter = string.Concat(s1, s2); int isSame = string.Compare(s1.ToLower(), s2.ToLower()); //og mange flere… } Statisk metode System.Text.StringBuilder Instans-metode

Opbygning af tekst Strings er immutable (uforanderlige/konstante). string s1 = ”Pizza”; //et nyt string objekt s1 += ” med pepperoni, ” + ”pølser, ” + ” og skinke”; 5 string objekter: 1) ”med pepperoni, ” 2) ”pølser, ” 3) ” og skinke” 4) ”med pepperoni, pølser” 5) Resultatet gemmes i nyt string objekt. System.Text.StringBuilder modificerer tekst uden at lave en ny kopi for hver modifikation StringBuilder: Append(), Insert(), Remove(), Replace(). På sin plads at nævne System.Text.StringBuilder samt konsol I/O

Konsol I/O Input: Output Console.Read() Console.ReadKey() Console.Readline() Output Consoler.Write(…) Console.WriteLine(…) Main() { Console.WriteLine(”Enter name”); string name = Console.ReadLine(); Console.WriteLine(”Hi ” + name); }

Konvertering mellem string og numeriske typer Konvertering fra en string type til en numerisk type: Parse() Parse() er defineret for alle numeriske data typer. TryParse() håndterer konverteringsfejl ved at returnere false istedet for at kaste en exception: string emergencyText = “911”; int emergencyNum = int.Parse(emergencyText); if (int.TryParse(emergencyText, out emergencyNumber)) { // Converted correctly, now use number }

System.Object Roden i type hierakiet Equals(Object) Object.Equals(Object a, Object b) Object.ReferenceEquals(Object a, Object b) GetHashCode ToString GetType Finalize MemberwiseClone Equals – samme VÆRDI Finalize – til at frigive UNMANAGED resourcer, fx db-connection, files, stream and handles (Dispose fra Idisposable) - Kan ikke kaldes direkte

Data strukturer i BCL Arrays (fixed størrelse collection) List (variabel størrelse collection) System.Collections.Generic namespace indeholder desuden Dictionary, LinkedList, Stack, Queue, …

Array erklæring og initialisering //1. Erklæring efterfult af initialisering string[] languages; languages = new string[3]; //default: 0, ‘\0’, null, false languages[0] = “C#”; languages[1] = “Java”; languages[2] = “Ruby”; Languages[3] = ”Illegal”; //IndexOutOfRangeException //2. Andre initialiseringsmåder: string[] languages = (new string[(3)]) { "C#“, "Java", "Ruby“ }; languages = {”C#”, ”Java”, ”Ruby”}; languages = new string[] {”C#”, ”Java”, ”Ruby”}; languages = new string[3] {”C#”, ”Java”, ”Ruby”}; //array initializer skal matche længde () betyder her ”frivillig” Array initializer

Multi-dimensionelle arrays Rektangulære arrays (dimensioner af samme længde) int[,] tal = int[3,3]; int num = 1; for (int i = 0; i < tal.GetLength(0); i++) for (int j = 0; j < tal.GetLength(1); j++) tal[i, j] = num++; //Initialisering af 2-dimensionelt array int[,] tal = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; Jagged arrays (arrays af arrays) int[][] tal3 = new int[][] { new int[] {1, 2}, new int[] { 3, 4, 5 }, new int[] { 6, 7, 8, 9 } }; //rektangulær //array tilgang tal[0, 0] //1 tal[2, 2] //9 //jagged array //tilgang tal[0][0] // 1 tal[2][3] //9

List collection Bruges til variabel-størrelse samling af elementer (~ Java ArrayList) Implementeret internt som et array der kan vokse når kapacitet nås

API – Tilføje og fjerne elementer public List <T> { public List(); public List(IEnumerable<T> collection); public List(int capacity); //tilføj og indsæt elementer public void Add( T item); public void AddRange( IEnumerable<T> collection); public void Insert( int index, T item); public void InsertRange( int index, IEnumerable<T> collection ); //fjern elementer public bool Remove(T item); public void RemoveAt(int index); public void RemoveRange(int index, int count); public void RemoveAll( Predicate<T> match); }

List collection List<string> languages = new List<T>(); languages.Add(”C#”); Languages.Add(”Java”); // {C#, Java} languages.AddRange( {”Ruby, Scala”} ); // {C#, Java, Ruby, Scala} languages.Insert(1, ”Python”); // {C#, Python, Java, Ruby, Scala} languages.InsertRange(1, {”F#, Haskell”} ); // {C#, F#, Haskell, Python, Java, Ruby, Scala} languages.Remove(”Haskell”); //nu {C#, F#, Python, Java, Ruby,Scala} languages.RemoveAt(1); //nu {C#, Python, Java, Ruby, Scala} languages.RemoveRange(2, 2); //nu {C#, Python, Scala} languages.RemoveAll(elem => elem.StartsWith(”S”)); // { C#, Python } Languages[1] = ”Iron Python” // { C#, Iron Python } Console.WriteLine(languages.Count()); // 2 Console.WriteLine(languages[5]); //IndexOutOfRangeException

Brugerdefinerede typer Enums Structs Klasser Interfaces og delegates senere..

Enum Gruppe af heltalsværdier Type-definition: public enum Weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; public enum StatusCode : ushort { OK = 200, Created, Accepted, NotFound = 404 }; Brug: Weekday day = Weekday.Sat; //5, da 0 indexeret bool weekend = (day == Weekday.Sat || day == Weekday.Sun);

Klasse vs. struct public class Point { private int x, y; public CPoint(int x, int y) this.x = x; this.y = y; } public void MovePoint(int x, int y) this.x += x; this.y += y; public struct Point Point p = new Point(2, 4); p.MovePoint(3, 3) //p.x= 5, y = 7

Klasse vs. struct Ens, bortset fra: Struct bruges når: Struct er en værditype Klasse er en referencetype Struct: Ingen nedarvning Struct bruges når: værditype semantik er at foretrække, fx komplekse numeriske typer. Til letvægts-typer (<= 16 byte)

Værdityper vs. Referencetyper En type er en værditype eller en referencetype. En værditype-variabel indeholder en værdi. En referencetype-variabel indeholder en reference til et objekt. Reference = hukommelsesadresse hvor objektet befinder sig. Værdi-typer: Alle numeriske typer, char, bool, structs og enums. Alt andet er reference-typer: Klasser, arrays, delegates og interfaces. Værdityper gemmes på stakken, referencetyper gemmes i heap.

Heap Stak Main() { int num1 = 17; int num2 = num1; int num2 = 23; Person ib = new Person(); ib.Alder = 23; ib.Navn = ”Ib”; Person ib2 = ib; ib2.Alder = ib2.Alder * 2; ib1.Navn = ”Bo”; ib = null; ib2 = null; } 17 [hex1] null [hex1] null 23 [hex1] hex2 23 [hex1] hex2 46 [hex2] ”Ib” 23 17 null hex1 [hex3] ”Bo” hex1 null Pointe: Ændringer til et objekt foretaget via én ref-variabel vil kunne ses i andre ref-variable der peger på samme objekt (da de netop refererer til samme objekt). Referencetype variable har separat allokering af reference og objekt der tillader dette. Værditype variable kan ikke referere til samme hukommelsesplads (med mindre… out, ref)

Person[] p1 = new Person[2]; p1[0] = new Person(”Per”); Stak Heap [hex1] 4 5 Main() { Point p1 = new Point(4, 5); Point p2 = p1; p2.X = 10; int[] a1 = {1, 2, 3} int[] a2 = a1; a2[2] = a1[0] * 10; Person[] p1 = new Person[2]; p1[0] = new Person(”Per”); Person[] p2 = p1; p2[1] = new Person(”Kaj”); } [hex2] 10 5 [hex2] 4 5 [hex3] 1 2 3 [hex3] 1 2 10 [hex5] ”Per”** null hex3 [hex6] ”Kaj”** null hex3 [hex4] hex5 null [hex4] null [hex4] hex5 hex6 hex4 hex4 **Snyder med string-ref pga. plads-mangel

Erklæring Parametermekanismer Overloads (operationel polymorfisme) Metoder Erklæring Parametermekanismer Overloads (operationel polymorfisme) Vi starter med parameter-mekanismer

Metode-erklæring En metode erklæres inde i en klasse eller struct Form: Adgangs-modifikator: public, private, protected, internal Static: Klasse-metode i stedet for instans-metode. Kaldes Klasse.Metode() i stedet for var.Metode() Retur-type: void, indbygget type eller brugerdefineret type Ex. public static double SquareRoot(double num) {…} int Sum(int a, int b) { … } [adgangs-modifikator][static] retur-type metode-navn ( [parametre] )

Værdi-parametre Default: Pass By Value Værdi af call site argument kopieres til target parameter //call site static Main() { int x = 5; Person p = new Person(); //hex1 p.Navn = ”Ib”; MethodA(x); //x = 5 MethodB(p); //p.Navn = ”Kong Ib”; MethodC(p); } static void MethodA(int a) { a += 10; } 5 (int a = x) static void MethodB(Person b) { b.Navn += ”Kong ” + b.Navn; } hex1 (Person b = p) hex1 static void MethodC(Person c) { c = null; } (Person c = p)

Reference-parametre (ref) Parameter-passing mekanismen kan eksplicit ændre til pass by reference. ref angiver at target-parameter er alias for call-site argument (ikke en kopi) //call site static Main() { int x = 5; Person p = new Person(); //hex1 p.Navn = ”Ib”; MethodA(ref x); //x = 15 MethodB(ref p); //p.Navn = ”Kong Ib” (som før) MethodC(ref p); //p == null } static void MethodA(ref int a) { a += 10; } a alias for x b alias for p static void MethodB(ref Person b) { b.Navn += ”Kong ” + b.Navn; } c alias for p static void MethodC(ref Person c) { c = null; }

Output-parametre (out) – også pass by reference Som ref, dog behøver parametre behøver ikke være initialiseret ved kald. Parameter skal være initialiseret inden retur til call site //call site static Main() { int x; MethodA(out x); //x = 10 Person p; MethodB(out p); //p.Navn = ”Ib” //p refererer til nyt objekt } static void MethodA(out int a) { a = 10; } static void MethodB(out Person b) { b = new Person(); b.Navn += ”Ib”; }

Forskel i en nøddeskal default (sende parameter ind) Almindeligt input (langt den mest almindelige) ref (sende parameter ind og ud) Manipulation af multiple værdier out (sende parameter ud) Multiple returværdier

Parameter arrays params modifer kan specificeres som sidste parameter i en metode Angiver at metoden accepterer et vilkårligt antal (0..n) parametre af en given type (et array er også ok). Parameter typen skal erklæres som et array static int Sum(params int[] numbers) { int sum = 0; for (int i = 0; i < numbers.Length) sum += numbers[i]; return sum; } static Main() { int total0 = Sum(); int total1 = Sum(1, 2, 3, 4); int total2 = Sum(new int[] { 1, 2, 3, 4 }); }

Metode Overloading Multiple metoder med samme navn, men forskellig signatur (antal og/eller type af parametre). Forskellige måder at kalde en metode Implementér logik i én metode som de andre overloadede metoder kalder (maintainability). Title(string name) { return Title(name, Sex.Male, 10, false) } Title(string name, Sex s) { return Title(name, s, 10, false); } Title(string name, Sex s, int age) { return Title(name, s, age, false); } Title(string name, Sex s, int age, bool married) { /* implementation */ }

Frivillige (optional) parametre Alternativ til normal metode overload En frivillig parameter kan udelades i metodekald En frivillig parameter specificerer en default værdi Rækkefølge: [krævede parametre,] frivillige parametre [, params]

Original metode overload: Title(string name) { return Title(name, Sex.Male, 10, false) } Title(string name, Sex s) { return Title(name, s, 10, false); } Title(string name, Sex s, int age) { return Title(name, s, age, false); } Title(string name, Sex s, int age, bool married) { /* implementation som nedenunder */ } Med frivillige parametre: string Title(string name, Sex s = Sex.Male, int age = 10, bool married = false) { string prefix; if (s == Sex.Male) prefix = ”Mr. ”; else if (married) prefix = ”Mrs. ”; else prefix = ”Ms. ”; return prefix + name + ”, age ” + age + (married ? ”, married” : ”not married”); } Call site (klient): string a = Title(”Mox”); //”Mr. Mox, age 10, not married” string b = Title(”Bee”, Sex.Female); //”Ms. Bee, age 10, not married” string c = Title(”T”, Sex.Male, 50); //”Mr. T, age 50, not married” string d = Title(”Jones”, Sex.Female, 45, true); //”Mrs. Jones, age 45, married”

Navngivne (named) parametre Identificering af argumenter ved navn i stedet for position Navngivne parametre kan optræde i vilkårlig rækkefølge Positionelle og navngivne parametre kan blandes. Positionelle skal stå først (ellers kan compileren ikke afgøre parameter) Ulempe: Parameter-navne bliver del af API’et. string Title(string name, Sex s = Sex.Male, int age = 10, bool married = false) { … return prefix + name + ”, age ” + age + (married ? ”, married” : ”not married”); } string a = Title(”Mox”, age: 36); string b = Title(age:36 name:”Mox”); string c = Title(”T”, Sex.Male, married:false, age:50); string c = Title(”Error”, age:30, 29); //compile-time fejl (positionel efter navngiven)

Diverse Namespaces Exception handling

Namespaces Namespace: Overordnet kategorisering af typer med relateret funktionalitet, fx. System.Math. Konvention: CompanyName.ProductName.FunctionalArea (hierakisk) Fx Microsoft.Win32.Networking Importer namespace med using (ingen *)

Exception handling En exception kastes (throw) når en (seriøs) fejl ikke er håndteret. try…catch…finally Catch blokke skal ordnes efter mest specifikke exception. System.Exception er mindst specifik og skal optræde sidst. C# specificerer ikke exceptions

Opsummering Grundlæggende elementer af C#: Common Language Infrastructure Data typer Indbyggede typer og brugerdefinerede typer (kort) Værdi- vs. Referencetyper Metoder Kontrolstrukturer (selection statements) og operatorer http://msdn.microsoft.com/en-us/library/xt4z8b0f(v=VS.71).aspx http://msdn.microsoft.com/en-us/library/618ayhy6(v=VS.80).aspx