Προς το περιεχόμενο
  • 0

Ερωτήσεις για C#


migf1

Ερώτηση

Ανοίγω αυτό το νήμα, ως αντίστοιχο του Ερωτήσεις για C για να έχουμε συγκεντρωμένα θέματα που αφορούν την C#.

 

Προέκυψε λοιπόν ανάγκη να μάθω C#, οπότε ξεκίνησα προχτές. Προς το παρόν αποσπασματικά από κάποια online tutorials για να πάρω μια γενική εικόνα, πριν καθίσω να διαβάσω κανονικό βιβλίο.

 

Φτιάχνω ένα απλό πρόγραμμα, προκειμένου να εξοικειωθώ με τη γλώσσα αρχικά σε κονσόλα, και ήδη έχω μαζέψει πολλές ερωτήσεις για τους έμπειρους στη γλώσσα.

 

Το πρόγραμμα ουσιαστικά υλοποιεί μια κλάση GreekName, για στοιχειώδη διαχείριση ελληνικών ονομάτων στην κονσόλα των Windows (CultureInfo.Name == "el-GR" ή/και "el").

 

Ρωτάει κι αποθηκεύει το όνομα ως string θεωρώντας το ονομαστική πτώση, και κατόπιν το αναπαράγει σε κλητική πτώση (διενεργώντας κάποια validation checks κατά την είσοδο).

 

Π.χ....

 

>
Το πλήρες όνομά σας; α
*** τα ονόματα πρέπει να περιέχουν τουλάχιστον 2 γράμματα

Το πλήρες όνομά σας; ΑλΈΚο2 ΑΘΑΝΑΣΙΟΥ
*** επιτρέπονται μόνο γράμματα

Το πλήρες όνομά σας; αΛΈκοΣ ΠΑπαΓΙάΝΝΗς
Γειά σου Αλέκο Παπαγιάννη.

 

Βέβαια το υλοποιώ πολύπλοκα, για να εξασκώ τα διάφορα που διαβάζω (π.χ. overloaded constructors/methods, public/private properties αυτόματες και μη, callback functions μέσω delegates, κλπ) κι έχω μαζέψει ήδη αρκετές ερωτήσεις αλλά θα ξεκινήσω με πολύ απλές για αρχή

 

Για αρχή, υπάρχει κάποια ουσιαστική διαφορά αν στην υλοποίηση των properties χρησιμοποιούμε ή όχι το this.

 

Για παράδειγμα, έχω ορίσει την property Text ως εξής...

 

>
public class GreekName
{
   // private fields
   private CultureInfo _ci;    // CultureInfo
   private string _text;        // the actual text
   private string _fname, _lname;

   /** @brief The simplest constructor of the class. */
   public GreekName()
   {
       this.Text = string.Empty;
       _ci = new CultureInfo("el-GR", false);
   }
   /** @brief Overload constructor, accepting text for the name. */
   public GreekName( string text )
   {
       this.Text = string.IsNullOrEmpty(text) ? string.Empty : text.Trim();
       _ci = new CultureInfo("el-GR", false);
   }
   /** @brief Overloaded constructor, accepting text and culture. */
   public GreekName( string text, string cultureName )
   {
       this.Text = new GreekName(text).Text;
       if ( string.IsNullOrEmpty(cultureName)
       || ("el-GR" != cultureName && "el" != cultureName )
       ){
           _ci = new CultureInfo("el-GR", false);
       }
       else {
           _ci = new CultureInfo(cultureName, false);
       }
   }
...
   /** @brief Property for getting/setting the name's text string. */
   public string Text
   {
       get { return this._text; }
       set { this._text = value.Trim(); }
   }
...

 

Κερδίζω/χάνω τίποτα αν την ορίσω χωρίς αναφορά στο this? ...

 

>
   /** @brief Property for getting/setting the name's text string. */
   public string Text
   {
       get { return _text; }
       set { _text = value.Trim(); }
   }

 

Επίσης, είναι καλή πρακτική να την χρησιμοποιώ στους constructors ή είναι καλύτερα να χρησιμοποιώ απευθείας το text filed; Κι αν ναι, με ή χωρίς this μπροστά;

 

EDIT:

 

Έβαλα και του υπόλοιπους constructors για να υπάρχει πιο σφαιρική εικόνα της υλοποίησής του (να μου πείτε αν έχω κάνει και καμια μαμακία).

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • Απαντήσεις 51
  • Δημιουργία
  • Τελευταία απάντηση

Συχνή συμμετοχή στην ερώτηση

Συχνή συμμετοχή στην ερώτηση

Δημοφιλή Μηνύματα

Το ξερω οτι εισαι ξεροκεφαλος σε μερικα θεματα, αλλα θα στο πω. Βαλε vs ή κατι που να εχει intelliSense, αλλιως απλα παρατα τα.

Το νόημα του encapsulation δεν είναι να έχεις set/get για κάθε field. Αν ήταν έτσι προφανώς και θα οριζες τα fields σου public και θα ξεμπερδευες.   Το βασικό που πρέπει να καταλάβεις είναι πως θα

Πες οτι έχεις μια class A με μια static method Foo που έχει optional parameter int bar = 42 στην assembly a.dll.   Εσύ τώρα γράφεις κώδικα σε μια άλλη assembly b.exe (έχοντας κάνει reference την a.d

Δημοσιευμένες Εικόνες

Προτεινόμενες αναρτήσεις

  • 0

Μα δεν τον περιοριζεις.

Απλα του προσφερεις εμμεσες μεθοδους προσβασης τους.

Μπορεις να εχεις σε καθε στοιχειο μια getter και μια setter που το μονο που θα κανουν ειναι να επιστρεφουν και να εκχωρουν την τιμη αυτουσια. Δηλαδη αντι να γραφεις name = "Chris"; θα γραφεις name = setName("Chris");.

Αλλαζει κατι; Προφανως οχι, αλλα στην δευτερη περιπτωσει μπορεις να προσθεσεις παραμετρους. Π.χ το string να μην εχει αριθμους ή κατι αλλο και να επιστρεφει καποιο exception. Αυτο σε διευκολυνει απο το να το ελεγχεις καθε φορα οταν κανεις αμεσα την εκχωρηση τιμης.

 

Αν το αρχειο σου βρισκεται καπου τοπικα θα πρεπει να του δωσεις ολον τον κωδικα.

Αν ομως ειναι σε καποιο πακετο σε καποιο δικτυο οπως αυτα που κανεις import εσυ θα εχεις προσβαση μονο στην κλαση και θα βλεπεις ΜΟΝΟ τα public στοιχεια δεν θα ξερεις καν αν και τι μεταβλητες και γενικα τον τροπο υλοποιησης της κλασης.

  • Like 1
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ωραία παιδιά εντάξει σας ευχαριστώ, σαν να την κατάλαβα, είδα και αυτό το παράδειγμα 

http://www.completecsharptutorial.com/basic/understanding-concepts/ και σαν να μπήκα στο νόημα.

 

Τώρα που το σκέφτομαι είναι σαν τις συναρτήσεις, απλά τις φτιάχνεις λες τη θέλεις να κάνουν και μετά τις καλείς και η μόνη διαφορά είναι στην "ορατότητα".

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Το νόημα του encapsulation δεν είναι να έχεις set/get για κάθε field. Αν ήταν έτσι προφανώς και θα οριζες τα fields σου public και θα ξεμπερδευες.

 

Το βασικό που πρέπει να καταλάβεις είναι πως θα κρύβεις το implememtation της κάθε κλασσης και θα παρεχεις μόνο public μεθόδους που θα κάνουν αυτό που θες.

  • Like 2
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Γεια σας, ασχολούμαι με την C# και έχω κάποιες ερωτήσεις - απορίες. Μαθαίνω τη γλώσσα από εδώ: http://www.tutorialspoint.com/csharp/  είναι καλή σελίδα ? Ποια προτείνετε εσείς ?

 

Έχω προχωρήσει πολύ μακριά αλλά εδώ --> C# - Encapsulation έχω μια απορία, την ενθυλάκωση γιατί πρέπει να την χρησιμοποιούμε ?

 

Δηλ τι να κρύψω - προστατεύσω ?

 

Ευχαριστώ εκ των προτέρων

 

 

Για πολλούς και διάφορους λόγους.

Τι κάνεις με την ενθυλάκωση ? Παίρνεις κάποια πράγματα και τα ομαδοποιείς επιλέγοντας τι θα είναι φανερό και τι κρυφό.

 

* Φτιάχνοντας ένα ονομαστό σύνολο κώδικα, είτε είναι μέθοδος, είτε κλάση, ή ότιδήποτε, κάθε φορά που θα θες να χρησιμοποιήσεις τον ίδιο κώδικα, απλά θα γράφεις το όνομα και τον καλείς. Αντί να κάνεις copy paste και τέτοια ας πούμε.

 

* Θα θες να 'κρύψεις' μέρος του κώδικα για πολλούς λόγους. Πρώτα απ' όλα για εσένα. Γιατί όσο μεγαλώνει το project σου τόσο πιο κουραστικό θα γίνεται να κάνεις scroll. Ή και για να μη γίνει διένεξη μεταξύ μερών που δεν θα έπρεπε ποτέ να συσχετιστούν κάπως.

 

* Σκέφτηκες ότι μπορεί δύο ή περισσότερα μέρη του προγράμματος σου να έχουν μεθόδους με το ίδιο όνομα ; Έχοντας τα  σε κλάσεις θα μπορείς να ξεχωρίσεις ποια μέθοδος από όλες με το ίδιο όνομα είναι για τι. Έχω ας πούμε ένα project του οποίου το κεντρικό παράθυρο αποτελείται από 8 αντικείμενα - στοιχεία GUI. Κάποια στοιχεία ανανεώνονται αυτόνομα, και άλλες φορές πρέπει να ανανεωθούν όλα μαζί. Έχω βάλει στο καθένα λοιπόν μια μέθοδο Refresh, και όλες τις refersh σε μια μέθοδο του Main Window, και τις έχω βάλει ανάλογα τα events να δουλεύουν. Για φαντάσου να μην υπήρχε ενθυλάκωση. Ένας χαμός θα γινόταν.

Επεξ/σία από Alithinos
  • Like 1
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Γεια σας, ασχολούμαι με την C# και έχω κάποιες ερωτήσεις - απορίες. Μαθαίνω τη γλώσσα από εδώ: http://www.tutorialspoint.com/csharp/  είναι καλή σελίδα ? Ποια προτείνετε εσείς ?

 

Έχω προχωρήσει πολύ μακριά αλλά εδώ --> C# - Encapsulation έχω μια απορία, την ενθυλάκωση γιατί πρέπει να την χρησιμοποιούμε ?

 

Δηλ τι να κρύψω - προστατεύσω ?

 

Ευχαριστώ εκ των προτέρων

 

Αυτό που κρύβεις είναι το πώς λειτουργεί εσωτερικά μια κλάση. Υπάρχουν διάφοροι λόγοι αναφορικά με το γιατί θες να κάνεις κάτι τέτοιο. Αν κάποια στιγμή αποφασίσεις να δώσεις τον κώδικα σου σε τρίτους, ας πούμε φτιάχνεις μια library και την δίνεις επί πληρωμή, δεν θες να μπορεί ο εκάστοτε προγραμματιστής να βλέπει τι έχεις κάνει και πως μέσα στην κλάση.

 

Πες ότι έχεις μια κλάση που τη λες αυτοκίνητο. Έχεις τις μεθόδους που είναι το τιμόνι, γκάζι, φρένο, χειρόφρενο και τα properties που είναι η βενζίνη, τα λαμπάκια στο καντράν,  τα φλας κλπ. Το πώς λειτουργεί όμως ο κινητήρας, οι αναρτήσεις, το σασί κλπ είναι κάποιες μέθοδοι που δεν χρειάζεται να είναι εκτεθειμένες. Υπάρχει ας πούμε μια μεταβλητή μέσα στην κλάση που ελέγχει τη βαλβίδα στον κύλινδρο. Αυτή τη μεταβλητή δεν πρέπει να μπορεί να την πειράξει ο χρήστης της κλάσης γιατί κινδυνεύει να χαλάσει τη λειτουργία του κινητήρα. Εσύ λοιπόν ως σχεδιαστής/μηχανικός του κινητήρα/προγράμματος επιλέγεις τι θα είναι προσβάσιμο για μεταβολή και τι όχι ανάλογα με το πώς λειτουργεί το πρόγραμμα σου.

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.