Overblik over udviklingen af NET frameworket et kig
Overblik over udviklingen af. NET frameworket - et kig på de vigtigste nyheder i de seneste versioner Captator Tlf: 8620 4242 www. captator. dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark lykke@captator. dk Mobil: 2237 3311 oktober 2007 Overblik over udviklingen af. NET frameworket 1
Indhold Synopsis: Formålet med denne Tech. Talk er at give dig et overblik over hvad de nyere versioner af. NET frameworket tilbyder af muligheder. Fokus på de vigtigste framework features: Generics, nullable typer, partielle typer WPF, WCF, WF Anonyme metoder, lambda funktioner, extension metoder, anonyme typer, type inferens, LINQ CLR Add-Ins Andre væsentlige features: VS 2008 sprog features, Click. Once, ADO. NET 2. 0, ASP. NET AJAX, Silver. Light, CLR add-ins oktober 2007 Overblik over udviklingen af. NET frameworket 2
Visual Studio og. NET frameworket En platform i udvikling og og ET 0 5 3 8. N T. 0. w 3 00 2. 0 00 1. 1 00 3. 5 k NE k 1 2 2 2 r og vie. o io ork io re w d d d e p w w w tu ew tu rk m S S S a fr al fram al ewo u u T u s s s Vi ET Vi NET NE Vi fram. N. . Juni 2000 oktober 2007 Februar 2002 April 2003 November 2005 November 2006 Ultimo 2007 Overblik over udviklingen af. NET frameworket 3
Ikke-generiske metoder Ønske: At kunne tage maksimum af to værdier VB Public Function Max. Value(By. Val a As Integer, By. Val b As Integer) As Integer '. . . End Sub Public Function Max. Value (By. Val a As String, By. Val b As String) As String '. . . End Sub ' etc. . . Mulig løsning: Kan sammenligne vha. IComparable Public Function Max. Value (By. Val a As System. IComparable, _ By. Val b As System. IComparable) As Object If a. Compare. To(b) > 0 Then 'Kan give en run-time fejl Return a Else Vil give en run-time fejl, ved kald Return b med to forskellige typer – End If End Function for eksempel et tal og en streng Dim max As Integer = CType(Max(17, 42), Integer) oktober 2007 Overblik over udviklingen af. NET frameworket 4
Generiske metoder Definition af generisk metode VB Public Function Max. Value(Of T As System. IComparable(Of T)) _ (By. Val a As T, By. Val b As T) As T If a. Compare. To(b) > 0 Then Return a Else Return b End If End Sub Brug af generisk metode Dim i As Integer = 17 Dim j As Integer = 42 Dim k As Integer = Max. Value(Of Integer)(i, j) Dim s As String = "Alfa" Dim t As String = "Omega" Dim r As String = Max. Value(Of String)(s, t) oktober 2007 Overblik over udviklingen af. NET frameworket 5
Generiske metoder Definition af generisk metode C# public T Max. Value<T>(T a, T b) where T : System. IComparable<T> { if (a. Compare. To(b) > 0) return a; else return b; } Brug af generisk metode int i = 17; int j = 42; int k = Max. Value<int>(i, j); string s = "Alfa"; string t = "Omega"; string r = Max. Value<string>(s, t); oktober 2007 Overblik over udviklingen af. NET frameworket 6
Generics Motivation for generics at kunne lave generel og typestærk funktionalitet at undgå overhead på grund af boxing Forskellige slags generics Metoder, klasser, structs, interfaces og delegates Hvordan er generics implementeret i. NET? Instantieres på run-time, ikke compile-time Checkes på design-/compile-time Virker for både reference og value typer Komplet run-time type information oktober 2007 Overblik over udviklingen af. NET frameworket 7
Collections - generiske System. Collections. Generic Dictionary, Linked. List, Queue, Sorted. List, Stack, Hash. Set (. NET 3. 5) Typestærke og generelle, ikke eksplicitte typecasts => Type-sikker kode og stor mulighed for genbrug Dim col As New System. Collections. Generic. List(Of Integer) col. Add(17) col. Add("Hello") 'Der sker ingen boxing her û Kompileringsfejl Dim i As Integer = col(0) 'Der sker ingen typecast her System. Collections. Generic. List<int> col = new System. Collections. Generic. List<int>(); col. Add(17); col. Add("Hello"); VB C# // Der sker ingen boxing her û Kompileringsfejl int i = col[0]; // Der sker ingen typecast her oktober 2007 Overblik over udviklingen af. NET frameworket 8
Nullable typer Alle value typer kan gøres nullable ved anvendelse af System. Nullable(Of T) / System. Nullable<T> Struktur der kombinerer T og en boolean Value – readonly property (value-type) Has. Value - readonly property (boolean) Int 32 123 Nullable(Of Int 32) / Nullable<Int 32> Value 123 ? ? ? Has. Value True False Ikke Nothing oktober 2007 Overblik over udviklingen af. NET frameworket Udefineret værdi 9
Nullable typer Eksempler på brug af System. Nullable Dim Dim x = Dim y = Dim x As New System. Nullable(Of Integer)(17) y As System. Nullable(Of Integer) = 17 z As System. Nullable(Of Integer) ' Nothing er default 42 Nothing is. True As Boolean = (x = Nothing) x. Get. Value. Or. Default(13) ' da x=Nothing returneres 13 y. Get. Value. Or. Default(17) ' da y<>Nothing returneres y. Value is. Also. True As Boolean = y. Has. Value is 13 As Integer = y. Value VB System. Nullable<int> x = new System. Nullable<int>(17); System. Nullable<int> y = 17; System. Nullable<int> z; // null er default x = 42; x = null; bool is. True = (x == null); y = x. Get. Value. Or. Default(13); // da x == null returneres 13 y = y. Get. Value. Or. Default(17); // da y != null returneres y. Value bool is. Also. True = y. Has. Value; int is 13 = y. Value; C# oktober 2007 Overblik over udviklingen af. NET frameworket 10
Nullable typer Syntaktisk sukker i C# og i VB (i VS 2008) Syntaktisk sukker Svarende til C# int? z 1; System. Nullable<int> z; C# int? y 1 = 17; System. Nullable<int> y = 17; C# int? x 1 = new int? (17); System. Nullable<int> x = new System. Nullable<int>(17); C# int y = z 1 ? ? 13; y = x. Get. Value. Or. Default(13); C# int? z = (int? ) new double? (17. 42); System. Nullable<int> z = (System. Nullable<int>) new System. Nullable<double>(17. 42); VB Dim z 1 As Integer? Dim z As System. Nullable(Of Integer) VB Dim y 1 As Integer? = 17 Dim z As System. Nullable(Of Integer) = 17 VB Dim x 1 As Integer? = New Integer? (17) Dim z As System. Nullable(Of Integer) = New System. Nullable(Of Integer)(17) VB Dim z As Integer? = Ctype(New Double? (17. 42), Integer? ) Dim z As System. Nullable(Of Integer) = CType(New System. Nullable(Of Double) (17. 42), Integer) oktober 2007 Overblik over udviklingen af. NET frameworket 11
Partielle typer VB Partial Public Class Klasse Public Read. Only Property Egenskab() As String Get Public Class Klasse Return _state Public Read. Only Property Egenskab() As String End Get End Property Return _state End Get Public Sub Metode 1() End Property _state = "Skuddermudder" End Sub End Class Partial Public Class Klasse Private _state As String Public Sub Metode 2() _state = "Skummelskud" End Sub End Class Public Sub Metode 1() _state = "Skuddermudder" End Sub Private _state As String Public Sub Metode 2() _state = "Skummelskud" End Sub End Class Dim obj As New Klasse obj. Metode 1() obj. Metode 2() Message. Box. Show(obj. Egenskab) oktober 2007 Overblik over udviklingen af. NET frameworket 12
Partielle typer public partial class Klasse { public void Metode 1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } C# } private string _state; public partial class Klasse { private string _state; public void Metode 2() { _state = "Skummelskud"; } } oktober 2007 public void Metode 2() { _state = "Skummelskud"; } } Klasse obj = new Klasse(); obj. Metode 1(); obj. Metode 2(); Message. Box. Show(obj. Egenskab); Overblik over udviklingen af. NET frameworket 13
Unified programmeringsmodel ASMX . NET Remoting Interoperabilitet med andre platforme Udvidbarhed Lokations transparens Attributbaseret programmering Enterprise Services WS-* protocol support Messageorienteret programmering System. Messaging WSE oktober 2007 Overblik over udviklingen af. NET frameworket 14
WCF bestanddele Service Klient Hvad skal der sendes? Kontrakt Hvor skal. Adresse det sendes hen? Hvordan skal det sendes? Binding Sikkerhed? Encoding? Transport? WCF definerer en række standard bindings Basic. Http, Ws. Dual. Http, Net. Tcp, Net. Peer. Tcp, Net. Named. Pipes, Net. Msmq, Msmq. Integration oktober 2007 Overblik over udviklingen af. NET frameworket 15
WCF implementation Service Klient Definer kontrakt Implementer kontrakt Stil host til rådighed Konfigurer binding Konfigurer adresse Download metadata (sæt reference) Generer proxy eller brug channelfactory Kald metoder Service instans Channel oktober 2007 Proxy Session Overblik over udviklingen af. NET frameworket Channel 16
WPF arkitekturen Visuelt overbevisende brugergrænseflader Næste generation af Windows’ præsentationsmodel Unified programmeringsmodel Vektor-baseret grafik Udnytter PCens grafik-hardware CPUen fritages for arbejde med grafik Brugergrænsefladen specificeres som en objektgraf Genereres ud fra et XML dokument eller af et program Eventkode og brugergrænsefladen kan defineres separat XML dokumenter kan let genereres og parses af værktøjer og komponente Værktøjsunderstøttelse oktober 2007 Overblik over udviklingen af. NET frameworket 17
Funktionalitet Drawing Painting Kontroller Layout Styling Templates Animation Data binding 3 D Document interface Tekst oktober 2007 Overblik over udviklingen af. NET frameworket 18
Styling Gammeldaws tilpasning af kontrol Properties Custom draw, owner draw eller custom kontrol WPF tilpasning af kontrol Properties Styling Custom kontrol WPFs styling- og animationsmodeller er baseret på direkte manipulation af properties Custom kontroller bør kun være nødvendige, hvis man ønsker en anden opførsel – ikke pga udseendet oktober 2007 Overblik over udviklingen af. NET frameworket 19
Windows Workflow Foundation (WF) Kun markup (deklarativ) Markup og kode Kun kode XAML C#/VB • XML definerer workflow • Code-beside definerer yderligere logik Genereret af applikation Applikation skaber aktivitetstræer og serialiserer • Kode definerer workflow XAML C#/VB Workflow kompiler wfc. exe C#/VB kompiler oktober 2007 Overblik over udviklingen af. NET frameworket . NET assembly definerer workflow 20
Windows Workflow Foundation Workflows er mængder af aktiviteter Workflows eksekveres i en host proces enhver applikation eller server Visuel designer Et workflow Udviklere kan implementere deres egne custom aktiviteter En aktivitet Base Activity Library: Out-of-box aktiviteter og Custom Activity Library basis for custom aktiviteter Runtime Engine: Windows Workflow Foundation Workflow eksekvering og state håndtering Base Activity Library Runtime Engine Runtime Services: Runtime Services Hosting og kommunikation Visual Designer: Host proces Grafisk og kode-baseret opbygning af workflows oktober 2007 Overblik over udviklingen af. NET frameworket 21
Implicitly typed local variables ikke Varianter er tilbage igen! Typen kan udledes af kompileren Double var pi = 3. 14; String var navn = "Anders And"; var idag = System. Date. Time. Today; C# Date. Time var tal = new int[] {10, 4, 17, 42}; var duck = new Person {Navn="Anders", Adresse="Andeby", Alder=71 }; Statisk typet! Fuld intellisense Kompilercheck System. Collections. Generic. List<Person> personer = new System. Collections. Generic. List<Person>(); var personer = new System. Collections. Generic. List<Person>(); oktober 2007 Overblik over udviklingen af. NET frameworket 22
Implicitly typed local variables Typen kan udledes af kompileren double Dim pi = 3. 14 Dim navn = "Anders And" Dim idag = System. Date. Time. Today VB string Date. Time Dim tal = New Integer() {10, 4, 17, 42} Dim duck As New Person With {. Navn="Anders", . Adresse="Andeby", . Alder=71} Statisk typet! Fuld intellisense Kompilercheck Dim personer As System. Collections. Generic. List(Of Person) = _ New System. Collections. Generic. List(Of Person)() Har man hele tiden kunnet i VB Dim personer As New System. Collections. Generic. List(Of Person)() oktober 2007 Overblik over udviklingen af. NET frameworket 23
Anonyme typer En type behøver ikke at have noget (kendt) navn VB Dim b 1 = New With {. Titel=". NET for hackere", . Pris = 17. 42} Dim b 2 = New With {. Titel=". NET for plattenslagere", . Pris = 42. 17} Dim b 3 = b 2 = b 1 Dim bogens. Titel As String = b 1. Titel Message. Box. Show("Første bogs titel = " + b 1. Titel) Message. Box. Show("Tredje bogs titel = " + b 3. Titel) Dim p As New Person With {. Navn="Anders", . Adresse="Andeby", . Alder=71, . Cpr. Nr="123456 -7890" } Dim address. Info 1 = New With { p. Navn, p. Adresse } Dim address. Info 2 = New With {. Navn = p. Navn, . Adresse = p. Adresse } Dim address. Info 3 = New With {. Name = p. Navn, . Address = p. Adresse } address. Info 2 = address. Info 1 address. Info 3 = address. Info 2 oktober 2007 ûCompiler fejl Overblik over udviklingen af. NET frameworket 24
Anonyme typer En type behøver ikke at have noget (kendt) navn C# var b 1 = new {Titel=". NET for hackere", Pris=17. 42}; var b 2 = new {Titel=". NET for plattenslagere", Pris=42. 17}; var b 3 = b 2; b 2 = b 1; string bogens. Titel = b 1. Titel; Message. Box. Show("Første bogs titel = " + b 1. Titel); Message. Box. Show("Tredje bogs titel = " + b 3. Titel); Person p = new Person { Navn="Anders", Adresse="Andeby", Alder=71, Cpr. Nr="123456 -7890" }; var address. Info 1 = new { p. Navn, p. Adresse }; var address. Info 2 = new { Navn = p. Navn, Adresse = p. Adresse }; var address. Info 3 = new { Name = p. Navn, Address = p. Adresse }; address. Info 2 = address. Info 1; address. Info 3 = address. Info 2; oktober 2007 ûCompiler fejl Overblik over udviklingen af. NET frameworket 25
Anonyme metoder (C# - 2. 0) Delegates kan erstattes med inline kodeblokke C# delegate [(parameter-list)] { anonymous-method-block } Benytter delegate inferens Kan bruges hvor og som delegates kan bruges Event. Handlers, callback-delegates Eksplicit assignment, delegate-parameter i metodekald Kode blokken kan undlade eller medtage delegatetypens parameterliste efter behov Undladt parameterliste er forskellig fra den tomme ( ) Returtypen og en eventuel parameterliste skal være kompatibel med delegatetypen Kan ”capture” omkringliggende metodes variable Forlænget levetid af disse lokale variable oktober 2007 Overblik over udviklingen af. NET frameworket 26
Anonyme metoder (C# - 2. 0) private delegate int Min. Delegate. Type(int a, int b); C# Min. Delegate. Type del. Calc; del. Calc = delegate { return 17 + 42; }; Message. Box. Show("17 + 42 = " + del. Calc(2, 2). To. String()); del. Calc = delegate(int x, int y) { return x + y; }; Message. Box. Show("2 + 2 = " + del. Calc(2, 2). To. String()); int j = 42; del. Calc = delegate(int x, int y) { return x + j; }; Message. Box. Show("2 + 42 = " + del. Calc(2, 2). To. String()); private int i = 119; private void btn. Anonyme. Metoder_Click(object sender, Event. Args e) { Min. Delegate. Type del. Calc; int k = 7; del. Calc = delegate(int x, int y) { return i / k + y; }; Message. Box. Show("119 / 7 + 2 = " + del. Calc(2, 2). To. String()); } oktober 2007 Overblik over udviklingen af. NET frameworket 27
Lamba udtryk Komprimerede anonyme metoder private delegate int Min. Delegate. Type(int a); private void Show. Result(Min. Delegate. Type del, int i) { Message. Box. Show(del(i). To. String()); } Min. Delegate. Type del. Calc = delegate(int x) { return x + 42; }; Show. Result( del. Calc, 17); Show. Result( delegate(int x) { return x + 42; }, 18); C# C# Show. Result( ((int x) => x + 42), 19); x er eksplicit typet Show. Result( (x => x + 42), 20); x er implicit typet Dim del. Calc As My. Delegate. Type = Function(x As Integer) x + 42 VB Show. Result(del. Calc, 17) Show. Result(Function(x As Integer) x + 42, 18) x er eksplicit typet Show. Result(Function(x) x + 42, 20) oktober 2007 x er implicit typet Overblik over udviklingen af. NET frameworket 28
Extension metoder Kan udvide udvalgte typer med ekstra metoder Lav en extension metode (statisk (C#) / shared (VB)) Det første argument til metoden udpeger typen, som extension metode virker på Metoden kaldes som en instansmetode Kan (naturligvis) også kaldes som en statisk / shared metode Importer namespacet (using (C#) / Imports (VB)) Extension metoderne i det importerede namespace kan nu kaldes Kald metoden på et objekt af den udvalgte type Kan være almindelige såvel som generiske metoder Instansmetoder ”slår” extension metoder oktober 2007 Overblik over udviklingen af. NET frameworket 29
Extension metoder - eksempel Namespace Super. Extensions <System. Runtime. Compiler. Services. Extension()> _ Module My. Extensions <System. Runtime. Compiler. Services. Extension()> _ Public Sub Show(By. Val [Me] As String) System. Windows. Forms. Message. Box. Show([Me]) End Sub End Module End Namespace [Me] angiver objektet metoden kaldes på VB Keywords der bruges som identifiers skal i [ ] I VB angiver System. Runtime. Compiler. Services. Extensionattributten, at dette er en extension metode Imports Orcas_Vb. Super. Extensions Dim str As String = "Hej verden" str. Show() Orcas_Cs. Super. Extensions. User. Interface. Show("Hej statiske verden"); oktober 2007 Overblik over udviklingen af. NET frameworket 30
Extension metoder - eksempel namespace Orcas_Cs. Super. Extensions { static class User. Interface { public static void Show(this string s) { System. Windows. Forms. Message. Box. Show(s); } } this angiver objektet metoden kaldes på } C# I C# angiver ”this” som parameter-modifier, at dette er en extension metode using Orcas_Cs. Super. Extensions; string str = "Hej verden"; str. Show(); Orcas_Cs. Super. Extensions. User. Interface. Show("Hej statiske verden"); oktober 2007 Overblik over udviklingen af. NET frameworket 31
Et problem … der måske eksisterer Dim sql As String = "SELECT * FROM Authors" Dim cmd As New System. Data. Sql. Client. Sql. Command(sql, conn) Dim adap As New System. Data. Sql. Client. Sql. Data. Adapter(cmd) VB Dim tbl As New System. Data. Table adap. Fill(tbl) conn. Close() Query, parametre og resultat er ikke stærkt typet Queryen er kun en streng Parametrene er svagt typede Resultatet (f. eks. Data. Table) er en collection af svagt typede objekter Query sproget er typisk koblet til databaser Ikke-trivielt at lave querysprog oktober 2007 Overblik over udviklingen af. NET frameworket 32
LINQ Architecture C# Others… VB. NET Language Integrated Query (LINQ) LINQ enabled data sources LINQ enabled ADO. NET LINQ to Objects LINQ to Datasets LINQ to SQL LINQ to Entities LINQ to XML <book> <title/> <author/> <price/> </book> Objects oktober 2007 Relational Overblik over udviklingen af. NET frameworket XML 33
The Missing LINQ danner bro mellem. NET sprog og ”LINQ to *” Generel query facilitet i. NET frameworket Definerer en række standard query operatorer Gennemløb, filtrering, projektion, . . . Et API til at query ethvert. NET array eller collection Opererer på og returnerer objekter af typen IEnumerable<T> (C#) / IEnumerable<T> (VB) Extension metoder defineret i System. Linq. Queryable klassen The missing link Metoderne eksekveres først ved gennemløb De fleste metoder kan ”pipes” Koden kan modulariseres oktober 2007 Overblik over udviklingen af. NET frameworket 34
Language Integrated Query VB Dim ænder As New List(Of Person) ænder. Add(New Person With {. Name = "Fethry Duck", . Address =. . . }) ænder. Add(New Person With {. Name = "Donald Duck", . Address =. . . }) Sprogunderstøttelse for query udtryk Dim andeborgere = From duck In ænder _ Where duck. Address = "Duckburg" _ Order By duck. Age, duck. Name _ Select New With {duck. Age, duck. Name} Eksekveres som Dim andeborgere = ænder. Where(Function(duck) duck. Address = "Andeby") _. Order. By(Function(duck) duck. Age) _. Then. By(Function(duck) duck. Name) _. Select(Function(duck) New With {duck. Age, duck. Name}) For Each duck In duckburgers Message. Box. Show(duck. Name + " " + duck. Age. To. String()) Next Fleksible projektioner Select New With {duck. Name, . Born = System. Date. Time. Now. Year - duck. Age} oktober 2007 Overblik over udviklingen af. NET frameworket 35
Language Integrated Query List<Person> ænder = new List<Person> { new Person {Navn="Fætter Vims", Adresse="Andeby", Alder = 34}, new Person. . . } }; C# Sprogunderstøttelse for query udtryk var andeborgere = from duck in ænder where duck. Adresse == "Andeby" Eksekveres som orderby duck. Alder, duck. Navn select new {duck. Alder, duck. Navn}; var andeborgere = ænder. Where(duck => duck. Adresse == "Andeby"). Order. By(duck => duck. Alder). Then. By(duck => duck. Navn). Select(duck => new {duck. Alder, duck. Navn}); foreach (var duck in andeborgere) { Message. Box. Show(duck. Name + " " + duck. Age); } Fleksible projektioner select new { duck. Name, Born = System. Date. Time. Now. Year - duck. Age }; oktober 2007 Overblik over udviklingen af. NET frameworket 36
Object Relational Designer Tilføj et ”LINQ to SQL File” project item til projektet Definer connectionen Drag and drop database objekterne fra server exploreren ind på O/R designerens overflade oktober 2007 Overblik over udviklingen af. NET frameworket 37
LINQ to SQL - selektion Eksempel på en select query C# var db = new Pubs. Data. Classes. Context(_connection. String); var titles = db. Get. Table<titles>(); var title. Query = from the. Book in db. titles join rel in db. titleauthors on the. Book. title_id equals rel. title_id join the. Author in db. authors on rel. au_id equals the. Author. au_id where the. Book. price < 10 select new { the. Book. title_id, the. Book. title, the. Book. price, the. Author. au_lname, the. Author. au_fname }; txt. Data. Text = ""; IEnumerable<T> foreach (var res in title. Query) { txt. Data. Text += res. title_id + "t" + res. title + "t" + res. price. To. String() + "t" + res. au_fname + "t" + res. au_lname + "rn"; } oktober 2007 Overblik over udviklingen af. NET frameworket 38
Spørgsmål www. captator. dk nyheder, artikler, information, . . . oktober 2007 Overblik over udviklingen af. NET frameworket 39
- Slides: 39