Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Februar 2005Sprog-nyheder i C# og VB1 Captator Tlf: 8620 4242 www.captator.dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark.

Lignende præsentationer


Præsentationer af emnet: "Februar 2005Sprog-nyheder i C# og VB1 Captator Tlf: 8620 4242 www.captator.dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark."— Præsentationens transcript:

1 februar 2005Sprog-nyheder i C# og VB1 Captator Tlf: 8620 4242 www.captator.dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark lykke@captator.dk Mobil: 2237 3311

2 februar 2005Sprog-nyheder i C# og VB2 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, IsNot, TryCast & XML kommentarer (VB) My oh my

3 februar 2005Sprog-nyheder i C# og VB3 Ikke-generiske metoder Ønske: At kunne tage maksimum af to værdier Mulig løsning: Kan lave specifikke funktioner Svært at lave en komplet og udtømmende løsning Public Shared Function Max(ByVal a As Long, ByVal b As Long) As Long '... End Sub Public Shared Function Max(ByVal a As String, ByVal b As String) As String '... End Sub Public Shared Function Max(ByVal a As Long, ByVal b As Long) As Long '... End Sub Public Shared Function Max(ByVal a As String, ByVal b As String) As String '... End Sub public long Max(long a, long b) { //... } public string Max(string a, string b) { //... } public long Max(long a, long b) { //... } public string Max(string a, string b) { //... } VB C#

4 februar 2005Sprog-nyheder i C# og VB4 Ikke-generiske metoder Eller en enkelt generel funktion Public Shared Function MaxObject(ByVal a As Object, _ ByVal b As Object) As Object If a > b Then Return a Else Return b End If End Sub Public Shared Function MaxObject(ByVal a As Object, _ ByVal b As Object) As Object If a > b Then Return a Else Return b End If End Sub public object MaxObject(object a, object b) { if (a > b) { return a; } else { return b; } public object MaxObject(object a, object b) { if (a > b) { return a; } else { return b; } Kan ikke kompileres, da System.Object ikke kan sammenlignes ved hjælp af > Kompileringsfejl   VB C# Vilkårligt valgt at a return b

5 februar 2005Sprog-nyheder i C# og VB5 Ikke-generiske metoder Kan sammenligne vha. IComparable Public Function MaxIComparable(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 Return b End If End Function Public Function MaxIComparable(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 Return b End If End Function public object MaxIComparable(System.IComparable a, System.IComparable b) { if (a.CompareTo(b) > 0) //Kan give en run-time fejl return a; else return b; } public object MaxIComparable(System.IComparable a, System.IComparable b) { if (a.CompareTo(b) > 0) //Kan give en run-time fejl return a; else return b; } VB C# Vil give en run-time fejl, ved kald med to forskellige typer - for eksempel et tal og en streng

6 februar 2005Sprog-nyheder i C# og VB6 Generiske metoder Definition af generisk metode Brug af generisk metode public T Max (T a, T b) where T : System.IComparable { if (a.CompareTo(b) > 0) return a; else return b; } public T Max (T a, T b) where T : System.IComparable { if (a.CompareTo(b) > 0) return a; else return b; } int i = 17; int j = 42; int k = Max (i, j); string s = "Alfa"; string t = "Omega”; string r = Max (s, t); int i = 17; int j = 42; int k = Max (i, j); string s = "Alfa"; string t = "Omega”; string r = Max (s, t); C#

7 februar 2005Sprog-nyheder i C# og VB7 Generiske metoder Definition af generisk metode Brug af generisk metode Public Function Max(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 Public Function Max(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 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) 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) VB

8 februar 2005Sprog-nyheder i C# og VB8 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

9 februar 2005Sprog-nyheder i C# og VB9 Generics - constraints Reducerer generaliteten men øger anvendeligheden Alle specificerede restriktioner på den generiske type skal være opfyldt public class MinType where T2 : IComparable, IFormattable, new() Public Class MinType(Of T1, T2 As {IComparable, IFormattable, New}) VB 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 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 C#

10 februar 2005Sprog-nyheder i C# og VB10 Hent koden på www.captator.dk (både VB og C#)www.captator.dk Generiske metoder C#

11 februar 2005Sprog-nyheder i C# og VB11 Hent koden på www.captator.dk (både VB og C#)www.captator.dk Generiske metoder VB

12 februar 2005Sprog-nyheder i C# og VB12 Generiske interfaces IComparable int CompareTo(object obj) IComparable int CompareTo(T other) IComparable int CompareTo(int other) IComparable Function CompareTo(obj As Object) As Integer IComparable(Of T) Function CompareTo(other As T) As Integer IComparable(Of Integer) Function CompareTo(other As Integer) As Integer VB C#

13 februar 2005Sprog-nyheder i C# og VB13 Collections - typeløse F.eks. ArrayList, HashTable, Queue, SortedList, Stack Generelle på bekostning af typecheck Eksplicitte typecasts ved brug => Usikker kode med dårlig performance Dim arr As New ArrayList, i As Integer arr.Add(17): arr.Add("Captator") : arr.Add(New Form1) i = CInt(arr(0)) i = CInt(arr(1)) i = CInt(arr(2)) Dim arr As New ArrayList, i As Integer arr.Add(17): arr.Add("Captator") : arr.Add(New Form1) i = CInt(arr(0)) i = CInt(arr(1)) i = CInt(arr(2)) } medfører System.InvalidCastException VB ArrayList arr = new ArrayList(), int i; arr.Add(17); arr.Add("Captator"); arr.Add(new Form1()) i = (int) arr(0); i = (int) arr(1); i = (int) arr(2); ArrayList arr = new ArrayList(), int i; arr.Add(17); arr.Add("Captator"); arr.Add(new Form1()) i = (int) arr(0); i = (int) arr(1); i = (int) arr(2); C# } medfører System.InvalidCastException

14 februar 2005Sprog-nyheder i C# og VB14 Collections - typestærke F.eks. BitArray, StringCollection, DataColumnCollection => Sikker kode men omfattende udvikling Public Class FormCollection Implements System.Collections.IEnumerable Public Sub Add(ByVal frm As System.Windows.Forms.Form) Default Public Property Item(ByVal index As Integer) As Forms.Form '... End Class Dim forms As New FormCollection, i As Integer, s As String forms.Add(17) : forms.Add("Captator") i = forms(0) : s = forms(1) Public Class FormCollection Implements System.Collections.IEnumerable Public Sub Add(ByVal frm As System.Windows.Forms.Form) Default Public Property Item(ByVal index As Integer) As Forms.Form '... End Class Dim forms As New FormCollection, i As Integer, s As String forms.Add(17) : forms.Add("Captator") i = forms(0) : s = forms(1) } medfører kompile-fejl public class FormCollection : System.Collections.IEnumerable { public void Add(System.Windows.Forms.Form frm) public Forms.Form this[int index] //... } FormCollection forms = New FormCollection(); int i; string s; forms.Add(17); forms.Add("Captator"); i = forms[0]; s = forms[1]; public class FormCollection : System.Collections.IEnumerable { public void Add(System.Windows.Forms.Form frm) public Forms.Form this[int index] //... } FormCollection forms = New FormCollection(); int i; string s; forms.Add(17); forms.Add("Captator"); i = forms[0]; s = forms[1]; VB C# } medfører kompile-fejl

15 februar 2005Sprog-nyheder i C# og VB15 Collections - generiske System.Collections.Generic Dictionary, LinkedList, List, Queue, SortedList, Stack IDictionary, IList, IEnumerator, ICollection, IComparer Typestærke og generelle Ingen eksplicitte typecasts ved brug => Type-sikker kode og stor mulighed for genbrug Dim col As New System.Collections.Generic.List(Of Integer) col.Add(17) col.Add(42) col.Add("Hello") Dim i As Integer = 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") Dim i As Integer = col(0) 'Der sker ingen typecast (boxing) } medfører kompile-fejl System.Collections.Generic.List col = new System.Collections.Generic.List (); col.Add(17); col.Add(42); col.Add("Hello"); int i = col[0]; //Der sker ingen typecast (boxing) System.Collections.Generic.List col = new System.Collections.Generic.List (); col.Add(17); col.Add(42); col.Add("Hello"); int i = col[0]; //Der sker ingen typecast (boxing) } medfører kompile-fejl VB C#

16 februar 2005Sprog-nyheder i C# og VB16 Collections – stacks Object int Object int Object int Object int Box int Push Uden generics Object int Unbox int Pop int Push Med generics int Pop

17 februar 2005Sprog-nyheder i C# og VB17 Generiske collections - PriorityQueue Hent koden på www.captator.dk (både VB og C#)www.captator.dk

18 februar 2005Sprog-nyheder i C# og VB18 Nullable typer Alle value typer kan gøres nullable ved anvendelse af System.Nullable / System.Nullable(Of T) Struktur der kombinerer T og en boolean Value – readonly property (value-type) HasValue - readonly property (boolean) 123 Int32 123 Nullable / Nullable(Of Int32) True ??? False Ikke null/Nothing null / Nothing Value HasValue Udefineret værdi

19 februar 2005Sprog-nyheder i C# og VB19 Nullable typer public struct Nullable where T: struct { private T value; private bool hasValue; public Nullable(T value) public T GetValueOrDefault(T defaultValue) public T Value { get {…} } public bool HasValue { get {…} } //... } public struct Nullable where T: struct { private T value; private bool hasValue; public Nullable(T value) public T GetValueOrDefault(T defaultValue) public T Value { get {…} } public bool HasValue { get {…} } //... } Public Structure Nullable(Of T As Structure) Private value As T Private hasValue As Boolean Public New(value As T) Public Function GetValueOrDefault(defaultValue As T) As T Public ReadOnly Property Value() As T Public ReadOnly Property HasValue() As Boolean '... End Structure Public Structure Nullable(Of T As Structure) Private value As T Private hasValue As Boolean Public New(value As T) Public Function GetValueOrDefault(defaultValue As T) As T Public ReadOnly Property Value() As T Public ReadOnly Property HasValue() As Boolean '... End Structure VB C#

20 februar 2005Sprog-nyheder i C# og VB20 Nullable typer System.Nullable x = new System.Nullable (17); System.Nullable y = 17; System.Nullable 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; System.Nullable x = new System.Nullable (17); System.Nullable y = 17; System.Nullable 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; Dim x As New System.Nullable(Of Integer)(17) Dim y As System.Nullable(Of Integer) = 17 Dim z As System.Nullable(Of Integer) ' 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 Dim isAlsoTrue As Boolean = y.HasValue Dim is13 As Integer = y.Value Dim x As New System.Nullable(Of Integer)(17) Dim y As System.Nullable(Of Integer) = 17 Dim z As System.Nullable(Of Integer) ' 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 Dim isAlsoTrue As Boolean = y.HasValue Dim is13 As Integer = y.Value VB C#

21 februar 2005Sprog-nyheder i C# og VB21 Nullable typer C# syntaktisk sukker Syntaktisk sukkerSvarende til int? z1;System.Nullable z; int? y1 = 17;System.Nullable y = 17; int? x1 = new int?(17);System.Nullable x = new System.Nullable (17); y = x ?? 13;y = x.GetValueOrDefault(13); int? z = (int?) new double?(17.42); System.Nullable z = (System.Nullable ) new System.Nullable (17.42); C#

22 februar 2005Sprog-nyheder i C# og VB22 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.Forms.Form, Windows.Forms.UserControl, Web.UI.Page, Web.UI.UserControl, System.Data.DataSet 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

23 februar 2005Sprog-nyheder i C# og VB23 Partielle typer public partial class Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } public partial class Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } public partial class Klasse { private string _state; public void Metode2() { _state = "Skummelskud"; } public partial class Klasse { private string _state; public void Metode2() { _state = "Skummelskud"; } public class Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } private string _state; public void Metode2() { _state = "Skummelskud"; } public class Klasse { public void Metode1() { _state = "Skuddermudder"; } public string Egenskab { get { return _state; } } private string _state; public void Metode2() { _state = "Skummelskud"; } Klasse obj = new Klasse(); obj.Metode1(); obj.Metode2(); MessageBox.Show(obj.Egenskab); Klasse obj = new Klasse(); obj.Metode1(); obj.Metode2(); MessageBox.Show(obj.Egenskab); C#

24 februar 2005Sprog-nyheder i C# og VB24 Partielle typer 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 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 Partial Public Class Klasse Private _state As String Public Sub Metode2() _state = "Skummelskud" End Sub End Class Partial Public Class Klasse Private _state As String Public Sub Metode2() _state = "Skummelskud" 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 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 Dim obj As New Klasse obj.Metode1() obj.Metode2() MessageBox.Show(obj.Egenskab) Dim obj As New Klasse obj.Metode1() obj.Metode2() MessageBox.Show(obj.Egenskab) VB

25 februar 2005Sprog-nyheder i C# og VB25 Delegate inferens private delegate int MinDelegateType(int a, int b); private int Addition(int a, int b) { return a + b; } private int Multiplikation(int a, int b) { return a * b; } private int Difference(int a, int b) { return a - b; } private int Division(int a, int b) { return a / b; } private int Beregn(MinDelegateType del) { return del(119, 7); } private delegate int MinDelegateType(int a, int b); private int Addition(int a, int b) { return a + b; } private int Multiplikation(int a, int b) { return a * b; } private int Difference(int a, int b) { return a - b; } private int Division(int a, int b) { return a / b; } private int Beregn(MinDelegateType del) { return del(119, 7); } C# MinDelegateType delCalc; delCalc = new MinDelegateType(Addition); MessageBox.Show("17 + 42 = " + delCalc(17, 42).ToString()); delCalc = (MinDelegateType) Multiplikation; MessageBox.Show("7 * 17 = " + delCalc(7, 17).ToString()); delCalc = Difference; MessageBox.Show("59 - 17 = " + delCalc(59, 17).ToString()); MessageBox.Show("119 / 7 = " + Beregn(Division).ToString()); MinDelegateType delCalc; delCalc = new MinDelegateType(Addition); MessageBox.Show("17 + 42 = " + delCalc(17, 42).ToString()); delCalc = (MinDelegateType) Multiplikation; MessageBox.Show("7 * 17 = " + delCalc(7, 17).ToString()); delCalc = Difference; MessageBox.Show("59 - 17 = " + delCalc(59, 17).ToString()); MessageBox.Show("119 / 7 = " + Beregn(Division).ToString()); VB har allerede delegate inferens i den nuværende version VS2003 syntaks

26 februar 2005Sprog-nyheder i C# og VB26 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 parameterliste skal være kompatibel med delegatetypen Kan ”capture” omkringliggende metodes variable Forlænget levetid af disse lokale variable Anonyme metoder (C#) delegate [(parameter-list)] { anonymous-method-block }

27 februar 2005Sprog-nyheder i C# og VB27 Anonyme metoder (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()); 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 delegate int MinDelegateType(int a, int b); 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()); } 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()); } C#

28 februar 2005Sprog-nyheder i C# og VB28 Iteratorer (C#) – enumerable collections foreach (int i in list) { GørNoget(i); } foreach (int i in list) { GørNoget(i); } Enumerator en = ((IEnumerable) list).GetEnumerator(); while (en.MoveNext()) { int i = (int) en.Current; GørNoget(i); } Enumerator en = ((IEnumerable) list).GetEnumerator(); while (en.MoveNext()) { int i = (int) en.Current; GørNoget(i); } Implementeres som... private class MinEnumerator : IEnumerator { private int _index = -1; private MinListe _list; MinEnumerator(MinListe list) { _list = list } object IEnumerator.Current { get { /*…*/ } } bool IEnumerator.MoveNext() { /*…*/ } // … } private class MinEnumerator : IEnumerator { private int _index = -1; private MinListe _list; MinEnumerator(MinListe list) { _list = list } object IEnumerator.Current { get { /*…*/ } } bool IEnumerator.MoveNext() { /*…*/ } // … } Hvor enumeratoren kan være implementeret á la... C#

29 februar 2005Sprog-nyheder i C# og VB29 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 IEnumerator IEnumerable.GetEnumerator() { yield return 17; yield return 42; } IEnumerator IEnumerable.GetEnumerator() { yield return 17; yield return 42; } IEnumerator IEnumerable.GetEnumerator() { for (int n = 0; n < _list.Length; n++) { yield return _list[n]; } IEnumerator IEnumerable.GetEnumerator() { for (int n = 0; n < _list.Length; n++) { yield return _list[n]; } Eksempel fra implementationen af en collection type C#

30 februar 2005Sprog-nyheder i C# og VB30 Iteratorer (C#) opremser1.GetEnumerator-metoden returnerer en instans af en compiler-genereret enumerator-klasse class MinUnderligeCollection { public IEnumerable HitMedDem(int fra, int til) { for (int n = fra; n <= til; n++) { yield return n; } } class MinUnderligeCollection { public IEnumerable HitMedDem(int fra, int til) { for (int n = fra; n <= til; n++) { yield return n; } } MinUnderligeCollection col = new MinUnderligeCollection(); IEnumerable opremser1 = col.HitMedDem(1, 3); IEnumerable opremser2 = col.HitMedDem(6, 8); foreach (int i in opremser1) { foreach (int j in opremser2) { /*…*/ } } MinUnderligeCollection col = new MinUnderligeCollection(); IEnumerable opremser1 = col.HitMedDem(1, 3); IEnumerable opremser2 = col.HitMedDem(6, 8); foreach (int i in opremser1) { foreach (int j in opremser2) { /*…*/ } } Hver iterator har sin egen state HitMedDem eksekveres ikke umiddelbart, men et enumerable objekt returneres C#

31 februar 2005Sprog-nyheder i C# og VB31 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(ByVal Value As Integer) _coolness = Value End Set End Property Private _coolness As Integer Public Property Coolness() As Integer Get Return _coolness End Get Friend Set(ByVal Value As Integer) _coolness = Value End Set End Property private int _coolness; public int Coolness { get { return _coolness; } internal set { _coolness = value; } private int _coolness; public int Coolness { get { return _coolness; } internal set { _coolness = value; } VB C#

32 februar 2005Sprog-nyheder i C# og VB32 Statiske klasser (C#) Library klasser defineres typisk med Sealed (C#) / NotInheritable (VB) Privat default konstruktør, ingen public konstruktører Kan kun indeholde statiske members Kan ikke nedarve eller implementere interfaces Kan ikke bruges som type for variable,... Eksempler: System.Console, System.Environment static class StatiskKlasse { public static int Svaret(string spørgsmål) { return 42; } static class StatiskKlasse { public static int Svaret(string spørgsmål) { return 42; } Minder meget om VBs Modules C#

33 februar 2005Sprog-nyheder i C# og VB33 Global Gør det muligt at referere elementer, som er ”holdt ude” af namespace-scope Især interessant ved kodegenerering VBC#

34 februar 2005Sprog-nyheder i C# og VB34 De manglende value typer i VB VB keyword C# keyword CLR type Størrelse Boolean bool System.Boolean 1 bit true eller false sbyte System.SByte 8 bit -128 til 127 Byte byte System.Byte 8 bit 0 til 255 Char char System.Char 16 bits (Unicode) Short short System.Int16 16 bits -32.768 til 32.767 ushort System.UInt16 16 bits 0 til 65.535 Integer int System.Int32 32 bits -2.147.483.648 til 2.147.483.647 uint System.UInt32 32 bits 0 til 4.294.967.295 Long long System.Int64 64 bits -9.223.372.036.854.775.808 til 9.223.372.036.854.775.807 ulong System.UInt64 64 bits 0 til 18.446.744.073.709.551.615 Single float System.Single 32 bits 1,5E-45 til 3,4E38 med 7 cifre Double double System.Double 64 bits 5,0E-324 til 1,7E308 med 15-16 cifre Decimal decimal System.Decimal 128 bits 1,0E-28 til 7,9E28 28-29 betydende cifre UInteger ULong UShort SByte

35 februar 2005Sprog-nyheder i C# og VB35 Using statement Garanterer disposing af ressourcer ved exit af using-blokken Svarer til en Try…Finally med kald af Dispose i Finally-blokken Using fs As New System.IO.FileStream(path, FileMode.Append) For i As Integer = 0 To fs.Length fs.ReadByte() Next End Using Using fs As New System.IO.FileStream(path, FileMode.Append) For i As Integer = 0 To fs.Length fs.ReadByte() Next End Using Using findes allerede i C# VB

36 februar 2005Sprog-nyheder i C# og VB36 Continue statement Hop til næste iteration af den specificerede løkke Syntaks: Dim j As Integer 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 Dim j As Integer 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 Continue { Do | For | While } Continue findes allerede i C# VB

37 februar 2005Sprog-nyheder i C# og VB37 Eksplicitte array bounds VB6 VB.NET (VS2002 & VS2003) VB.NET (VS2005) Meeen – arrays er stadig kun nul-baserede Dim arr(10) As Integer 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 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 Dim arr(0 To 10) As Integer VB

38 februar 2005Sprog-nyheder i C# og VB38 IsNot, TryCast & XML kommentarer IsNot operator TryCast XML kommentarer ''' ''' Funktion der kan give det endegyldige svar på vilkårlige spørgsmål. ''' ''' Vilkårligt spørgsmål. ''' Det endegyldige svar. Public Shared Function Svaret(ByVal spørgsmål As String) As Integer Return 42 End Function ''' ''' Funktion der kan give det endegyldige svar på vilkårlige spørgsmål. ''' ''' Vilkårligt spørgsmål. ''' Det endegyldige svar. Public Shared Function Svaret(ByVal spørgsmål As String) As Integer Return 42 End Function XML kommentarer findes allerede i C# If Not obj1 Is obj2 Then End If If Not obj1 Is obj2 Then End If If obj1 IsNot obj2 Then End If If obj1 IsNot obj2 Then End If Svarer til != i C# Dim per1 As Person per1 = TryCast(obj, Person) Dim per1 As Person per1 = TryCast(obj, Person) Dim per As Person If TypeOf per Is Person Then per = CType(obj, Person) Else per = Nothing End If Dim per As Person If TypeOf per Is Person Then per = CType(obj, Person) Else per = Nothing End If VB Svarer til as i C#

39 februar 2005Sprog-nyheder i C# og VB39 Hvad er der galt med denne kode? Der er intet galt med koden... men den forudsætter operator overloading (i dette tilfælde af implicit og eksplicit typekonvertering) Unære operatorer +, -, IsFalse, IsTrue, Not Binære operatorer +, -, *, /, \, &, ^, >>,, >, >=, <, <=, And, Like, Mod, Or, Xor CType: Widening eller Narrowing Dim f1, f2 As FaultyString f1 = "Captator" f2 = " - de danske.NET eksperter" Dim s As String s = CStr(f1 + f2) Dim f1, f2 As FaultyString f1 = "Captator" f2 = " - de danske.NET eksperter" Dim s As String s = CStr(f1 + f2) VB Operatoroverloading findes allerede i C# Operatoroverloading findes allerede i C#

40 februar 2005Sprog-nyheder i C# og VB40 Operator overloading Public Structure Rational Public Num As Integer Public Denum As Integer 'Og en masse yderligere kode... Public Overrides Function ToString() As String If Denum = 1 Then Return Num.ToString() _ Else Return Num.ToString() + "/" + Denum.ToString() End If End Function Public Shared Operator +(ByVal r1 As Rational, ByVal r2 As Rational) As Rational Return New Rational(r1.Num * r2.Denum + r2.Num * r1.Denum, r1.Denum * r2.Denum) End Operator Public Shared Operator -(ByVal r1 As Rational, ByVal r2 As Rational) As Rational Return New Rational(r1.Num * r2.Denum - r2.Num * r1.Denum, r1.Denum * r2.Denum) End Operator Public Overrides Function Equals(ByVal 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 =(ByVal r1 As Rational, ByVal r2 As Rational) As Boolean Return r1.Equals(r2) End Operator End Structure Public Structure Rational Public Num As Integer Public Denum As Integer 'Og en masse yderligere kode... Public Overrides Function ToString() As String If Denum = 1 Then Return Num.ToString() _ Else Return Num.ToString() + "/" + Denum.ToString() End If End Function Public Shared Operator +(ByVal r1 As Rational, ByVal r2 As Rational) As Rational Return New Rational(r1.Num * r2.Denum + r2.Num * r1.Denum, r1.Denum * r2.Denum) End Operator Public Shared Operator -(ByVal r1 As Rational, ByVal r2 As Rational) As Rational Return New Rational(r1.Num * r2.Denum - r2.Num * r1.Denum, r1.Denum * r2.Denum) End Operator Public Overrides Function Equals(ByVal 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 =(ByVal r1 As Rational, ByVal r2 As Rational) As Boolean Return r1.Equals(r2) End Operator End Structure VB

41 februar 2005Sprog-nyheder i C# og VB41 My object hierarkiet (VB) My Application Computer User DataSources Forms WebServices — Applikationstitel, version, description, … — Registry, Printer, Audio, FileSystem, Mail, … — User name, group, domain, … — Samling af datasources i projektet — Samling af forme i projektet — Samling af web services refereret i projektet My.Application.Version.ToString() 'Svarende til... System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() My.Application.Version.ToString() 'Svarende til... System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() VB

42 februar 2005Sprog-nyheder i C# og VB42 Spørgsmål www.captator.dk www.captator.dk nyheder, artikler, information,...


Download ppt "Februar 2005Sprog-nyheder i C# og VB1 Captator Tlf: 8620 4242 www.captator.dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark."

Lignende præsentationer


Annoncer fra Google