390 likes | 547 Views
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. Indhold. Synopsis:
E N D
Overblik over udviklingen af .NET frameworket- et kig på de vigtigste nyheder i de seneste versioner CaptatorTlf: 8620 4242www.captator.dkHenrik Lykke NielsenSoftwarearkitekt, Microsoft Regional Director for Denmarklykke@captator.dkMobil: 2237 3311 Overblik over udviklingen af .NET frameworket
Indhold • Synopsis: • Formålet med denne TechTalk 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, ClickOnce, ADO.NET 2.0, ASP.NET 2.0, ASP.NET AJAX, SilverLight, CLR add-ins Overblik over udviklingen af .NET frameworket
Visual Studio og .NET frameworket • En platform i udvikling Visual Studio og .NET framework preview Visual Studio.NET og.NET framework 1.0 Visual Studio 2003 og.NET framework 1.1 Visual Studio 2005 og.NET framework 2.0 Visual Studio 2008 og.NET framework 3.5 .NET framework 3.0 Juni 2000 Februar 2002 November 2005 April 2003 November 2006 Ultimo 2007 Overblik over udviklingen af .NET frameworket
Ikke-generiske metoder VB • Ønske: At kunne tage maksimum af to værdier • Mulig løsning: Kan sammenligne vha. IComparable Public FunctionMaxValue(ByVala As Integer, ByVal b As Integer) As Integer '... End Sub Public FunctionMaxValue (ByVal a As String, ByVal b As String) As String '... End Sub ' etc ... Public FunctionMaxValue (ByVala AsSystem.IComparable, _ByValb AsSystem.IComparable) As Object Ifa.CompareTo(b) > 0 Then'Kan give en run-time fejl Return a Else Return b End If End Function Dim max As Integer = CType(Max(17, 42), Integer) Vil give en run-time fejl, ved kald med to forskellige typer – for eksempel et tal og en streng Overblik over udviklingen af .NET frameworket
Generiske metoder VB • Definition af generisk metode • Brug af generisk metode Public Function MaxValue(OfT As System.IComparable(Of T)) _(ByVal a As T, ByVal b As T) As T Ifa.CompareTo(b) > 0 Then Return a Else Return b End If End Sub Dim i As Integer = 17 Dim j As Integer = 42 Dim k As Integer = MaxValue(Of Integer)(i, j) Dim s As String = "Alfa" Dim t As String = "Omega" Dim r As String = MaxValue(Of String)(s, t) Overblik over udviklingen af .NET frameworket
Generiske metoder C# • Definition af generisk metode • Brug af generisk metode public TMaxValue<T>(T a, T b) where T : System.IComparable<T> { if(a.CompareTo(b) > 0) return a; else return b; } inti= 17; intj= 42; int k = MaxValue<int>(i, j); string s= "Alfa"; string t= "Omega"; string r = MaxValue<string>(s, t); Overblik over udviklingen af .NET frameworket
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 Overblik over udviklingen af .NET frameworket
û û Kompileringsfejl Kompileringsfejl Collections - generiske • System.Collections.Generic • Dictionary, LinkedList, List, Queue, SortedList, Stack, HashSet (.NET 3.5) • Typestærke oggenerelle, ikke eksplicitte typecasts • => Type-sikker kode og stor mulighed for genbrug DimcolAs NewSystem.Collections.Generic.List(OfInteger) col.Add(17) 'Derskeringen boxing her col.Add("Hello") DimiAs Integer = col(0) 'Derskeringen typecast her VB System.Collections.Generic.List<int> col = newSystem.Collections.Generic.List<int>(); col.Add(17); // Derskeringen boxing her col.Add("Hello"); inti = col[0]; // Derskeringen typecast her C# Overblik over udviklingen af .NET frameworket
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 – readonlyproperty (value-type) • HasValue - readonlyproperty (boolean) Int32 123 Nullable(Of Int32) / Nullable<Int32> Udefineret værdi 123 ??? Value False HasValue True Ikke Nothing Nothing Overblik over udviklingen af .NET frameworket
Nullable typer • Eksempler på brug af System.Nullable Dim x As New System.Nullable(OfInteger)(17) Dim y As System.Nullable(OfInteger) = 17 DimzAs System.Nullable(OfInteger)'Nothing er default x = 42 x = Nothing Dim isTrue As Boolean = (x = Nothing) y = x.GetValueOrDefault(13) ' da x=Nothing returneres 13 y = y.GetValueOrDefault(17) ' da y<>Nothing returneres y.Value DimisAlsoTrue As Boolean = y.HasValue Dim is13 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 isTrue = (x == null); y = x.GetValueOrDefault(13); // da x == null returneres 13 y = y.GetValueOrDefault(17); // da y != null returneres y.Value boolisAlsoTrue = y.HasValue; intis13 = y.Value; C# Overblik over udviklingen af .NET frameworket
Nullable typer • Syntaktisk sukker i C# og i VB (i VS2008) Overblik over udviklingen af .NET frameworket
Partielle typer VB Partial Public Class Klasse Public ReadOnly Property Egenskab() As String Get Return _state End Get End Property Public Sub Metode1() _state = "Skuddermudder" End Sub End Class Public Class Klasse Public ReadOnly Property Egenskab() As String Get Return _state End Get End Property Public Sub Metode1() _state = "Skuddermudder" End Sub Private _state As String Public Sub Metode2() _state = "Skummelskud" End Sub End Class Partial Public ClassKlasse Private _state As String Public Sub Metode2() _state = "Skummelskud" End Sub End Class Dim obj As NewKlasse obj.Metode1() obj.Metode2() MessageBox.Show(obj.Egenskab) Overblik over udviklingen af .NET frameworket
Partielle typer C# publicpartial class Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get{return _state; } } } publicclass Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get{return _state; } } private string _state; public void Metode2() { _state = "Skummelskud"; } } public partial class Klasse { private string _state; public void Metode2() { _state = "Skummelskud"; } } Klasse obj = new Klasse(); obj.Metode1(); obj.Metode2(); MessageBox.Show(obj.Egenskab); Overblik over udviklingen af .NET frameworket
Unified programmeringsmodel .NET Remoting ASMX Interoperabilitet med andre platforme Udvidbarhed Lokationstransparens Attribut- baseret programmering Message- orienteret programmering WS-* protocol support Enterprise Services System.Messaging WSE Overblik over udviklingen af .NET frameworket
Sikkerhed? Encoding? Transport? WCF bestanddele Service • WCF definerer en række standard bindings • BasicHttp, WsHttp, WsDualHttp, NetTcp, NetPeerTcp, NetNamedPipes, NetMsmq, MsmqIntegration Klient Hvadskaldersendes? Kontrakt Hvorskaldetsendes hen? Adresse Hvordanskaldetsendes? Binding Overblik over udviklingen af .NET frameworket
WCF implementation • Service • Definer kontrakt • Implementer kontrakt • Stil host til rådighed • Konfigurer binding • Konfigurer adresse • Klient • Download metadata(sæt reference) • Generer proxy eller brug channelfactory • Kald metoder Service instans Proxy Channel Session Session Channel Overblik over udviklingen af .NET frameworket
WPF arkitekturen • Visueltoverbevisendebrugergrænseflader • Næste generation af Windows’ præsentationsmodel • Unified programmeringsmodel • Vektor-baseretgrafik • UdnytterPCensgrafik-hardware • CPUenfritages 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 Overblik over udviklingen af .NET frameworket
Funktionalitet • Drawing • Painting • Kontroller • Layout • Styling • Templates • Animation • Data binding • 3D • Document interface • Tekst Overblik over udviklingen af .NET frameworket
Styling • Gammeldaws tilpasning af kontrol • WPF tilpasning af kontrol • WPFs styling- og animations-modeller er baseret på direktemanipulation af properties • Custom kontroller bør kun værenødvendige, hvis man ønskeren anden opførsel– ikke pga udseendet Properties Custom draw, owner draw eller custom kontrol Properties Styling Custom kontrol Overblik over udviklingen af .NET frameworket
C#/VB C#/VB Windows Workflow Foundation (WF) Genereretafapplikation Markup ogkode Kun markup(deklarativ) Kun kode Applikationskaberaktivitetstræerogserialiserer XAML XAML • Kodedefinerer • workflow • XML definerer • workflow • Code-beside • definereryderligerelogik • XML definerer • workflow XAML C#/VB Workflow kompiler wfc.exe .NET assemblydefinerer workflow C#/VB kompiler Overblik over udviklingen af .NET frameworket
Windows Workflow Foundation • Workflows er mængder af aktiviteter • Workflows eksekveres i en host proces • enhver applikation eller server • Udviklere kan implementere deresegne custom aktiviteter • Base Activity Library: • Out-of-box aktiviteter ogbasis for custom aktiviteter • Runtime Engine: • Workflow eksekveringog state håndtering • Runtime Services: • Hosting og kommunikation • Visual Designer: • Grafisk og kode-baseret opbygning af workflows Visueldesigner Et workflow En aktivitet Custom Activity Library Windows Workflow Foundation Base Activity Library Runtime Engine Runtime Services Host proces Overblik over udviklingen af .NET frameworket
ikke Double String DateTime Implicitly typed local variables C# Typen kan udledes af kompileren Statisk typet! Fuld intellisense Kompilercheck • Varianter er tilbage igen! var pi = 3.14; var navn = "Anders And"; var idag = System.DateTime.Today; var tal = newint[] {10, 4, 17, 42}; varduck = new Person {Navn="Anders", Adresse="Andeby", Alder=71 }; System.Collections.Generic.List<Person> personer =new System.Collections.Generic.List<Person>(); var personer = new System.Collections.Generic.List<Person>(); Overblik over udviklingen af .NET frameworket
double string DateTime Implicitly typed local variables VB • Typen kan udledes af kompileren • Statisk typet! • Fuld intellisense • Kompilercheck Dim pi = 3.14 Dim navn = "Anders And" Dim idag = System.DateTime.Today Dim tal = NewInteger() {10, 4, 17, 42} Dim duck As NewPerson With {.Navn="Anders", .Adresse="Andeby", .Alder=71} Dim personer As System.Collections.Generic.List(Of Person) = _New System.Collections.Generic.List(Of Person)() Dim personer As New System.Collections.Generic.List(Of Person)() Har man hele tiden kunnet i VB Overblik over udviklingen af .NET frameworket
û Compiler fejl Anonyme typer VB • En type behøver ikke at have noget (kendt) navn Dim b1 = NewWith {.Titel=".NET for hackere", .Pris = 17.42} Dim b2 = NewWith {.Titel=".NET for plattenslagere", .Pris = 42.17} Dim b3 = b2 b2 = b1 Dim bogensTitel As String = b1.Titel MessageBox.Show("Første bogs titel = " + b1.Titel) MessageBox.Show("Tredje bogs titel = " + b3.Titel) Dim p As New Person With{ .Navn="Anders",.Adresse="Andeby",.Alder=71,.CprNr="123456-7890"} Dim addressInfo1= NewWith {p.Navn, p.Adresse } Dim addressInfo2 = NewWith { .Navn=p.Navn, .Adresse=p.Adresse } Dim addressInfo3= NewWith { .Name=p.Navn, .Address=p.Adresse } addressInfo2 = addressInfo1 addressInfo3 = addressInfo2 Overblik over udviklingen af .NET frameworket
û Compiler fejl Anonyme typer C# • En type behøver ikke at have noget (kendt) navn var b1 = new {Titel=".NET for hackere", Pris=17.42}; var b2 = new {Titel=".NET for plattenslagere", Pris=42.17}; var b3 = b2; b2 = b1; string bogensTitel = b1.Titel; MessageBox.Show("Første bogs titel = " + b1.Titel); MessageBox.Show("Tredje bogs titel = " + b3.Titel); Person p = new Person{Navn="Anders", Adresse="Andeby", Alder=71, CprNr="123456-7890" }; var addressInfo1 = new {p.Navn, p.Adresse }; var addressInfo2 = new {Navn=p.Navn, Adresse=p.Adresse }; var addressInfo3 = new {Name=p.Navn, Address=p.Adresse }; addressInfo2 = addressInfo1; addressInfo3 = addressInfo2; Overblik over udviklingen af .NET frameworket
Anonyme metoder (C# - 2.0) C# • Delegates kan erstattes med inline kodeblokke • Benytter delegate inferens • Kan bruges hvor og som delegates kan bruges • EventHandlers, callback-delegates • Eksplicit assignment, delegate-parameter i metodekald • Kode blokken kan undlade eller medtage delegate-typens parameterliste efter behov • Undladt parameterliste er forskellig fra den tomme ( ) • Returtypen og en eventuel parameterlisteskal være kompatibel med delegatetypen • Kan ”capture” omkringliggende metodes variable • Forlænget levetid af disse lokale variable delegate [(parameter-list)] { anonymous-method-block } Overblik over udviklingen af .NET frameworket
Anonyme metoder (C# - 2.0) C# private delegate int MinDelegateType(int a, int b); MinDelegateType delCalc; delCalc = delegate { return 17 + 42; }; MessageBox.Show("17 + 42 = " + delCalc(2, 2).ToString()); delCalc = delegate(int x, int y) { return x + y; }; MessageBox.Show("2 + 2 = " + delCalc(2, 2).ToString()); int j = 42; delCalc = delegate(int x, int y) { return x + j; }; MessageBox.Show("2 + 42 = " + delCalc(2, 2).ToString()); private int i = 119; private void btnAnonymeMetoder_Click(object sender, EventArgs e) { MinDelegateType delCalc; int k = 7; delCalc = delegate(int x, int y) { return i / k + y; }; MessageBox.Show("119 / 7 + 2 = " + delCalc(2, 2).ToString()); } Overblik over udviklingen af .NET frameworket
Lamba udtryk • Komprimerede anonyme metoder private delegate int MinDelegateType(int a); private void ShowResult(MinDelegateType del, int i) {MessageBox.Show(del(i).ToString()); } C# MinDelegateType delCalc = delegate(int x) { return x + 42; }; ShowResult( delCalc, 17); ShowResult( delegate(int x) { return x + 42; }, 18); ShowResult( ((int x) => x + 42), 19); ShowResult( (x => x + 42), 20); C# x er eksplicit typet x er implicit typet DimdelCalcAsMyDelegateType = Function(x As Integer) x + 42 ShowResult(delCalc, 17) ShowResult(Function(x As Integer) x + 42, 18) ShowResult(Function(x) x + 42, 20) VB x er eksplicit typet x er implicit typet Overblik over udviklingen af .NET frameworket
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 Overblik over udviklingen af .NET frameworket
Extension metoder - eksempel VB • I VB angiver System.Runtime.CompilerServices.Extension- attributten, at dette er en extension metode Namespace SuperExtensions <System.Runtime.CompilerServices.Extension()> _ Module MyExtensions <System.Runtime.CompilerServices.Extension()> _ Public Sub Show(ByVal [Me] As String) System.Windows.Forms.MessageBox.Show([Me]) End Sub End Module End Namespace [Me] angiver objektet metoden kaldes på Keywords der bruges som identifiers skal i [ ] Imports Orcas_Vb.SuperExtensions Dimstr As String= "Hej verden" str.Show() Orcas_Cs.SuperExtensions.UserInterface.Show("Hej statiske verden"); Overblik over udviklingen af .NET frameworket
Extension metoder - eksempel C# • I C# angiver ”this” som parameter-modifier, at dette er en extension metode namespace Orcas_Cs.SuperExtensions { static class UserInterface { public static void Show(thisstring s) { System.Windows.Forms.MessageBox.Show(s); } } } this angiver objektet metoden kaldes på using Orcas_Cs.SuperExtensions; string str = "Hej verden"; str.Show(); Orcas_Cs.SuperExtensions.UserInterface.Show("Hej statiske verden"); Overblik over udviklingen af .NET frameworket
Et problem … dermåskeeksisterer DimsqlAs String = "SELECT * FROM Authors" Dim cmd AsNew System.Data.SqlClient.SqlCommand(sql, conn) Dim adap AsNew System.Data.SqlClient.SqlDataAdapter(cmd) DimtblAsNewSystem.Data.DataTable 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. DataTable) er en collection af svagt typede objekter • Query sproget er typisk koblet til databaser • Ikke-trivielt at lave querysprog VB Overblik over udviklingen af .NET frameworket
LINQ Architecture Others… C# VB .NET Language Integrated Query (LINQ) LINQ enabled data sources LINQ enabled ADO.NET LINQ to SQL LINQ to Entities LINQ to Datasets LINQ to XML LINQ to Objects <book> <title/> <author/> <price/> </book> Relational XML Objects Overblik over udviklingen af .NET frameworket
The Missing LINQ • 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 • OperererpåogreturnererobjekteraftypenIEnumerable<T> (C#) / IEnumerable<T> (VB) • Extension metoderdefineretiSystem.Linq.Queryableklassen • Metoderneeksekveresførstvedgennemløb • De flestemetoderkan ”pipes” • Kodenkanmodulariseres The missing link Overblik over udviklingen af .NET frameworket
Language Integrated Query VB DimænderAs 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 • Fleksible projektioner Dimandeborgere = From duck Inænder _ Whereduck.Address = "Duckburg" _ Order By duck.Age, duck.Name _ Select New With {duck.Age, duck.Name} Eksekveres som Dimandeborgere = ænder.Where(Function(duck) duck.Address = "Andeby") _ .OrderBy(Function(duck) duck.Age) _ .ThenBy(Function(duck) duck.Name) _ .Select(Function(duck) New With {duck.Age, duck.Name}) For Each duck Induckburgers MessageBox.Show(duck.Name + " " + duck.Age.ToString()) Next Select New With {duck.Name, .Born = System.DateTime.Now.Year - duck.Age} Overblik over udviklingen af .NET frameworket
Language Integrated Query C# List<Person> ænder = new List<Person> { new Person {Navn="Fætter Vims", Adresse="Andeby", Alder = 34}, new Person ...} }; • Sprogunderstøttelse for query udtryk • Fleksible projektioner var andeborgere = fromduckin ænder whereduck.Adresse == "Andeby" orderbyduck.Alder, duck.Navn selectnew {duck.Alder, duck.Navn}; Eksekveres som var andeborgere = ænder.Where(duck => duck.Adresse == "Andeby") .OrderBy(duck => duck.Alder) .ThenBy(duck => duck.Navn) .Select(duck => new {duck.Alder, duck.Navn}); foreach (varduckin andeborgere){ MessageBox.Show(duck.Name + " " + duck.Age); } select new { duck.Name, Born = System.DateTime.Now.Year - duck.Age }; Overblik over udviklingen af .NET frameworket
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 Overblik over udviklingen af .NET frameworket
LINQ to SQL - selektion C# • Eksempel på en select query var db = newPubsDataClassesContext(_connectionString); var titles = db.GetTable<titles>(); vartitleQuery =fromtheBookindb.titles joinrelindb.titleauthorsontheBook.title_idequalsrel.title_id jointheAuthorindb.authorsonrel.au_idequalstheAuthor.au_id where theBook.price < 10 selectnew { theBook.title_id, theBook.title, theBook.price,theAuthor.au_lname, theAuthor.au_fname }; txtData.Text = ""; foreach (var res intitleQuery) { txtData.Text += res.title_id + "\t" + res.title + "\t" + res.price.ToString() + "\t" + res.au_fname + "\t" + res.au_lname + "\r\n\r\n"; } IEnumerable<T> Overblik over udviklingen af .NET frameworket
Spørgsmål www.captator.dknyheder, artikler, information, ... Overblik over udviklingen af .NET frameworket