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

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

Δημοσ.

Defacer

Για το 1ο που γράφεις, δεν είναι ο handler που πέρασε by refeference αλλά αυτό που δείχνει. Μην στέκεσαι στο πέρασμα της μεταβλητής αλλά στο τι τελικά περνάμε, τι κάνουμε με αυτό.

Για το 2ο το ερώτημα είναι ξεκάθαρο. Ας μην πεταγόμαστε στη Κίνα όταν η απόσταση είναι από Ομόνοια μέχρι το Σύνταγμα! Το να αλλάξω ένα αντικείμενο με ένα νέο σημαίνει ότι θα χρησιμοποιήσω τον constructor, θα δεσμευτεί μνήμη. Γιατί να το κάνω αν θέλω απλά να αλλάξω state, και έχω έτοιμο το αντικείμενο που δεν το χρειάζομαι με το τρέχον state;

 

Στην C# όπως σωστά αναφέρει ο παπι με ένα ref στη κλήση και στο method signature έχουμε πέρασμα με αναφορά. Δες όμως εδώ:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref#a-ref-returns-and-ref-locals-example

στη σημείωση με γαλάζιο χρώμα, ότι δεν πρέπει να μπερδεύουμε (για τη συγκεκριμένη γλώσσα) το πέρασμα by reference με το τους τύπους reference.

 

Επίσης έχει ένα παράδειγμα για Reference return value, όπου επιστρέφει από ένα αντικείμενο μια αναφορά σε ένα άλλο αντικείμενο που περιέχεται σε έναν πίνακα. Το ενδιαφέρον εδώ είναι ότι μπορούμε να βάλουμε σε αυτήν την αναφορά ένα νέο αντικείμενο, και αυτό να "κάτσει" στον πίνακα μέσα στο αντικείμενο με τον πίνακα. Σε Java θα μπορούσε προφανώς να γραφτεί διαφορετικά, ώστε με μια μέθοδο να δίνουμε το που θέλουμε να μπει τι. Είναι θέμα σχεδιασμού!

Δημοσ.

Δεν είναι έτσι που τα λες.

 

1. Καταρχήν αυτό ακριβώς που λες "μη στέκεσαι στο πέρασμα" είναι επιχείρημα δικό μου. Άμα δε στέκομαι στο πέρασμα όλα μπορώ να σου τα βγάλω reference που λέει ο λόγος.

 

Επιπλέον τι πάει να πει δεν πέρασε ο handler με reference. Και όταν περνάμε μέσα ένα car και του αλλάζουμε τη μηχανή, η μηχανή σίγουρα δεν περνάει με reference αλλά αν δεν κάνω λάθος αυτό το ίδιο πράγμα εσύ το λες reference επειδή γυρνάει πίσω το car με άλλη μηχανή.

 

2. Ήδη στην πρώτη πρόταση ξεκινάς με αβάσιμες υποθέσεις: ποιος σου είπε πχ ότι μιλάμε για τύπους με non-trivial constructor (έχω στο μυαλό μου ορολογία c++ εδώ), και ποιος σου είπε ότι δεν υπάρχουν ήδη δημιουργημένα αυτά τα instances για άλλο λόγο.

 

Υπάρχουν πολλές καλές απαντήσεις στο "γιατί να" που λες, το γεγονός ότι δεν τις σκέφτηκες/δεν τις συνάντησες δε σημαίνει πως δεν υπάρχουν.

 

Παραδείγματα:

- δεν υπάρχει τρόπος να αλλάξεις το state του πράγματος που πέρασε μέσα, είτε επειδή είναι επίτηδες read only, είτε επειδή περνάει μέσα ως read only interface (συνήθως και τα δύο μαζί), είτε επειδή δεν ξέρεις πώς ακριβώς από το υπάρχον state μπορείς να πας στο επιθυμητό, είτε είτε.

- τα equality semantics του πράγματος για το οποίο μιλάμε είναι τέτοια που δύο όμοιες αλλά τεχνικά διαφορετικές instances δε σε καλύπτουν. Υπόψη ότι αυτά τα semantics μπορεί να μην είναι ψημένα μέσα στο type αλλά να δημιουργούνται σε συγκεκριμένο context από άλλο κώδικα (eg someone has a map of pointers to instances to other things).

- μπορείς να χρησιμοποιήσεις ref για να αλλάξεις κάτι όχι μόνο όταν είναι μόνο του αλλά και όταν βρίσκεται κάπου που εσύ δεν κάνεις manage. Πχ καλείς μια method που παίρνει ref Cat και μπορείς να της περάσεις κατευθείαν μια Cat που είναι μέσα σε array και αυτή να σου αλλάξει τον array χωρίς να ξέρει καν ότι αυτός υπάρχει. Χωρίς ref είτε πρέπει να περάσεις όλο τον array μέσα (που είναι τραγικό και ίσως απαράδεκτου performance) είτε να κάνει την αντικατάσταση ο caller. Αλλά αυτό σημαίνει πως ο caller με τη σειρά του θα πρέπει να γνωρίζει για τον array, οπότε χωρίς ref είτε πρέπει... Recurse όσο σου κάνει κέφι :-)

 

Πολλά από αυτά φυσικά μπορούν θεωρητικά να γίνουν και με return χωρίς references, αλλά το point μου είναι πως αυτά που είπες δεν είναι επιχειρήματα που αντέχουν, όχι πως πρέπει να βάζουμε refs παντού.

 

ΥΓ ευχαριστώ για τον κόπο σου να βάλεις την παραπομπή. Τυχαίνει να ξέρω μεταξύ άλλων c# πολύ βαθειά, μπορείς στη συνέχεια ότι θες να το πεις κατευθείαν.

Δημοσ.

Πολύ καλό! Η Κυριακή ευνοεί για σεντόνια! Ασφαλώς αν ο κώδικας είναι αχταρμάς Χ προγραμματιστών, και πιθανόν το μυαλό (ο βασικός) να λείπει..τότε όλα είναι πιθανά να συμβαίνουν και να πρέπει να κάνει κανείς παπάδες για να βγάλει αποτέλεσμα.Αυτό που ήθελα το έγραψα, δεν έχω κάτι να προσθέσω!

Δημοσ.

Ασφαλώς αν ο κώδικας είναι αχταρμάς Χ προγραμματιστών, και πιθανόν το μυαλό (ο βασικός) να λείπει..

Αν είσαι του χώρου, κάποια στιγμή αργότερα στην καριέρα σου θα το διαβάζεις αυτό και θα γελάς. ;-)

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

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

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

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

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

Σύνδεση

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

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