Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεDrucilla Petropoulos Τροποποιήθηκε πριν 10 χρόνια
1
Προγραμματισμός Windows Κεφάλαιο 2: Τύποι και exceptions (σφάλματα) Μέρη έχουν παρθεί από το αγγλικό presentation του καθηγητή Dr. Juan Vargas για το μάθημα CSCE 547 του Department of Computer Science and Engineering University of South Carolina Columbia, SC 29208.gr
2
Primitive Types (πρωτόγονοι τύποι) Classes (κλάσεις) Structs (δομές) Interfaces (διεπιφάνειες) Enumerations (απαριθμήσεις) Delegates («απεσταλμένοι») Attributes (χαρακτηριστικά, εφαρμοσμένα ως κλάσεις)
3
Μία class είναι ένας μηχανισμός για να δημιουργήσουμε ή να προσεγγίσουμε μια αφηρημένη έννοια και για να οργανώσουμε τον κώδικα μας. Οι classes συνθέτουν τα δομικά υλικά της αντικειμενοστραφ ού ς σχεδίασης και του αντικειμενοστραφή προγραμματισμού (Object Oriented Programming). Όταν παρουσιάζεται ο αντικειμενοστραφής προγραμματισμός, μιλάμε συνήθως για αφηρημένες έννοιες (abstraction), encapsulation, containment, απόκρυψη πληροφοριών (information hiding), κληρονομικότητα (Inheritance), κλήση μεθόδων (method invocation), (C++ virtual class from a pointer object versus an instance object), class variables σε αντιδιαστολή με τις instance variables, κτλ. Οι.ΝΕΤ classes μπορούν να περιέχουν τα εξής στοιχεία: Fields / Πεδία (member variables) Methods / Μεθόδους (member functions) Properties / Ιδιότητες (get/set, παρόμοια με τη διεπιφάνεια της Java και τα CLOS accessors) Events / Γεγονότα (ειδοποιήσεις που μπορεί να λάβει μια κλάση. Σε αντίθεση με τη Java, όλες οι κλάσεις της.ΝΕΤ μπορούν να λάβουν ειδοποιήσεις)
4
Class Rectangle { // Fields protected int width = 1; protected int height = 1; // Properties public int Width { get { return width; } set { if (value > 0) width = value; else throw new ArgumentOutOfRangeException ( "Width must be 1 or higher"); } public int Height { get { return height; } set { if (value > 0) height = value; else throw new ArgumentOutOfRangeException ( "Height must be 1 or higher"); } public int Area { get { return width * height; } // read read-only property only property } // Methods (constructors) public Rectangle () {} public Rectangle (int cx, int cy) { Width = cx; Height = cy; }
5
// χρήση πρώτου constructor Rectangle rect = new Rectangle (); // χρήση δεύτερου constructor Rectangle rect = new Rectangle (3, 4); // Όταν το object δημιουργηθεί, χρησιμοποιείστε το έτσι: rect.Width *= 2; // Διπλασιασμός του πλάτους int area = rect.Area // Ανάκτηση του εμβαδού, διαβάζοντας την ιδιότητα Area του object, και αποθήκευση αυτού στην ακέραια μεταβλητή area.
6
Υπάρχουν 2 τύποι αποθήκευσης των objects: value-type και reference-type. Τα value-type objects αποθηκεύονται στη stack. Οι value-types έχουν λιγότερο overhead και χρησιμοποιούνται για τοπικές μεταβλητές ή objects που έχουν λίγες ή καθόλου εξωγενείς πληροφορίες. Τα structs και τα primitive types (int, float, double, byte, char, etc) αποθηκεύονται ως value-types. Τα instantiations των Class objects αποθηκεύονται ως reference-types. Τα Reference-type objects αποθηκεύονται στο heap. Ο κώδικας του χρήστη μπορεί να δημιουργήσει reference-type objects μέσω του τελεστή new, αλλά τα objects στο heap δε μπορούν να αφαιρεθούν από τον κώδικα. Μόνο ο garbage collector (συλλέκτης σκουπιδιών) μπορεί να αφαιρέσει objects από το heap.
7
// Τα Structs μπορούν να δημιουργηθούν είτε έτσι: Point p1 = new Point (1, 2); Point p2 = new Point ( ); // είτε έτσι: Point p3; Αν και τα p1,p2,p3 δημιουργήθηκαν χρησιμοποιώντας διαφορετικές μεθόδους, τα 3 structs αποθηκεύονται στο stack. Τα Value-types έχουν δύο περιορισμούς: 1. Δε μπορούν να χρησιμοποιηθούν για derived τύπους (μόνο μέσω interfaces) 2. Δε μπορούν να περιέχουν unmanaged resources (file handlers) γιατί το object destruction θα λάμβανε χώρα σε δύο διαφορετικά storages (heap, stack).
8
Τα Interfaces είναι σετ αφηρημένων μεθόδων (χωρίς καμιά προκαθορισμένη εφαρμογή) που προορίζονται να εφαρμοσθούν σε μια Class ή σε ένα struct. “Ένα interface καθορίζει ένα συμβόλαιο μεταξύ ενός τύπου και τους καταναλωτές του τύπου.” Στη C# η λέξη-κλειδί is μπορεί να χ ρ ησιμοποιηθεί για να αποφασίσουμε αν ένα object εφαρμόζει ένα interface (it depends on what your definition of the word is, is). Η λέξη-κλειδί as μπορεί να χρησιμοποιηθεί για να δοκιμάσουμε ένα object σε σχέση με ένα interface, και/ή για να cast ένα object σε ένα interface τύπο. Πάρτε υπ’ όψιν τον εξής κώδικα:
9
interface ISecret { void Encrypt (byte[] inbuf, out byte[] outbuf, Key key); void Unencrypt (byte[] inbuf, out byte[] outbuf, Key key); } class Message : ISecret { public void Encrypt (byte[] inbuf, out byte[] outbuf, Key key) {... } public void Unencrypt (byte[] inbuf, out byte[] outbuf, Key key) {... } Message msg = new Message();.. if (msg is is ISecret) { ISecret secret = (ISecret) msg; secret.Encrypt (...); }
10
using System; class MyClass1 {} class MyClass2 {} public class IsTest { public static void Main() { object [] myObjects = new object[6]; myObjects[0] = new MyClass1(); myObjects[1] = new MyClass2(); myObjects[2] = "hello"; myObjects[3] = 123; myObjects[4] = 123.4; myObjects[5] = null; for (int i=0; i< myObjects.Length; ++i) { string s = myObjects[i] as string; Console.Write ("{0}:", i); if (s != null) Console.WriteLine ( "'" + s + "'" ); else Console.WriteLine ( "not a string" ); } Ο τελεστής as χρησιμοποιείται για μετατροπές μεταξύ συμβατών τύπων: Expression as type Ο τελεστής as είναι σαν ένα cast το οποίο επιστρέφει null αν η μετατροπή αποτύχει αντί να «πετάξει» μια exception (σφάλμα). Output 0:not a string 1:not a string 2:'hello' 3:not a string 4:not a string 5:not a string
11
Τα Enums είναι value types που έχουν ένα όνομα, έναν underlying τύπο, και ένα σετ από fields. Ο underlying τύπος πρέπει να είναι ένας από τους built-in signed ή unsigned integer types (Byte, Int32 or Uint64). Τα fields είναι static literal fields που αντιπροσωπεύουν μια σταθερά. Τα Enums δε μπορούν να ορίσουν methods, interfaces, properties, ή events. Υπάρχει ένα ειδικός τύπος enum, το Flag, το οποίο χρησιμοποιεί bit fields. Όπως και με τη C++ και τη Java, το πρώτο στοιχείο σε ένα enum είναι 0. Ο κώδικας που ακολουθεί προέρχεται από το Help doc του VS.NET.
12
using System.Collections; // A traditional enumeration of some root vegetables. public enum SomeRootVegetables { HorseRadish, Radish, Turnip, } // A bit field or flag enumeration of harvesting seasons. [Flags] public enum Seasons { None = 0, Summer = 1, Autumn = 2, Winter = 4, Spring = 8, All = Summer | Autumn | Winter | Spring, } // Entry point. public class EnumerationSample { public static void Main() { // Hash table of when vegetables are available. Hashtable AvailableIn = new Hashtable(); AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All; AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring; AvailableIn[SomeRootVegetables.Turnip] = Seasons.Spring | Seasons.Autumn; // Array of the seasons, using the enumeration. Seasons[] seasons = new Seasons[] { Seasons.Winter, Seasons.Spring, Seasons.Summer, Seasons.Autumn }; // Print information of what vegetables are available each season. for (int i = 0; i < seasons.Length; i++) { Console.WriteLine("\r\nThe following root vegetables are harvested in " + seasons[i].ToString("G") + ":"); foreach (DictionaryEntry e in AvailableIn) { // A bitwise comparison. if (((Seasons)e.Value & seasons[i]) > 0) Console.WriteLine("\t" + ((SomeRootVegetables)e.Key).ToString("G")); }
13
Τα Delegates είναι δομές δεδομένων που αναφέρονται σε μια static method ή σε μια class instance και μια instance εκείνης της class. Η πρώτη περίπτωση είναι ένα type-safe wrapper γύρω από μια callback function (οι callback functions είναι μέθοδοι που χρησιμοποιούνται για να απαντήσουν σε events). Το καλύτερο αντίστοιχο του τύπου delegate στη C++ είναι μια function pointer. Αντίθετα με τις function pointers, τα delegates υποτίθεται ότι είναι object-oriented, type-safe και ασφαλή. Μια δήλωση ενός delegate ορίζει μια class derived από την class System.Delegate. Μια delegate instance εμπερικλύει μία ή περισσότερες μεθόδους, καθεμία από τις οποίες αναφέρεται σε μια callable οντότητα. Υπάρχουν τρία βήματα στον ορισμό και την χρησιμοποίηση των delegates: (1) declaration (δήλωση), (2) instantiation, and (3) invocation. Ο κώδικας που ακολουθεί προέρχεται από το VS.NET help.
14
using System; public class SamplesDelegate { // STEP 1: Declares a delegate: method has int arg and returns a String. public delegate String myMethodDelegate( int myInt ); // Defines some methods to which the delegate can point. public class mySubClass { public static String myStringMethod ( int myInt ) { if ( myInt > 0 ) return( "positive" ); if ( myInt < 0 ) return( "negative" ); return ( "zero" ); } public static String mySignMethod ( int myInt ) { if ( myInt > 0 ) return( "+" ); if ( myInt < 0 ) return( "-" ); return ( "" ); } public static void Main() { //STEP2: Instantiation: Creates one delegate for each method. myMethodDelegate myD1 = new myMethodDelegate( mySubClass.myStringMethod ); myMethodDelegate myD2 = new myMethodDelegate( mySubClass.mySignMethod ); //STEP3: Invokes the delegates. Console.WriteLine( "{0} is {1}; use the sign \"{2}\".\n", 5, myD1(5), myD2(5)); Console.WriteLine( "{0} is {1}; use the sign \"{2}\".\n",-3, myD1(-3),myD2(-3)); Console.WriteLine( "{0} is {1}; use the sign \"{2}\".\n", 0, myD1(0), myD2(0)); }
15
Το Boxing είναι η διαδικασίας δημιουργίας αντίγραφου ενός value-type από το stack στο heap. Το Unboxing είναι η διαδικάσια αντιγραφής ενός reference-type object από το heap στο stack. Τα Objects που αποθηκεύονται στο stack προέρχονται από την ιεραρχεία System.Object System.ValueType System{.Boolean.Byte.Char.DateTime.Enum.Int16.Int32 …} Η C# και η VB θα προσπαθήσουν να κρύψουν τις boxing/unboxing διαδικασίες, αλλά μερικές φορές οι προγραμματιστές πρέπει να παρέμβουν για να επιβάλουν explicit boxing ή unboxing, όπως π.χ. στον κώδικα που ακολουθεί όπου το object (Int32)1 πρέπει να μετατραπεί σε ένα reference type.
16
Μερικές φορές η C# κάνει boxing τα objects αυτόματα: Hashtable table = new Hashtable (); // Create a Hashtable table.Add ("First", 1); // Add 1 keyed by “First” newobj instance void [mscorlib]System.Collections.Hashtable::.ctor() stloc.0 ldloc.0 ldstr "First" ldc.i4.1 box [mscorlib]System.Int32 box callvirt instance void [mscorlib]System.Collections.Hashtable::Add(object, object) Αν και το boxing μπορεί να γίνει αυτόματα από τους compilers (γιατί κάνετε promote τον τύπο): int val = 1; // Declare a value type object obj = val; // Box it, το unboxing πρέπει να γίνει explicitly, μέσω ενός explicit cast, ειδάλλως ο κώδικας δε θα μπορεί να γίνει compiled. Φανταστείτε το σαν cast demotion: int val = 1; object obj = val; int val2 = obj; // This won't compile int val3 = (int int) obj; // This will
17
Το Boxing και unboxing μπορεί να διαχειριστεί μετατροπές μεταξύ value και reference types τις περισσότερες φορές. Η κατανόηση του boxing/unboxing μπορεί να σας απαλλάξει από πονοκεφάλους όταν ασχολείστε με ανώμαλες περιπτώσεις. Για παράδειγμα *: class Point { public int x; public int y; } Point p1 = new Point (); p1.x = 1; p1.y = 2; // p2 is a copy of p1 Point p2 = p1; p2.x = 3; p2.y = 4; // p2 & p1 have same values struct Point { public int x; public int y; } Point p1 = new Point (); p1.x = 1; p1.y = 2; // p2 is a NOT copy of p1 Point p2 = p1; p2.x = 3; p2.y = 4; // p2 will have new values Point p; p.x = 123; p.y = 456; Class Point { public int x; public int y; } Point p = new Point (); Δήλωση μιας instance ενός value type και μια reference σε ένα reference type. Εδώ, μια reference σε ένα object είναι σαν ένας δείκτης, είναι άχρηστο αν δεν δείχνει κάπου: Αν το Point είναι ένα value type, ο κώδικας του διακεκομένου πλαισίου είναι εντάξει Όμως, αν το Point είναι ένα reference type, ο ίδιος κώδικας δε θα γίνει compile.
18
Στο.NET, τα objects που δημιουργήθηκαν στο stack καταστρέφονται όταν καλείται ο destructor. Τα objects που δημιουργήθηκαν στο heap θα διαγραφούν κάθε φορά που το framework χρειάζεται μια κλήση στον garbage collector. Τα objects στο heap δεν καταστρέφονται ακόμα και μετά από κλήσεις στα.Close() ή.Dispose(). Ο μόνος τρόπος να το επιτύχετε είναι χρησιμοποιώντας κώδικα σαν GC.Collect(); Κι αυτό ακόμα δεν εξασφαλίζει ότι τα objects που μπορεί να θέλετε να διαγράψετε θα δια γ ραφούν ακριβώς όταν το θέλετε, γιατί ο GC μπορεί να αρχίσει να καταστρέφει παλαιότερα objects, κτλ.
19
Η CLR χρησιμοποιεί έναν strong versioning μηχανισμό για να κάνει associate τα assemblies και τα περιεχόμενα τους στα αρχεία με τα code keys και τις digital signatures. Αυτό μπορεί να γίνει χρησιμοποιώντας τα εργαλεία του SDK (sn, al, csc and gacutil) ή το VS.NET. Τα keys αποθηκεύονται σε αρχεία του τύπου strong name key (.snk). Οι digital signatures αποθηκεύονται σε “boxes” που φτιάχτηκαν για αυτές από το framework μέσα στα assemblies. Αυτές οι signatures είναι standard objects που οι εταιρείες διοχετεύουν στο ίντερνετ για να προστατεύσουν τα προγράμματα. Τα Assemblies που είναι τοπικά για ένα χρήστη δε χρειάζονται να είναι strong named. Τα Assemblies που πρόκειται να μοιραστούν από άλλους χρήστες πρέπει να είναι strong named, ώστε να μπορούν να αποθηκευτούν στο Global Assembly Cache (GAC) των υπολογιστών που τα χρησιμοποιούν. Τυπικά, οι προγραμματιστές θα χρησιμοποιήσουν delayed signing καθώς φτιάχτουν τον κώδικα τους, και όταν ο κώδικας είναι έτοιμος, η signature θα προστεθεί στο assembly χρησιμοποιώντας το sn utility.
20
T ο.NET διαχειρίζεται τα σφάλματα (exceptions) άμεσα, δηλαδή χωρίς την παρέμβαση μιας γλώσσας (όπως γίνεται στις C++, Java, Lisp). Η διαχείριση σφαλμάτων στη.NET περιέχει κομμάτια κώδικα: • Try • Catch • Finally • Throw Τα κομμάτια αυτά έχουν την ίδια λειτουργία με αυτά που είδατε σε προηγούμενες γλώσσες όπως στις C++, Lisp and Java.
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.