Δηζαγσγή ζην.νδτ Framework θαη ζηε C# Μέζνδνη Αλάπηπμεο θαη Αξρηηεθηνληθέο Σπζηεκάησλ ΠΜΣ Πιεξνθνξηαθά Σπζηήκαηα, ΟΠΑ Τξίηε, 12 Ιαλνπαξίνπ 2010 Άγγεινο Μπηκπνύδεο BSc, MSc PhD Candidate, University of Athens Microsoft Student Partner, Microsoft Hellas Software Developer, Nessos S.A.
Agenda Τη είλαη ην.νδτ Γλσξηκία κε Visual Studio IDE Παξνπζίαζε γιώζζαο C# Οκνηόηεηεο/Γηαθνξέο κε Java
1..NET
Τη είλαη ην.net Framework Common Language Runtime Framework Class Library Base Class Library Windows Presentation Foundation Windows Communication Foundation Windows Workflow Foundation Windows CardSpace
.NET Framework
Common Language Infrastructure Δίλαη ην αλνηθηό πξόηππν (ECMA-335 θαη ISO/IEC 23271) Πεξηγξάθεη ηνλ εθηειέζηκν θώδηθα θαη ην πεξηβάιινλ εθηέιεζεο Απνηειείηαη από: Common Type System Μεηα-δεδνκέλα Common Language Specification Virtual Execution System Από Ινύιην 2009: C# θαη CLI ππό Community Promise
Common Language Infrastructure
Γιώζζεο πνπ ζπλάδνπλ κε ην πξόηππν Ada APL Basic (Visual Basic) C# C C++ Java Language COBOL Component Pascal (Queensland Univ of Tech) ECMAScript (JScript) Eiffel (Monash University) Haskell (Utrecht University) lcc (MS Research Redmond) Mondrian (Utrecht) ML (MS Research Cambridge) Mercury (Melbourne U.) Oberon (Zurich University) Oz (Univ of Saarlandes) Perl Python Scheme (Northwestern U.) SmallTalk
Common Type System Να ππάξρεη έλα framework πνπ ππνζηεξίδεη crosslanguage integration, type safety θαη εθηέιεζε θώδηθα κε πςειή απόδνζε Η παξνρή ελόο αληηθεηκελνζηξαθνύο κνληέινπ, πνπ ππνζηεξίδεη ηελ πιήξε πινπνίεζε από δηάθνξεο γιώζζεο πξνγξακκαηηζκνύ Ο πξνζδηνξηζκόο θαλόλσλ ώζηε νη γιώζζεο λα είλαη interoperable
Common Language Specification Τν CLS ππνζύλνιν ηνπ CTS To CLS βνεζάεη ζηε δηαιεηηνπξγηθόηεηα γισζζώλ κε ην λα πξνζδηνξίδεη ραξαθηεξηζηηθά πνπ είλαη θνηλά ζε θάζε γιώζζα πνπ απεπζύλεηαη ην CLR Πρ To UInt32 δελ είλαη CLSCompliant Η C# case sensitive, Visual Basic όρη
Common Language Runtime Just-in-time Compilation Memory management Thread management Exception handling Garbage collection Security
Common Language Runtime
.NET Framework Stack
Γηαδηθαζία Δθηέιεζεο
Τη κπνξνύκε λα ρξεζηκνπνηήζνπκε;
Οθέιε.ΝΔΤ Απηόκαηε δηαρείξηζε πόξσλ Απινπνίεζε πξνγξακκαηηζκνύ Multiplatform πξνζέγγηζε Αζθαιέο ζύζηεκα ηύπσλ δεδνκέλσλ Ιδαληθό κνληέιν αζθάιεηαο Κνηλό πεξηβάιινλ αλάπηπμεο επηηξέπνληαο πνιπγισζζηθό debugging Γνκέο γηα επαλαρξεζηκνπνίεζε θώδηθα
2. Γνωριμία με το Visual Studio Demo
3. C#
C# 101 Τα πάληα είλαη objects θαη θιεξνλνκνύλ ην System.Object Γηάθξηζε αλάκεζα ζε ηύπνπο ηηκήο θαη αλαθνξάο Value Types: primitives, enums, structs Reference Types: interfaces, classes, arrays
Value vs Reference Types struct Point { private int x, y; public Point (int x, int y) { this.x = x; this.y = y; } public int X { get {return x;} set {x = value;} } // private fields // constructor // property } public int Y { get {return y;} set {y = value;} }
Παξάδεηγκα Point p1 = new Point(); Form f1 = new Form(); Form f1; f1 = new Form(); Point p2 = p1; Form f2 = f1;
Παξάδεηγκα Point mypoint = new Point (0, 0); Form myform = new Form(); Test (mypoint, myform); void Test (Point p, Form f) { p.x = 100; // Κακία επίδξαζε ζην mypoint f.text = "Hello, World!"; f = null; // Κακία επίδξαζε ζην myform }
Παξάδεηγκα Point mypoint = new Point (0, 0); Form myform = new Form(); Test (ref mypoint, ref myform); void Test (ref Point p, ref Form f) { p.x = 100; f.text = Hello, World! ; f = null; }
Γειώζεηο Όπσο θαη ε C if (<bool expr>) {... } else {... }; switch(<var>) { case <const>:...; }; while (<bool expr>) {... }; for (<init>;<bool test>;<modify>) {... }; do {... } while (<bool expr>); Όρη ζαλ ηελ C lock(<object>){... }; checked {...}; unchecked {...};
Πίλαθεο (Arrays) Zero based, type bound Βαζίδνληαη ζηελ θιάζε ηνπ.net, System.Array Γειώλνληαη κε ηύπν θαη κνξθή, αιιά ρσξίο όξηα int[] SingleDim; int[,] TwoDim; int [][] Jagged; Γεκηνπξγία SingleDim = new int[20]; TwoDim = new int[,]{{1,2,3},{4,5,6}}; Jagged = new int[1][]; Jagged[0] = new int[]{1,2,3};
Κιάζεηο Υινπνίεζε θώδηθα θαη δεδνκέλσλ Μπνξεί κία θιάζε λα πινπνηεί interfaces Μπνξεί λα θιεξνλνκεί από κία βαζηθή θιάζε (base class) Πεξηέρνπλ Πεδία (fields) Ιδηόηεηεο (properties get/set) Μέζνδνη (Methods) Events, indexers, delegates,
Πξόζβαζε Οκνηόηεηεο κε C++ Public Protected Private Δπεθηάζεηο Sealed Internal Protected internal
Ιδηόηεηεο Δπθνιία πινπνίεζεο κεζόδσλ Φξήζε properties γηα Υινπνίεζε read-only κειώλ (παξαιείπνληαο ην set) Δπηθύξσζε θαηά ηελ αλάζεζε Παξάγσγεο ή ζύλζεηεο ηηκέο Έθζεζε ηηκώλ ζε interfaces string Name { get { return name; } set { name = value; } }
Iterators Δηζήρζεζαλ ζηελ C# 2.0 Δίλαη κία κέζνδνο, get accessor πνπ επηηξέπεη ηελ ρξήζε foreach ζηελ θιάζε ή ην struct ρσξίο λα ρξεηάδεηαη λα πινπνηεζεί ην interface IEnumerable Δίλαη έλα θνκκάηη θώδηθα πνπ επηηξέπεη ηαμηλνκεκέλε ζεηξά ηηκώλ ίδηνπ ηύπνπ Φξεζηκνπνηεί ην yield return
Παξάδεηγκα public class SampleCollection { public int[] items; public SampleCollection() { items = new int[5] { 5, 4, 7, 9, 3 }; } class MainClass { static void Main() { SampleCollection col = new SampleCollection(); // Display the collection items: } public System.Collections.IEnumerable BuildCollection() { } for (int i = 0; i < items.length; i++) { } yield return items[i]; } System.Console.WriteLine("Value s in the collection are:"); foreach (int i in col.buildcollection()) { System.Console.Write(i + " "); } }
Delegates Κάηη ζαλ ηνπο δείθηεο ζε ζπλαξηήζεηο (C/C++) Ιζρπξνί ηύπνη (αληίν ζην type-casting θαη ζηα ζθάικαηα) Η δήισζε δεκηνπξγεί κία typed method signature delegate void Clicked(Element e, Point p); Ο πξαγκαηηθόο αληηπξόζσπνο είλαη έλα ζηηγκηόηππν απηνύ ηνπ ηύπνπ θαη κπνξεί λα γίλεη κε αξρηθνπνίεζε είηε κε Named Method είηε κε Anonymous Τν όξηζκα πεξληέηαη ζηνλ constructor ηνπ αληηπξνζώπνπ
Named methods delegate void Del(int x); void DoWork(int k) { /*... */ } Del d = obj.dowork;
Anonymous Methods delegate void Del(int x); Del d = delegate(int k) { /*... */ };
C# 3.0 Μεγαιύηεξε θαηλνηνκία: επεξσηήζεηο ζηα δεδνκέλα var query = from p in employees where p.salary > 33000m orderby p.name, p.startdate descending group p by p.department;
Anonymous types Σαλ έλαο θαλνληθόο ηύπνο πνπ δεη ζην CLR var v = new { Amount = 108, Message = "Hello" }; var productquery = from prod in products select new { prod.color, prod.price }; foreach (var v in productquery) { Console.WriteLine("Color={0}, Price={1}", v.color, v.price); }
Extension methods Δπηηξέπεηαη λα πξνζηεζνύλ κέζνδνη ζε ππάξρνληεο ηύπνπο ρσξίο λα δεκηνπξγνύκε έλαλ λέν derived ηύπν Καινύληαη πνιύ εύθνια (just static methods underneath) Method chaining
Παξάδεηγκα string x = "some string value"; string y = Utility.Reverse(x); string x = "some string value"; string y = x.reverse(); public static class Utility { public static string Reverse(this string input) { char[] chars = input.tochararray(); Array.Reverse(chars); return new String(chars); } }
Lambda (λ) expressions Τν θαιύηεξν feature ηεο C# 3.0 Σαλ anonymous method αιιά κηθξόηεξν Φξεζηκνπνηεί ηνλ lambda operator => πνπ δηαβάδεηαη goes to δειαδή «ζπλεπάγεηαη» Αξηζηεξά έρνπκε παξακέηξνπο εηζόδνπ θαη δεμηά ηελ έθθξαζε ή ην θνκκάηη θώδηθα. Shorthands Parameter type inference Brace removal (single expression/statement) Bracket removal (single parameter) Expression Trees
Παξάδεηγκα int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 }; foreach (int i in source.where(x => x > 5)) Console.WriteLine(i);
Παξάδεηγκα // Γήισζε delegate public delegate int ChangeInt(int x); // Μία κέζνδνο ζηελ νπνία κπνξεί λα δείμεη ε από πάλσ κεηαβιεηή static public int DoubleIt(int x) { return x * 2; } // Γεκηνπξγία ζηηγκηνηύπνπ ChangeInt mydelegate = new ChangeInt(DelegateSample.DoubleIt); Console.WriteLine("{0}", mydelegate(5));
Παξάδεηγκα ChangeInt mydelegate = new ChangeInt( delegate(int x) { return x * 2; } ); Console.WriteLine("{0}", mydelegate(5));
Παξάδεηγκα ChangeInt mydelegate = x => x * 2; Console.WriteLine("{0}", mydelegate(5));
LINQ Χαρακτηριστικά Γπλαηόηεηα επεξσηήζεσλ κέζα ζηε γιώζζα Πεξηέρεη Standard Query Operations Select Where Join Take/Skip Group By Providers Erik Meijer
Λίγν αθόκα κε compiler internals γηα Linq Μεηάθξαζε ζε θαλνληθή C# Νσξίο λσξίο ζηε κεηαγιώηηηζε
Δπεθηακέλε κνξθή 1 Query expression ζε θαλνληθή C#: var query = employees.where(p => p.salary > 33000m).OrderBy(p => p.name).thenbydescending(p => p.startdate).groupby(p => p.department);
Δπεθηακέλε κνξθή 2 Αθαίξεζε ηεο έκκεζεο απόδνζεο ηύπνπ IEnumerable<Employee> query = employees.where(p => p.salary > 33000m).OrderBy(p => p.name).thenbydescending(p => p.startdate).groupby(p => p.department);
Δπεθηακέλε κνξθή 3 Αθαίξεζε Extension Methods IEnumerable<Employee> query = Enumerable.GroupBy( Enumerable.ThenByDescending( Enumerable.OrderBy( Enumerable.Where(employees, p => p.salary > 33000m), p => p.name), p => p.startdate), p => p.department);
Δπεθηακέλε κνξθή 4 Αθαίξεζε lambdas IEnumerable<Employee> query = Enumerable.GroupBy( Enumerable.ThenByDescending( Enumerable.OrderBy( Enumerable.Where(employees, new Func<Employee,bool> (BigSalary), new Func<Employee, string> (NameFunc), new Func<Employee, DateTime> (StartFunc), new Func<Employee, Department> (DeptFunc));
Δπεθηακέλε κνξθή 5 Αθαίξεζε type inference κε generics IEnumerable<Employee> query = Enumerable.GroupBy<Employee, Department>( Enumerable.ThenByDescending<Employee, DateTime>( Enumerable.OrderBy<Employee, string>( Enumerable.Where<Employee>(employees, new Func<Employee,bool> (BigSalary), new Func<Employee, string> (NameFunc), new Func<Employee, DateTime> (StartFunc), new Func<Employee, Department> (DeptFunc));
C# vs Java C# Closures Runtime generics Generics θαη κε primitive types Delegates Events LINQ Extension methods First-class properties Iterators Operator overloading Indexers Anonymous types Expression trees Using blocks Με ειεγρόκελα exceptions Decimal ηύπνη Java Enumerations Inner Classes Checked exceptions Μηθξό unit δηαλνκήο Πεξηζζόηεξα IDE s Τξέρεη ώξηκα δπλακηθέο γιώζζεο
Βηβιία
Σύλδεζκνη http://msdn.microsoft.com http://www.studentguru.gr http://www.microsoft.com/express http://www.windowsclient.net http://www.asp.net http://creators.xna.com http://www.dreamspark.com http://channel9.msdn.com http://silverlight.net
Δξγαιεία http://www.red-gate.com/products/reflector/ http://www.linqpad.net/ http://www.fiddler2.com/fiddler2/ http://www.httpwatch.com/download/ http://www.jetbrains.com/ http://www.ndepend.com http://www.nunit.org
Δπηθνηλσλία Άγγεινο Μπηκπνύδεο http://www.studentguru.gr/blogs/grnemo http://www.twitter.com/aggelosmp http://www.facebook.com/aggelosmp http://aggelosmp.xelixis.net
Δπραξηζηώ Happy development time!!!