130 likes | 255 Views
Typeparametisering/Genericity. Generics i .NET 2 og C#. ”Generisk” programmering i C# (som det har været indtil sommer 2005). Alle klasser nedstammer fra Object Så derfor kan vi anvende polymorfi F.eks. Object[ ] data dette array kan indeholde alle mulige objekter fra alle mulige klasser
E N D
Typeparametisering/Genericity Generics i .NET 2 og C# NOEA/IT - FEN
”Generisk” programmering i C#(som det har været indtil sommer 2005) • Alle klasser nedstammer fra Object • Så derfor kan vi anvende polymorfi • F.eks. Object[ ] data • dette array kan indeholde alle mulige objekter fra alle mulige klasser • Kendt fra ArrayList, HashMap osv. i .NET 1 NOEA/IT - FEN
Fordele og ulemper Er det en fordel? • Fordele • heterogene collections • Ulemper • mange typecasts • ikke typesikkert • typen checkes run-time i forbindelse med castet • hvad med int og de andre primitive datatyper? (boxing – giver overhead) NOEA/IT - FEN
Programmeringsfejl • Programmet virker ikke korrekt, men det opdager vi ikke (uopdagede fejl) • så er det bedre, hvis: • Programmet virker ikke korrekt, men vi får det at vide vha. f.eks. en exception (runtime fejl) • så er det bedre, hvis: • Compileren accepterer ikke programmet (compile-time fejl) NOEA/IT - FEN
Strategien • Placér så meget som muligt af fejl-kontrollen i compilerings-fasen • Fordele: • Lettere at sikre korrekte programmer • Mere effektiv programeksekvering • Ulemper • Mere restriktiv programmering (mindre fleksibilitet) NOEA/IT - FEN
Ideen: Typeparametrisering • Compileren ved nu, at der kun må placeres Kunde-objekter (og subtyper heraf) i al • Compileren ved nu, at det der hentes ud af al er Kunde-objekter (og subtyper heraf) • Statisk typecheck i stedet for dynamisk typecheck • Ingen dynamiske casts I version 1: using System.Collections; IList al = new ArrayList(); Kunde k= (Kunde) al.get(i); I version 2: using System.Collections.Generic; IList<Kunde> al = new List<Kunde>(); Kunde k= al.get(i); Typeparameter NOEA/IT - FEN
I C#: AnsatSeqProject Ansat a1 = new Ansat("Ib", "Programmør", 10000); Ansat a = new Ansat("Kurt", "Seniorprogrammør", 20000); Ansat b = new Ansat("Karl", "Programmør", 10000); Ansat c = new Ansat("Karen", "Systemprogrammør", 13000); Ansat d = new Ansat("Iben", "Programmør", 11000); Ansat e = new Ansat("Ib", "Systemkonsulent", 9000); string s = "Halløjsa!"; IList<Ansat> ansatte = new List<Ansat>(); ansatte.Add(a1); ansatte.Add(a); ansatte.Add(b); ansatte.Add(c); ansatte.Add(d); ansatte.Add(e); ansatte.Add(s);//COMPILERFEJL!!!! source NOEA/IT - FEN
.NET 2 Generics (key,value) -par ICollection<T> IList<T> LinkedList<T> IDictionary<TKey, TValue> List<T> SortedDictionary<TKey, TValue> Dictionary <TKey, TValue> Indekserbare Array-baseret Balanceret søgetræ Hashtabel NOEA/IT - FEN
http://msdn2.microsoft.com/en-us/library/system.collections.generic.aspxhttp://msdn2.microsoft.com/en-us/library/system.collections.generic.aspx NOEA/IT - FEN
Men det har en pris: • ingen heterogene collections • hvilket vist ikke er et større savn... • typesystemet kompliceres • sprogets syntaks kompliceres • man får brug for en preprocessor • så længere compileringstider • og mere mystiske fejlmeddelelser NOEA/IT - FEN
Generiske typer vs. polymorfe typer • Generiske typer: • alle elementer er af samme type • typen fastlægges statisk (compile-tid), statisk binding er mulig • F.eks vil en float i List<int> l give en compile-fejl • Polymorfe datastrukturer: • elementer kan være af forskellige typer, men alle elementer skal være specialiseringer af den type, der er defineret som element • statisk typekontrol er muligt, men dynamisk binding er nødvendig NOEA/IT - FEN
Forskelle på implementeringen • C++ preprocessoren opfatter en template-definition som en slags makro dvs. vector<Kunde*> kundeListe; og vector<Vare*> vareListe; får compileren til at generere kode til to forskellige vectors. • Effektivt, men objektkoden bliver stor • Java bruger I princippet den gamle ArrayList, men indpakker castene for os. • Fylder ikke meget ekstra, men koster stadig tid til casts – check sker compiletid • C# bruger C++ måden ved value-typer, men siges at være bedre til at undgå kodeduplikering, og bruger Java måden på referencetyper.Meta-data giver også information om typeparametre NOEA/IT - FEN