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

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

Δημοσ.

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

 

έχω μια απορία πάνω στα get/set, το σύστημα καταλαβαίνει μόνο του αν εγώ θέλω να σετάρω ή να επιστρέψω κάτι?

 

>
public int Age
{
  get { return _MyAge; }
  set { _MyAge = value; }
}

 

ποια η γνώμη σας για αυτόν τον τρόπο σεταρίζματος/εύρεσης τιμών

Δημοσ.

Τα properties ειναι το ιδιο πραγμα με τους getters/setters απλα γραφεις λιγοτερο κωδικα.

Τωρα για το αν καταλαβαινει.

 

Αν γραψεις

>
x = 1 * setY();

Ειναι σιγουρα λαθος διοτι η setY θελει ορισμα και δεν επιστρεφει τιποτα. Το ιδιο και με τα props αν γραψεις

>
x = 1 * Age;

Σιγουρα δεν θα καλεσει το set

 

Γενικα εχουμε

>
x = Prop * 1; // get
Prop = x * 1; // set
Prop += Prop; // set get

Δημοσ.

Δεν σου απαγορεύεται να γράψεις set get συναρτήσεις, ωστόσο στο .net η σύμβαση είναι να γράφεις properties.

 

Όπως είπε και ο παπί έχει ένα πλεονέκτημα ο μηχανισμός των properties καθώς γράφεις σε μερικές περιπτώσεις λιγότερα πράγματα ή πιο "όμορφα" πράγματα.

 

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

Δημοσ.

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

 

Όπως λέει και ο moukoublen τα properties δεν είναι τίποτα άλλο από τις συναρτήσεις Get και Set που έγραφες τόσο καιρό απλά λίγο καλύτερα δομημένες ώστε να είναι πιο ευανάγνωστες και με ευκολότερη χρήση. Στην ουσία ο compiler όταν βλέπει properties τις μετατρέπει αυτόματα σε συναρτήσεις με get και set.

 

if you open up the assembly using ildasm.exe, you see that each property is mapped to hidden get_XXX()/set_XXX()methods called internally by the CLR

Δημοσ.

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

 

έχω μια απορία πάνω στα get/set, το σύστημα καταλαβαίνει μόνο του αν εγώ θέλω να σετάρω ή να επιστρέψω κάτι?

 

Προφανώς, αλλιώς πώς θα μπορούσε να δουλέψει;

 

Εδώ υπάρχει ένας παραλληλισμός με c++ όπου είθισται να κάνεις overload τον subscript operator [] μία για να επιστρέφει κάποιο reference και μια για να επιστρέφει const reference -- ο compiler καλεί το πρώτο overload όταν χρειάζεται (γιατί προσπαθείς να αλλάξεις την τιμή αυτού που επιστρέφεται, φαντάσου i = ++foo[0]) και το δεύτερο όταν δε χρειάζεται (δηλαδή απλά διαβάζεις μια τιμή, φαντάσου i = foo[0]).

 

>
public int Age
{
get { return _MyAge; }
set { _MyAge = value; }
}

 

ποια η γνώμη σας για αυτόν τον τρόπο σεταρίζματος/εύρεσης τιμών

 

Από τη C# 3.0 και μετά που υπάρχουν auto-implemented properties και μετά, δεν υπάρχει κανένας λόγος να τα γράφεις manually. Μπορείς απλά να γράψεις

 

> public int Age { get; set; }

 

και ο compiler θα δημιουργήσει ένα field στο οποίο θα αποθηκεύεται η τιμή του Age (το οποίο θα έχει ένα όπως λέμε "unspeakable" name) και θα γράψει και τον κώδικα που δίνεις μόνος του. (Παπί αυτό που λέγαμε τις προάλλες: είναι ωραία να έχεις τον compiler να δουλεύει για σένα αντί να είναι απλώς ενοχλητικός σπάστης "εεεεεπ! λάθος! μετεξεταστέος, φτιάξε το πρόβλημα και ξαναπροσπάθησε!" :P)

 

Αν κάποια στιγμή στο μέλλον χρειαστεί να προσθέσεις κώδικα σε οποιονδήποτε από τους 2 accessors τότε θα αναγκαστείς να το γυρίσεις σ' αυτή τη μορφή (συν τον κώδικα που θέλεις) καθώς δε μπορείς να έχεις έναν μόνο auto-implemented accessor.

 

Εννοείται πως αυτός είναι ο ενδεδειγμένος τρόπος στη C# -- όπως λένε και τα παιδιά παραπάνω στην ουσία στα παρασκήνια γράφονται functions, απλά εσύ έχεις μια "ευκολότερη" σύνταξη στη διάθεσή σου.

  • Like 1

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...