240 likes | 395 Views
Microsoft .NET Framework 2.0. Novosti v sintaksi C#. Miha Markič, MVP C# RIGHT HAND . net svetovanje in razvoj www.rthand.com , miha@rthand.com. Agenda. Generiki “Nullable types” Iteratorji Popravi in nadaljuj Anonimne metode Druge izboljšave. Okvirjanje/Razokvirjanje. Boxing/Unboxing
E N D
Microsoft .NET Framework 2.0 Novosti v sintaksi C# Miha Markič, MVP C#RIGHTHAND .net svetovanje in razvoj www.rthand.com, miha@rthand.com
Agenda • Generiki • “Nullable types” • Iteratorji • Popravi in nadaljuj • Anonimne metode • Druge izboljšave
Okvirjanje/Razokvirjanje • Boxing/Unboxing • Skoraj vse je objekt • Izjema so vrednostni tipi • Optimizacija • Prehod iz spremenljivke v objekt je okvirjanje • Obraten prehod je razokvirjanje
i 100 int i = 100; i (okvirjen) o int 100 object o = i; Okvirjanje • Kako deluje Sklad Kopica Počasno.
Okvirjanje • Oba procesa sta počasna • Izogibajte se jih, če se da • Hkrati pa, vedno naletimo na njih • Primer: zbirke • ArrayList al = new ArrayList(); • al.Add(4); • al.Add(6);
Generiki • Niso tista zdravila, vendar so vseeno zdravila • Efikasnost • Zmanjšajo potrebno okvirjanje/razokviranje • Zmanjšan nered kode (tipizirane zbirke) • Manjše število napak (type safety)
Generiki • Kako delujejo? • Popolna integracija v CLR • Vrednostni generični tipi se generirajo v času izvajanja, ne prevajanja • Vrednostni generični tipi generirajo različno procesorsko kodo za različne vrednostne tipe • List<int> • List<long> • Referenčni generični tipi delijo kodo • Interna reprezentacija je enaka, referenca je konstantno dolga
Generiki • Tipski parametri se lahko pripišejo • Razredom, strukturam, vmesnikom in delegatom class Dictionary<K,V> {…} struct HashBucket<K,V> {…} interface IComparer<T> {…} delegate R Function<A,R>(A arg); Dictionary<string,Customer> customerLookupTable; Dictionary<string,List<Order>> orderLookupTable; Dictionary<string,int> wordCount;
Generiki • Tipski parametri se lahko pripišejo • Metodam class Utils{ public static T[] CreateArray<T>(int size) { return new T[size]; } public static void SortArray<T>(T[] array) { … } } string[] names = Utils.CreateArray<string>(3); names[0] = "Jones"; names[1] = "Anderson"; names[2] = "Williams"; Utils.SortArray(names);
Generiki • Tipski parametri imajo lahko omejitve • Preprečimo uporabo “nezaželenih” tipov • where T: • struct • class • new() • razred • vmesnik class Dictionary<K,V>: IDictionary<K,V> where K: IComparable<K> where V: IKeyProvider<K>, new() {… }
Generiki • Kako ločiti tipske parametre na vrednostne in referenčne in kako jim prepisati privzeto vrednost • default • Vrne 0 za vrednostne tipe • Vrne null za referenčne tipe • Vrne strukturo, s spremenljivkami po zgornjem principu za strukturo class Tubo<T> { public Tubo() { T data = default(T); if (default(T) == null) // referenčni tip else // vrednostni tip } … }
Generiki List<T> Dictionary<K,V> SortedDictionary<K,V> Stack<T> Queue<T> • Razredi zbirk • Vmesniki zbirk • Osnovni razredi zbirk • Podporni razredi IList<T> IDictionary<K,V> ICollection<T> IEnumerable<T> IEnumerator<T> IComparable<T> IComparer<T> Collection<T> KeyedCollection<T> ReadOnlyCollection<T> Nullable<T> EventHandler<T> Comparer<T>
Nullable types • Končno – vrednostni tip ima sedaj lahko nedefinirano vrednost • Še posebej koristno za sodelovanje z podatkovno bazo • Primer
Nullable types • Definiramo z Nullable<T> ali pa T? (okrajšava) • Poleg same vrednosti vsebuje še zastavico • Pretvorba T? v T je explicitna ali prek .Value lastnosti (pomaga še .HasValues) • Obratna pretvorba je implicitna
Iteratorji • foreach je učinkovita zanka preko vseh elementov • Primer • Zanaša se na metodo GetEnumerator() • Uporaba foreach je preprosta, vendar z enumeratorjem je nekaj dela
Iteratorji public class ListEnumerator : IEnumerator { List list; int index; internal ListEnumerator(List list) { this.list = list; index = -1; } public bool MoveNext() { int i = index + 1; if (i >= list.count) return false; index = i; return true; } public object Current { get { return list.elements[index]; } } } • Primer enumeratorja public class List { internal object[] elements; internal int count; public ListEnumerator GetEnumerator() { return new ListEnumerator(this); } }
Iteratorji • Metoda, ki inkrementalno izračuna in vrne sekvenco vrednosti • yield return in yield break • Mora vrniti IEnumerator ali IEnumerable • Lahko imamo več takih metod
Popravi in nadaljuj • Se ne nanaša prav na sintakso • Dobrodošla izboljšava razvojnega okolja • Implementiran na nivoju CLR
Anonimne metode • Pošiljanje blok kode kot parameter na mestu delegata • Zmanjšanje količine kode button1.Click += new EventHandler(button1_Click); ... void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello"); } button.Click += delegate { MessageBox.Show("Hello"); };
Ostale izboljšave • Delni tipi – tip je porazdeljen med več datotek • Statični razredi – lahko vsebuje samo statične metode • Določanje vidnosti lastnosti (get/set) • Tipično je set bolj omejen kot get • Okrajšave imenskih prostorov • global::[imenski prostor] • Kontrola opozoril (#pragma) prevajalnika
Povzetek • Novosti so osredotočene na • Performanse • Zmanjšanje kode • Uporabo več informacij med kodiranjem • Generiki, nullable types in iteratorji so udarne novost • Ni potrebno spreminjati starih aplikacij
Koristne informacije • Spletno domovanje C# http://msdn.microsoft.com/vcsharp/ • MSDN Library http://msdn2.microsoft.com/library/ • Novičarske skupine microsoft.public.dotnet.*, microsoft.private.slovenija.developers