Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Απ: ΑΝΤΙΚΕΙΜΕΝΟ ΚΛΩΝΟΣ???

  •  14-05-2009, 23:06

    Απ: ΑΝΤΙΚΕΙΜΕΝΟ ΚΛΩΝΟΣ???

    Πρέπει να κάνεις

    TextBox txt2 = New TextBox();

    txt2.Text = txt1.Text;

    κάνοντας TextBox txt2 ορίζεις μια τοπική μεταβλητή txt2 τύπου TextBox που (δεν) περιέχει τίποτε (=null [ή nil στην Pascal])

    Με τη New TextBox φτιάχνεις ένα νέο TextBox object (new TextBox class instance) και καλείς τον default/parameterless constructor της αυτόματα για να την αρχικοποιήσει (αν έχει οριστεί κάποιος parameterless constructor - σε κάποιες γλώσσες ορίζεις προεραιτικά) και αναθέτεις το object αυτό στην txt2 (που είναι τύπου reference σε TextBox)

    Μετά θέτεις στην ιδιότητα Text του αντικειμένου που δείχνει η txt2 την τιμή της ιδιότητας Text του αντικειμένου που δείχνει η txt1. Συνήθως αυτή είναι τύπου String και οι περισσότερες γλώσσες το υλοποιούν εδώ και κάμποσα χρόνια ως ένα immutable object που δείχνει σε ένα string pool, οπότε αν πειραχθεί το txt1.Text στο μέλλον απλά θα δείχνει αλλού και δεν θα επηρεάσει την txt2.Text που συνεχίζει να δείχνει στο παλιό string στην string pool.

    Αν η Text είναι ένα reference σε αντικείμενο άλλου τύπου από String και πεις txt1.Text.doSomething() τότε η doSomething() μέθοδος του txt1.Text μπορεί εν δυνάμει (αν προκαλεί side-effects) να επηρεάσει την txt2.Text (αφού δείχνουν στο ίδιο αντικείμενο).

    Αν η Text ήταν αριθμός ή άλλο boxed native type του .NET (π.χ. char) τότε απλά στην ανάθεση γίνεται κόπια της τιμής και το txt1.Text δεν σχετίζεται πλέον με το txt2.Text

    ----

    Αν πείς txt2 = this.txt1 ή απλά txt2 = txt1 (αφού το this εννοεί το τρέχον στιγμιότυπο/αντικείμενο της κλάσης όπου εκτελείται ο παραπάνω κώδικας και το this.txt1 εννοεί δώσε μου το public πεδίο ή property "txt1" του αντικειμένου [π.χ. της φόρμας]), τότε βάζεις τη μεταβλητή txt2 (τύπου TextBox) να δείχνει εκεί που δείχνει η μεταβλητή txt1 (ομοίως τύπου TextBox), δηλαδή να δείχνουν στο ίδιο αντικείμενο (aliasing δηλαδή). Υπόψη ότι οι μεταβλητές που κρατάνε αντικείμενα είναι απλά δείκτες (τα "κρατάνε ζωντανά" για να μην τα σβήσει από τη μνήμη ο garbage collector - αν κανείς δείκτης δεν δείχνει στο αντικείμενο, τότε θα το "αρπάξει" το GC [στο COM αντίστοιχα όταν του έλεγες να κάνει Release και το refcount έπεφτε σε 0 το αντικείμενο - συνήθως - σχεδιαζόταν να αυτοκαταστρέφεται]).

    Τα object references δεν είναι records/structs (έχει και τέτοια το .NET αν τα χρειάζεσαι, καλό είναι να αποφεύγονται όμως εκτός από ειδικές περιπτώσεις, π.χ. όταν μιλάς με το Win32 ή άλλα μη αντικειμενοστραφή API), αλλά μοιάζουν με τους pointers της C++ (είναι μάλλον managed [εννοεί πως γίνεται διαχείριση του lifetime του σχετικού resource] typed pointers στην ορολογία της Object Pascal)

     ----

    ελπίζω να μην σε κούρασα πολύ και να σου άνοιξα την όρεξη να διερευνήσεις το θέμα (δες το δωρεάν βιβλίο Thinking in Java του Bruce Eckel στο www.eckelobjects.com [ίσως έχει παύλα μεταξύ eckel και objects, δεν θυμάμαι])

    Microsoft MVP J# 2004-2010
    Borland Spirit of Delphi 2001
    http://zoomicon.com
    Δημοσίευση στην κατηγορία:
Δείτε όλες τις δημοσιεύσεις της Θεματική Ενότητας
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems