fd19f85b07cf799e14d5d0a4206c236f.ppt
- Количество слайдов: 42
Sprog-nyheder i C# og VB Captator Tlf: 8620 4242 www. captator. dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark lykke@captator. dk Mobil: 2237 3311 februar 2005 Sprog-nyheder i C# og VB 1
Agenda Generics Generiske metoder Generiske collections Nullable typer Partielle typer Delegate inferens (C#) Anonyme metoder (C#) Iteratorer (C#) Access modifiers for properties Statiske klasser (C#) Globalt namespace scope Value typer (VB) Using Operator overloading (VB) Continue, eksplicitte array bounds, Is. Not, Try. Cast & XML kommentarer (VB) My oh my februar 2005 Sprog-nyheder i C# og VB 2
Ikke-generiske metoder Ønske: At kunne tage maksimum af to værdier Mulig løsning: Kan lave specifikke funktioner public long Max(long a, long b) { //. . . } C# public string Max(string a, string b) { //. . . } Public Shared Function Max(By. Val a As Long, By. Val b As Long) As Long '. . . End Sub VB Public Shared Function Max(By. Val a As String, By. Val b As String) As String '. . . End Sub Svært at lave en komplet og udtømmende løsning februar 2005 Sprog-nyheder i C# og VB 3
Ikke-generiske metoder Eller en enkelt generel funktion public object Max. Object(object a, object b) { if (a > b) Kompileringsfejl { return a; } else { Kan ikke kompileres, da System. Object return b; ikke kan sammenlignes ved hjælp af > } } û Public Shared Function Max. Object(By. Val a As Object, _ By. Val b As Object) As Object If a > b Then Kompileringsfejl Return a Else Return b End If Vilkårligt valgt at a<=b => return b End Sub û februar 2005 Sprog-nyheder i C# og VB C# VB 4
Ikke-generiske metoder Kan sammenligne vha. IComparable public object Max. IComparable(System. IComparable a, System. IComparable b) { if (a. Compare. To(b) > 0) //Kan give en run-time fejl return a; else return b; } Public Function Max. IComparable(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 Return b End If Vil give en run-time fejl, End Function C# VB ved kald med to forskellige typer - for eksempel et tal og en streng februar 2005 Sprog-nyheder i C# og VB 5
Generiske metoder Definition af generisk metode public T Max<T>(T a, T b) where T : System. IComparable<T> { if (a. Compare. To(b) > 0) return a; else return b; } C# Brug af generisk metode int i = 17; int j = 42; int k = Max<int>(i, j); string s = "Alfa"; string t = "Omega”; string r = Max<string>(s, t); februar 2005 Sprog-nyheder i C# og VB 6
Generiske metoder Definition af generisk metode Public Function Max(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 VB Brug af generisk metode Dim i As Integer = 17 Dim j As Integer = 42 Dim k As Integer = Max(Of Integer)(i, j) Dim s As String = "Alfa" Dim t As String = "Omega" Dim r As String = Max(Of String)(s, t) februar 2005 Sprog-nyheder i C# og VB 7
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 februar 2005 Sprog-nyheder i C# og VB 8
Generics - constraints Reducerer generaliteten men øger anvendeligheden Alle specificerede restriktioner på den generiske type skal være opfyldt En klasse ØTypen skal være nedarvet fra klassen Keywordet “Class” ØTypen skal være en reference type Keywordet “Structure/struct” ØTypen skal være en value type Et interface ØTypen skal implementere interfacet Keywordet “New” ØTypen skal have en public default konstruktør public class Min. Type<T 1, T 2> where T 2 : IComparable, IFormattable, new() Public Class Min. Type(Of T 1, T 2 As {IComparable, IFormattable, New}) februar 2005 Sprog-nyheder i C# og VB C# VB 9
Generiske metoder C# Hent koden på www. captator. dk (både VB og C#) februar 2005 Sprog-nyheder i C# og VB 10
Generiske metoder VB Hent koden på www. captator. dk (både VB og C#) februar 2005 Sprog-nyheder i C# og VB 11
Generiske interfaces IComparable int Compare. To(object obj) C# IComparable<T> int Compare. To(T other) IComparable<int> int Compare. To(int other) IComparable Function Compare. To(obj As Object) As Integer IComparable(Of T) Function Compare. To(other As T) As Integer IComparable(Of Integer) Function Compare. To(other As Integer) As Integer februar 2005 Sprog-nyheder i C# og VB VB 12
Collections - typeløse F. eks. Array. List, Hash. Table, Queue, Sorted. List, Stack Array. List arr = new Array. List(), int i; arr. Add(17); arr. Add("Captator"); arr. Add(new Form 1()) i = (int) arr(0); i = (int) arr(1); medfører System. Invalid. Cast. Exception i = (int) arr(2); } Dim arr As New Array. List, i As Integer arr. Add(17): arr. Add("Captator") : arr. Add(New Form 1) i = CInt(arr(0)) i = CInt(arr(1)) medfører System. Invalid. Cast. Exception i = CInt(arr(2)) } C# VB Generelle på bekostning af typecheck Eksplicitte typecasts ved brug => Usikker kode med dårlig performance februar 2005 Sprog-nyheder i C# og VB 13
Collections - typestærke F. eks. Bit. Array, String. Collection, Data. Column. Collection public class Form. Collection : System. Collections. IEnumerable { public void Add(System. Windows. Form frm) public Forms. Form this[int index] //. . . } Form. Collection forms = New Form. Collection(); int i; string s; forms. Add(17); forms. Add("Captator"); medfører kompile-fejl i = forms[0]; s = forms[1]; } C# Public Class Form. Collection Implements System. Collections. IEnumerable Public Sub Add(By. Val frm As System. Windows. Form) Default Public Property Item(By. Val index As Integer) As Forms. Form '. . . End Class Dim forms As New Form. Collection, i As Integer, s As String forms. Add(17) : forms. Add("Captator") medfører kompile-fejl i = forms(0) : s = forms(1) } VB => Sikker kode men omfattende udvikling februar 2005 Sprog-nyheder i C# og VB 14
Collections - generiske System. Collections. Generic Dictionary, Linked. List, Queue, Sorted. List, Stack IDictionary, IList, IEnumerator, ICollection, IComparer System. Collections. Generic. List<int> col = new System. Collections. Generic. List<int>(); col. Add(17); col. Add(42); col. Add("Hello"); medfører kompile-fejl C# } int i = col[0]; //Der sker ingen typecast (boxing) Dim col As New System. Collections. Generic. List(Of Integer) col. Add(17) col. Add(42) col. Add("Hello") medfører kompile-fejl } Dim i As Integer = col(0) VB 'Der sker ingen typecast (boxing) Typestærke og generelle Ingen eksplicitte typecasts ved brug => Type-sikker kode og stor mulighed for genbrug februar 2005 Sprog-nyheder i C# og VB 15
Collections – stacks Object int Uden generics Med generics int Object int Box Object int Unbox int Push Pop int Push int Pop februar 2005 Sprog-nyheder i C# og VB 16
Generiske collections - Priority. Queue Hent koden på www. captator. dk (både VB og C#) februar 2005 Sprog-nyheder i C# og VB 17
Nullable typer Alle value typer kan gøres nullable ved anvendelse af System. Nullable<T> / System. Nullable(Of T) Struktur der kombinerer T og en boolean Value – readonly property (value-type) Has. Value - readonly property (boolean) Int 32 123 Nullable<Int 32> / Nullable(Of Int 32) Value Has. Value februar 2005 123 ? ? ? False True Ikke null / Nothing null/Nothing Sprog-nyheder i C# og VB Udefineret værdi 18
Nullable typer public struct Nullable<T> where T: struct { private T value; private bool has. Value; public //. . . C# Nullable(T value) T Get. Value. Or. Default(T default. Value) T Value { get {…} } bool Has. Value { get {…} } } Public Structure Nullable(Of T As Structure) Private value As T Private has. Value As Boolean VB Public New(value As T) Public Function Get. Value. Or. Default(default. Value As T) As T Public Read. Only Property Value() As T Public Read. Only Property Has. Value() As Boolean '. . . End Structure februar 2005 Sprog-nyheder i C# og VB 19
Nullable typer 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); y = y. Get. Value. Or. Default(17); C# // da x == null returneres 13 // da y != null returneres y. Value bool is. Also. True = y. Has. Value; int is 13 = y. Value; Dim Dim x = 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) y = x. Get. Value. Or. Default(13) y = y. Get. Value. Or. Default(17) VB ' da x=Nothing returneres 13 ' da y<>Nothing returneres y. Value Dim is. Also. True As Boolean = y. Has. Value Dim is 13 As Integer = y. Value februar 2005 Sprog-nyheder i C# og VB 20
Nullable typer C# syntaktisk sukker C# Syntaktisk sukker Svarende til int? z 1; System. Nullable<int> z; int? y 1 = 17; System. Nullable<int> y = 17; int? x 1 = new int? (17); System. Nullable<int> x = new System. Nullable<int>(17); y = x ? ? 13; y = x. Get. Value. Or. Default(13); int? z = (int? ) new double? (17. 42); System. Nullable<int> z = (System. Nullable<int>) new System. Nullable<double>(17. 42); februar 2005 Sprog-nyheder i C# og VB 21
Partielle typer Typer kan deles over flere filer VB: Klasser, structures C#: Klasser, structs, interfaces Bruges typisk i forbindelse med kodegenerering “Skjuler” det genererede Muliggør regenerering uden overskrivning af tilføjelser Windows. Form, Windows. Forms. User. Control, Web. UI. Page, Web. UI. User. Control, System. Data. Set Angives med type-modifieren partial Opdelinger i partielle typer har ingen run-time betydning Members, interfaces og attributter kombineres Visibilitet og basis klasse skal stemme overens Intellisense betragter den samlede type februar 2005 Sprog-nyheder i C# og VB 22
Partielle typer public partial class Klasse { public void Metode 1() { _state = "Skuddermudder"; } C# public class Klasse { public void Metode 1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } } private string _state; public partial class Klasse { private string _state; public void Metode 2() { _state = "Skummelskud"; } } Klasse obj = new Klasse(); obj. Metode 1(); obj. Metode 2(); Message. Box. Show(obj. Egenskab); februar 2005 Sprog-nyheder i C# og VB 23
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) februar 2005 Sprog-nyheder i C# og VB 24
Delegate inferens private delegate int Min. Delegate. Type(int a, int b); private private int int int C# Addition(int a, int b) { return a + b; } Multiplikation(int a, int b) { return a * b; } Difference(int a, int b) { return a - b; } Division(int a, int b) { return a / b; } Beregn(Min. Delegate. Type del) { return del(119, 7); } Min. Delegate. Type del. Calc; VS 2003 syntaks del. Calc = new Min. Delegate. Type(Addition); Message. Box. Show("17 + 42 = " + del. Calc(17, 42). To. String()); del. Calc = (Min. Delegate. Type) Multiplikation; Message. Box. Show("7 * 17 = " + del. Calc(7, 17). To. String()); del. Calc = Difference; Message. Box. Show("59 - 17 = " + del. Calc(59, 17). To. String()); Message. Box. Show("119 / 7 = " + Beregn(Division). To. String()); februar 2005 Sprog-nyheder i C# og VB VB har allerede delegate inferens i den nuværende version 25
Anonyme metoder (C#) Delegates kan erstattes med inline kodeblokke 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 februar 2005 Sprog-nyheder i C# og VB 26
Anonyme metoder (C#) private delegate int Min. Delegate. Type(int a, int b); Min. Delegate. Type del. Calc; C# 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()); } februar 2005 Sprog-nyheder i C# og VB 27
Iteratorer (C#) – enumerable collections foreach (int i in list) { Gør. Noget(i); } Enumerator en = ((IEnumerable) list). Get. Enumerator(); while (en. Move. Next()) { int i = (int) en. Current; Gør. Noget(i); } private class Min. Enumerator : IEnumerator { private int _index = -1; private Min. Liste _list; Min. Enumerator(Min. Liste list) { _list = list } C# Implementeres som. . . Hvor enumeratoren kan være implementeret á la. . . object IEnumerator. Current { get { /*…*/ } } bool IEnumerator. Move. Next() { /*…*/ } // … } februar 2005 Sprog-nyheder i C# og VB 28
Iteratorer (C#) En iterator blok Indeholder en eller flere yields yield return leverer den næste værdi yield break afslutter itereringen Kan udgøre en metode, der returnerer IEnumerable eller IEnumerator IEnumerable. Get. Enumerator() { for (int n = 0; n < _list. Length; n++) { yield return _list[n]; } } IEnumerator IEnumerable. Get. Enumerator() { yield return 17; yield return 42; } februar 2005 Sprog-nyheder i C# og VB Eksempel fra implementationen af en collection type C# 29
Iteratorer (C#) C# class Min. Underlige. Collection { public IEnumerable Hit. Med. Dem(int fra, int til) { for (int n = fra; n <= til; n++) { yield return n; } } Hit. Med. Dem eksekveres ikke umiddelbart, } men et enumerable objekt returneres Min. Underlige. Collection col = new Min. Underlige. Collection(); IEnumerable opremser 1 = col. Hit. Med. Dem(1, 3); IEnumerable opremser 2 = col. Hit. Med. Dem(6, 8); foreach (int i in opremser 1) { foreach (int j in opremser 2) { /*…*/ } } Hver iterator har sin egen state opremser 1. Get. Enumerator-metoden returnerer en instans af en compiler-genereret enumerator-klasse februar 2005 Sprog-nyheder i C# og VB 30
Access modifiers for properties En property kan have (max) én access modifier Enten get- eller set-delen kan have en mere begrænset access modifier Private _coolness As Integer Public Property Coolness() As Integer Get Return _coolness End Get Friend Set(By. Value As Integer) _coolness = Value End Set End Property februar 2005 Sprog-nyheder i C# og VB VB private int _coolness; C# public int Coolness { get { return _coolness; } internal set { _coolness = value; } } 31
Statiske klasser (C#) Library klasser defineres typisk med Sealed (C#) / Not. Inheritable (VB) Privat default konstruktør, ingen public konstruktører static class Statisk. Klasse { public static int Svaret(string spørgsmål) { return 42; Minder meget om VBs Modules } } C# Kan kun indeholde statiske members Kan ikke nedarve eller implementere interfaces Kan ikke bruges som type for variable, . . . Eksempler: System. Console, System. Environment februar 2005 Sprog-nyheder i C# og VB 32
Global Gør det muligt at referere elementer, som er ”holdt ude” af namespace-scope Især interessant ved kodegenerering VB februar 2005 Sprog-nyheder i C# og VB C# 33
De manglende value typer i VB VB keyword C# keyword CLR type Størrelse Boolean bool System. Boolean 1 bit true eller false SByte sbyte System. SByte System. Byte 8 bit -128 til 127 0 til 255 Char char System. Char 16 bits (Unicode) Short UShort Integer UInteger Long short ushort int uint long System. Int 16 System. UInt 16 System. Int 32 System. UInt 32 System. Int 64 16 16 32 32 64 ULong ulong System. UInt 64 64 bits -32. 768 til 32. 767 0 til 65. 535 -2. 147. 483. 648 til 2. 147. 483. 647 0 til 4. 294. 967. 295 -9. 223. 372. 036. 854. 775. 808 til 9. 223. 372. 036. 854. 775. 807 0 til 18. 446. 744. 073. 709. 551. 615 Single Double float double System. Single System. Double 32 bits 64 bits 1, 5 E-45 til 3, 4 E 38 med 7 cifre 5, 0 E-324 til 1, 7 E 308 med 15 -16 cifre Decimal decimal System. Decimal 128 bits 1, 0 E-28 til 7, 9 E 28 28 -29 betydende cifre februar 2005 Sprog-nyheder i C# og VB bits bits 34
Using statement Garanterer disposing af ressourcer ved exit af using -blokken Using fs As New System. IO. File. Stream(path, File. Mode. Append) For i As Integer = 0 To fs. Length fs. Read. Byte() Next VB End Using Svarer til en Try…Finally med kald af Dispose i Finally-blokken Using findes allerede i C# februar 2005 Sprog-nyheder i C# og VB 35
Continue statement Hop til næste iteration af den specificerede løkke Syntaks: Continue { Do | For | While } Dim j As Integer VB For i As Integer = 1 To 17 j = 0 Do While j < 117 j += 1 If i + j = 17 Then Continue Do End If If i + j = 42 Then Continue For End If Loop Next februar 2005 Sprog-nyheder i C# og VB Continue findes allerede i C# 36
Eksplicitte array bounds VB 6 Dim arr(42) As Integer Dim arr(0 To 42) As Integer Dim arr(1 To 17) As Integer Dim arr(-42 To -17) As Integer VB. NET (VS 2002 & VS 2003) Dim arr(10) As Integer VB. NET (VS 2005) Dim arr(0 To 10) As Integer VB VB Meeen – arrays er stadig kun nul-baserede februar 2005 Sprog-nyheder i C# og VB 37
Is. Not, Try. Cast & XML kommentarer VB Is. Not operator If obj 1 Is. Not obj 2 Then If Not obj 1 Is obj 2 Then End If Svarer til != i C# Try. Cast Dim per As Person Dim per 1 As Person per 1 = Try. Cast(obj, Person) Svarer til as i C# XML kommentarer If Type. Of per Is Person Then per = CType(obj, Person) Else per = Nothing End If ''' <summary> ''' Funktion der kan give det endegyldige svar på vilkårlige spørgsmål. ''' </summary> ''' <param name="spørgsmål">Vilkårligt spørgsmål. </param> ''' <returns>Det endegyldige svar. </returns> Public Shared Function Svaret(By. Val spørgsmål As String) As Integer Return 42 End Function XML kommentarer findes allerede i C# februar 2005 Sprog-nyheder i C# og VB 38
Hvad er der galt med denne kode? Dim f 1, f 2 As Faulty. String VB f 1 = "Captator" f 2 = " - de danske. NET eksperter" Dim s As String s = CStr(f 1 + f 2) Der er intet galt med koden. . . men den forudsætter operator overloading (i dette tilfælde af implicit og eksplicit typekonvertering) Unære operatorer +, -, Is. False, Is. True, Not Binære operatorer +, -, *, /, , &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor Operatoroverloading findes allerede i C# CType: Widening eller Narrowing februar 2005 Sprog-nyheder i C# og VB 39
Operator overloading Public Structure Rational Public Num As Integer Public Denum As Integer 'Og en masse yderligere kode. . . Public Overrides Function To. String() As String If Denum = 1 Then Return Num. To. String() _ Else Return Num. To. String() + "/" + Denum. To. String() End If End Function VB Public Shared Operator +(By. Val r 1 As Rational, By. Val r 2 As Rational) As Rational Return New Rational(r 1. Num * r 2. Denum + r 2. Num * r 1. Denum, r 1. Denum * r 2. Denum) End Operator Public Shared Operator -(By. Val r 1 As Rational, By. Val r 2 As Rational) As Rational Return New Rational(r 1. Num * r 2. Denum - r 2. Num * r 1. Denum, r 1. Denum * r 2. Denum) End Operator Public Overrides Function Equals(By. Val obj As Object) As Boolean Dim r As Rational = CType(obj, Rational) Return Num = r. Num And Denum = r. Denum End Function Public Shared Operator =(By. Val r 1 As Rational, By. Val r 2 As Rational) As Boolean Return r 1. Equals(r 2) End Operator End Structure februar 2005 Sprog-nyheder i C# og VB 40
My object hierarkiet (VB) My Application — Applikationstitel, version, description, … Computer — Registry, Printer, Audio, File. System, Mail, … User — User name, group, domain, … Data. Sources — Samling af datasources i projektet Forms — Samling af forme i projektet Web. Services — Samling af web services refereret i projektet VB My. Application. Version. To. String() 'Svarende til. . . System. Reflection. Assembly. Get. Executing. Assembly(). Get. Name(). Version. To. String() februar 2005 Sprog-nyheder i C# og VB 41
Spørgsmål www. captator. dk nyheder, artikler, information, . . . februar 2005 Sprog-nyheder i C# og VB 42
fd19f85b07cf799e14d5d0a4206c236f.ppt