microsoft .net framework 2.0
DESCRIPTION
Microsoft .NET Framework 2.0. Novosti v sintaksi C#. Miha Markič, MVP C# RIGHT HAND . net svetovanje in razvoj www.rthand.com , [email protected]. Agenda. Generiki “Nullable types” Iteratorji Popravi in nadaljuj Anonimne metode Druge izboljšave. Okvirjanje/Razokvirjanje. Boxing/Unboxing - PowerPoint PPT PresentationTRANSCRIPT
Microsoft .NET Framework 2.0
Novosti v sintaksi C#
Miha Markič, MVP C#RIGHTHAND .net svetovanje in razvoj
www.rthand.com, [email protected]
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
Okvirjanje
Kako deluje
100
int
100
int i = 100;
object o = i;
o
i
i (okvirjen)
Počasno.
Sklad Kopica
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)
Primer generika
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
Razredi zbirk
Vmesniki zbirk
Osnovni razredi zbirk
Podporni razredi
List<T>Dictionary<K,V>SortedDictionary<K,V>Stack<T>Queue<T>
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
Primer enumeratorja
public class List{ internal object[] elements; internal int count;
public ListEnumerator GetEnumerator() { return new ListEnumerator(this); }}
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]; } }}
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
button.Click += delegate { MessageBox.Show("Hello"); };
button1.Click += new EventHandler(button1_Click);...void button1_Click(object sender, EventArgs e){ 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
Vprašanja?
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