Overblik over udviklingen af .NET frameworket

Download Report

Transcript Overblik over udviklingen af .NET frameworket

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
[email protected]
Mobil: 2237 3311
oktober 2007
Overblik over udviklingen af .NET frameworket
1
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
oktober 2007
Overblik over udviklingen af .NET frameworket
2
Visual Studio og .NET frameworket
En platform i udvikling
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 MaxValue(ByVal a As Integer, ByVal b As Integer) As Integer
'...
End Sub
Public Function MaxValue (ByVal a As String, ByVal b As String) As String
'...
End Sub
' etc ...
Mulig løsning: Kan sammenligne vha. IComparable
Public Function MaxValue (ByVal a As System.IComparable, _
ByVal b As System.IComparable) As Object
If a.CompareTo(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 MaxValue(Of T As System.IComparable(Of T)) _
(ByVal a As T, ByVal b As T) As T
If a.CompareTo(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 = MaxValue(Of Integer)(i, j)
Dim s As String = "Alfa"
Dim t As String = "Omega"
Dim r As String = MaxValue(Of String)(s, t)
oktober 2007
Overblik over udviklingen af .NET frameworket
5
Generiske metoder
Definition af generisk metode
C#
public T MaxValue<T>(T a, T b) where T : System.IComparable<T>
{
if (a.CompareTo(b) > 0)
return a;
else
return b;
}
Brug af generisk metode
int i = 17;
int j = 42;
int k = MaxValue<int>(i, j);
string s = "Alfa";
string t = "Omega";
string r = MaxValue<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, LinkedList, List, Queue, SortedList, Stack,
HashSet (.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)
HasValue - readonly property (boolean)
Int32
123
Nullable(Of Int32) / Nullable<Int32>
Value
123
???
HasValue
True
False
Ikke Nothing
Nothing
oktober 2007
Overblik over udviklingen af .NET frameworket
Udefineret
værdi
9
Nullable typer
Eksempler på brug af System.Nullable
Dim
Dim
Dim
x =
x =
Dim
y =
y =
Dim
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
isTrue As Boolean = (x = Nothing)
x.GetValueOrDefault(13)
' da x=Nothing returneres 13
y.GetValueOrDefault(17)
' da y<>Nothing returneres y.Value
isAlsoTrue As Boolean = y.HasValue
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
bool isAlsoTrue = y.HasValue;
int is13 = y.Value;
C#
oktober 2007
Overblik over udviklingen af .NET frameworket
10
Nullable typer
Syntaktisk sukker i C# og i VB (i VS2008)
Syntaktisk sukker
Svarende til
C#
int? z1;
System.Nullable<int> z;
C#
int? y1 = 17;
System.Nullable<int> y = 17;
C#
int? x1 = new int?(17);
System.Nullable<int> x =
new System.Nullable<int>(17);
C#
int y = z1 ?? 13;
y = x.GetValueOrDefault(13);
C#
int? z =
(int?) new double?(17.42);
System.Nullable<int> z =
(System.Nullable<int>) new
System.Nullable<double>(17.42);
VB
Dim z1 As Integer?
Dim z As System.Nullable(Of Integer)
VB
Dim y1 As Integer? = 17
Dim z As System.Nullable(Of Integer) = 17
VB
Dim x1 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 ReadOnly Property Egenskab() As String
Get
Public Class Klasse
Return _state
Public ReadOnly Property Egenskab() As String
End Get
Get
End Property
Return _state
End Get
Public Sub Metode1()
End Property
_state = "Skuddermudder"
End Sub
End Class
Partial Public Class Klasse
Private _state As String
Public Sub Metode2()
_state = "Skummelskud"
End Sub
End Class
Public Sub Metode1()
_state = "Skuddermudder"
End Sub
Private _state As String
Public Sub Metode2()
_state = "Skummelskud"
End Sub
End Class
Dim obj As New Klasse
obj.Metode1()
obj.Metode2()
MessageBox.Show(obj.Egenskab)
oktober 2007
Overblik over udviklingen af .NET frameworket
12
Partielle typer
public partial class Klasse
{
public void Metode1()
{
_state = "Skuddermudder";
}
public class Klasse
{
public void Metode1()
{
_state = "Skuddermudder";
}
public string Egenskab
{
get { return _state; }
}
public string Egenskab
{
get { return _state; }
}
C#
}
private string _state;
public partial class Klasse
{
private string _state;
public void Metode2()
{
_state = "Skummelskud";
}
}
oktober 2007
public void Metode2()
{
_state = "Skummelskud";
}
}
Klasse obj = new Klasse();
obj.Metode1();
obj.Metode2();
MessageBox.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 skalAdresse
det sendes hen?
Hvordan skal
det sendes?
Binding
Sikkerhed?
Encoding?
Transport?
WCF definerer en række standard bindings
BasicHttp, WsHttp, WsDualHttp, NetTcp, NetPeerTcp,
NetNamedPipes, NetMsmq, MsmqIntegration
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
Proxy
Service instans
Channel
oktober 2007
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
3D
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
XAML C#/VB
C#/VB
• XML definerer
workflow
• 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
oktober 2007
C#/VB kompiler
.NET assembly
definerer
workflow
Overblik over udviklingen af .NET frameworket
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.DateTime.Today;
C#
DateTime
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.DateTime.Today
VB
string
DateTime
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 b1 = New With {.Titel=".NET for hackere", .Pris = 17.42}
Dim b2 = New With {.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 = New With { p.Navn, p.Adresse }
Dim addressInfo2 = New With { .Navn = p.Navn, .Adresse = p.Adresse }
Dim addressInfo3 = New With { .Name = p.Navn, .Address = p.Adresse }
addressInfo2 = addressInfo1
addressInfo3 = addressInfo2
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 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;
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
EventHandlers, 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 MinDelegateType(int a, int b);
C#
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());
}
oktober 2007
Overblik over udviklingen af .NET frameworket
27
Lamba udtryk
Komprimerede anonyme metoder
private delegate int MinDelegateType(int a);
private void ShowResult(MinDelegateType del, int i)
{ MessageBox.Show(del(i).ToString()); }
MinDelegateType delCalc = delegate(int x) { return x + 42; };
ShowResult( delCalc, 17);
ShowResult( delegate(int x) { return x + 42; }, 18);
C#
C#
ShowResult( ((int x) => x + 42), 19); x er eksplicit typet
ShowResult( (x => x + 42), 20);
x er implicit typet
Dim delCalc As MyDelegateType = Function(x As Integer) x + 42
VB
ShowResult(delCalc, 17)
ShowResult(Function(x As Integer) x + 42, 18) x er eksplicit typet
ShowResult(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 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å
VB
Keywords der bruges som identifiers skal i [ ]
I VB angiver
System.Runtime.CompilerServices.Extensionattributten, at dette er en extension metode
Imports Orcas_Vb.SuperExtensions
Dim str As String = "Hej verden"
str.Show()
Orcas_Cs.SuperExtensions.UserInterface.Show("Hej statiske verden");
oktober 2007
Overblik over udviklingen af .NET frameworket
30
Extension metoder - eksempel
namespace Orcas_Cs.SuperExtensions
{
static class UserInterface
{
public static void Show(this string s)
{
System.Windows.Forms.MessageBox.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.SuperExtensions;
string str = "Hej verden";
str.Show();
Orcas_Cs.SuperExtensions.UserInterface.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.SqlClient.SqlCommand(sql, conn)
Dim adap As New System.Data.SqlClient.SqlDataAdapter(cmd)
VB
Dim tbl As New System.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
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
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
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 = ... })
VB
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") _
.OrderBy(Function(duck) duck.Age) _
.ThenBy(Function(duck) duck.Name) _
.Select(Function(duck) New With {duck.Age, duck.Name})
For Each duck In duckburgers
MessageBox.Show(duck.Name + "
" + duck.Age.ToString())
Next
Fleksible projektioner
Select New With {duck.Name, .Born = System.DateTime.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")
.OrderBy(duck => duck.Alder)
.ThenBy(duck => duck.Navn)
.Select(duck => new {duck.Alder, duck.Navn});
foreach (var duck in andeborgere) {
MessageBox.Show(duck.Name + " " + duck.Age);
}
Fleksible projektioner
select new { duck.Name, Born = System.DateTime.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 PubsDataClassesContext(_connectionString);
var titles = db.GetTable<titles>();
var titleQuery =
from theBook in db.titles
join rel in db.titleauthors on theBook.title_id equals rel.title_id
join theAuthor in db.authors on rel.au_id equals theAuthor.au_id
where theBook.price < 10
select new { theBook.title_id, theBook.title, theBook.price,
theAuthor.au_lname, theAuthor.au_fname };
txtData.Text = "";
IEnumerable<T>
foreach (var res in titleQuery)
{
txtData.Text +=
res.title_id + "\t" + res.title + "\t" + res.price.ToString() + "\t"
+ res.au_fname + "\t" + res.au_lname + "\r\n\r\n";
}
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