Acasă / Instrucţiuni / Getters și Setters sunt magie care trebuie să-și cunoască locul. Interfață Data Set Set Property Shorthand Notation

Getters și Setters sunt magie care trebuie să-și cunoască locul. Interfață Data Set Set Property Shorthand Notation

Joseph Crawford, unul dintre cititorii mei, a citit un articol despre cum nu-mi place să scriu getters și setters și mi-a sugerat că aș putea folosi metodele magice __get și __set.
Vă voi spune de ce nu este o idee bună să le folosiți în mod normal. De asemenea, o să vă spun o poveste în care au fost cu adevărat utile - crearea de tipuri statice în PHP (un limbaj dinamic).
Pentru cei care nu sunt familiarizați cu metodele __get și __set, acestea sunt două metode „magice” care funcționează astfel:
clasa Animal ( function __get($proprietate) ( //... ) function __set($property, $value) ( ​​​​​//... ) ) $cow = animal nou; $vaca->greutate = "1 tona"; // la fel ca $cow->__set("greutate", "1 tona") print $cow->greutate; // la fel ca print $cow->__get("greutate");

De obicei, metodele de mai sus sunt folosite pentru a crea proprietăți dinamice. Ce concluzie se poate trage din asta? Dacă doriți să creați proprietăți aleatorii, utilizați doar un hash (alias o matrice cu chei).
Ce este bun la getters și setters?
Să vedem:
clasa Animal ( public $weightInKgs; ) $cow = animal nou; $cow->weightInKgs = -100;

Ce? Greutate negativa? Acest lucru este incorect din majoritatea punctelor de vedere.
O vaca nu trebuie să cântărească mai puțin de 100 kg (cred că da:). În termen de 1000 este acceptabil.
Cum putem asigura o astfel de limitare?
Utilizarea __get și __set este o modalitate destul de rapidă.
clasa Animal ( private $properties = array(); function public __get($name) ( if(!empty($this->properties[$name])) ( return $this->properties[$name]; ) else ( aruncă o nouă excepție(„Proprietate nedefinită „.$nume.” referită.” ) ) funcția publică __set($nume, $valoare) ( ​​dacă($nume == „greutate”) ( if($valoare)< 100) { throw new Exception("The weight is too small!") } } $this->proprietăți[$nume] = $valoare;

) ) $cow = animal nou; $cow->weightInKgs = -100; //aruncă o excepție
Ce se întâmplă dacă ai o clasă cu 10-20 de proprietăți și verifică pentru ele? În acest caz, necazurile sunt inevitabile.< 100) { throw new Exception("The weight is too small!") } if($this->funcția publică __set($nume, $valoare) ( ​​dacă($nume == „greutate”) ( dacă ($valoare)

greutate != $greutate) ( Shepherd::notifyOfWeightChange($vaca, $greutate); ) ) if($nume == "picioare") ( if($valoare != 4) ( arunca o nouă excepție ("Numărul de picioare) este prea mic sau prea mare") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( .... ați înțeles ideea... ) $this->properties[$nume] = $valoare;
)< 100) { throw new Exception("The weight is too small!"); } if($this->Dimpotrivă, getters și setters sunt cei mai buni când vine vorba de validarea datelor.

clasa Animal ( private $greutate; privat $numberOfLegs; privat $numberOfHooves; public $nickname; public function setNumberOfLegs($numberOfLegs) ( if ($numberOfLegs != 100) ( throw new Exception("Numarul de picioare este prea mic sau prea mic) mare"); ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) funcția publică getNumberOfLegs() ( returnează $this->numberOfLegs; ) funcția public setWeight($greutate) ( dacă ($greutate)
greutate != $greutate) ( Shepherd::notifyOfWeightChange($vaca, $greutate); ) $aceasta->greutate = $greutate;
) funcția publică getWeight() ( returnează $this->weight; ) )
Nimic nu se compară cu funcțiile scurte (get, set;) din C#. Este probabil ca un astfel de suport să apară în curând în PHP, dar deocamdată să nu ne relaxăm...
Din nou, nu am scris cu adevărat toți acești getters și setteri - PHP Storm a făcut-o pentru mine. Pur și simplu am scris următoarele:
clasa Animal (privat $greutate; privat $numberOfLegs; )

Și am apăsat Alt+Insert -> Getters și setters. PHPStorm a generat totul automat.
Acum, ca un avantaj suplimentar al PHP Storm, atunci când lucrez cu getters și setters, am capacitatea de a folosi funcția de autocompletare:

În cazul lui __get, nu am această opțiune, pot scrie doar asta:
$cow->greutate = -100

Acum vaca „cântărește” (greutăți) minus 100 kg.
Pot uita că aceasta este greutatea în kg, doar scrieți greutatea și totul va funcționa.
Deci, getters și setters pot fi foarte folositori (dar totuși nu le venerați, nu sunteți un programator Java). Dacă doriți doar proprietăți gratuite, utilizați o matrice:
$cow = array("greutate" => 100, "picioare" => 4);

Acest truc este mult mai ușor de realizat decât __get și __set.
Dar, dacă doriți să vă asigurați că datele dvs. au întotdeauna numai valori valide, utilizați setari cu validare. Dacă aveți un mediu de dezvoltare integrat (IDE) precum PHP Storm, vă veți bucura de setari pentru că sunt atât de ușor de utilizat. În loc de $cow->setLegs() pentru PHP Storm va fi suficient să tastați cosl. Da, este ușor! Nu mai sunt greșeli de scriere și puteți vedea ce parametri ia metoda.
Metoda __set are un alt dezavantaj. Acceptă doar 1 parametru. Dacă ai nevoie de 2? De exemplu, ca aici: $store1->setPrice(„articol-1”, 100). Trebuie să setați prețul produsului în magazin. Metoda __set nu vă va permite să faceți acest lucru, dar setter-ul o va face.

Implementarea interfeței Set este o colecție neordonată care nu poate conține date duplicat.

Interfață Set include următoarele metode:

MetodăDescriere
adaugă (obiect o) Adăugarea unui element la colecție dacă lipsește. Returnează adevărat dacă elementul a fost adăugat.
addAll(Colecția c) Adăugarea articolelor de colecție dacă lipsesc.
clar() Ștergerea colecției.
conţine (Obiect o) Verificarea prezenței unui element într-un set. Returnează adevărat dacă elementul este găsit.
conţineAll(Colecţia c) Verificarea prezenței unei colecții într-un set. Returnează adevărat dacă toate elementele sunt conținute în mulțime.
este egal(obiect o) Verificarea egalității.
hashCode() Obținerea hashCode al unui set.
este gol() Verificarea prezenței elementelor. Returnează adevărat dacă nu există elemente în colecție.
iterator() Funcție pentru a obține un iterator de colecție.
elimina (obiectul o) Eliminarea unui element dintr-un set.
removeAll(Colecția c) Elimină toate elementele colecției trecute din set.
retainAll(Colecția c) Eliminarea elementelor care nu aparțin colecției trecute.
dimensiune() Numărul elementelor de colecție
toArray() Conversia unui set într-o matrice de elemente.
toArray(T a) Conversia unui set într-o matrice de elemente. Spre deosebire de metoda anterioară, care returnează o matrice de obiecte de tip Object, această metodă returnează o matrice de obiecte de tipul trecut în parametru.

Pentru a interfata familia Set include HashSet, TreeSetŞi LinkedHashSet. În seturi Set Diferite implementări folosesc ordine diferită a elementelor de stocare. În HashSet, ordinea elementelor este optimizată pentru căutare rapidă. Containerul TreeSet stochează obiecte sortate în ordine crescătoare. LinkedHashSet stochează elementele în ordinea în care au fost adăugate.

Set de date HashSet

Constructori HashSet:

// Creați un set gol cu ​​o capacitate inițială de 16 și un factor de încărcare implicit de 0,75 public HashSet(); // Crearea unui set din elementele colectiei public HashSet(Collection c); // Creați un set cu capacitatea inițială specificată și // factorul de încărcare implicit (0,75) public HashSet(int initialCapacity); // Creați un set cu capacitatea inițială specificată și // factorul de încărcare public HashSet(int initialCapacity, float loadFactor);

Metode HashSet

  • public int size()
  • public boolean isEmpty()
  • public boolean add(Obiect o)
  • public boolean addAll(Colecția c)
  • public boolean remove (Obiect o)
  • public boolean removeAll(Colecția c)
  • public boolean conține(Obiect o)
  • vidul public clar ()
  • clona obiect public()
  • public Iterator iterator()
  • obiect public toArray()
  • public boolean retainAll(Colecția c)

HashSet conține metode similare cu ArrayList . Excepția este metoda add(Object o), care adaugă un obiect doar dacă acesta lipsește. Dacă se adaugă un obiect, metoda add returnează true, în caz contrar false.

Exemplu de utilizare a HashSet:

HashSet hashSet = nou HashSet (); hashSet.add("Cartofi"); hashSet.add("Morcov"); hashSet.add("Sfecla"); hashSet.add("Castraveți"); // Următoarea intrare nu trebuie să fie în setul hashSet.add("Cartofi"); // Imprimă dimensiunea setată pe consolă System.out.println("HashSet size = " + hashSet.size()); // Imprimați intrările Iteratorului în consolă

Ar trebui să vedem doar 4 intrări în consolă. Trebuie remarcat faptul că ordinea în care înregistrările sunt adăugate la set va fi imprevizibilă. HashSet folosește hashing pentru a accelera recuperarea.

Exemplu de utilizare HashSet cu valori întregi. Adăugăm valori de la 0 la 9 din 25 de valori posibile selectate aleatoriu la set - nu va exista dublare.

Aleatoriu aleatoriu = new Random(30); Set iset = nou HashSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

Trebuie remarcat faptul că implementarea HashSet nu se sincronizează. Dacă mai multe fire accesează simultan un set hash și unul sau mai multe fire trebuie să modifice setul, atunci acesta trebuie să fie sincronizat extern. Acest lucru se face cel mai bine în momentul creării pentru a preveni accesul accidental nesincronizat la set:

Set set = Collections.synchronizedSet(new HashSet ());

Set de date LinkedHashSet

Clasă LinkedHashSet moștenește HashSet fără a adăuga metode noi și menține o listă legată a elementelor mulțimii în ordinea în care au fost inserate. Acest lucru permite o iterare ordonată a inserției în set.

Constructori LinkedHashSet:

// Creați un set gol cu ​​o capacitate inițială (16) și o valoare implicită a factorului de încărcare (0,75) public LinkedHashSet() // Creați un set din elementele colecției public LinkedHashSet(Collection c) // Creați un set cu o inițială specificată capacitate și o valoare a factorului încărcare implicită (0,75) public LinkedHashSet(int initialCapacity) // Creați un set cu capacitatea inițială și factorul de încărcare specificate public LinkedHashSet(int initialCapacity, float loadFactor)

Exact ca HashSet, LinkedHashSet nesincronizat. Prin urmare, atunci când utilizați această implementare într-o aplicație cu multe fire de execuție, dintre care unele pot face modificări setului, sincronizarea ar trebui să fie efectuată în etapa de creare:

Set set = Collections.synchronizedSet(new LinkedHashSet ());

Setul de date TreeSet

Clasă TreeSet creează o colecție care folosește un arbore pentru a stoca elemente. Obiectele sunt stocate în ordine crescătoare.

Constructori TreeSet:

// Creați un set de arbori gol, sortat după // ordonarea naturală a elementelor sale TreeSet() // Creați un set de arbori care să conțină elementele din mulțimea specificată, // sortate după ordinea naturală a elementelor sale. TreeSet(Colecțiec) // Creați un set de arbore gol, sortat în funcție de comparator TreeSet(Comparatorcomparator) // Creați un set de arbore care conține aceleași elemente și folosind // aceeași ordine ca și setul sortat specificat TreeSet(SortedSet s)

Metode TreeSet

  • boolean add(Obiect o)
  • boolean addAll(Colecțiec)
  • Plafon obiect (Obiect o)
  • void clear()
  • Clona TreeSet()
  • Comparatorcomparator()
  • boolean conține (Obiect o)
  • Iterator descendingIterator()
  • NavigableSet descendingSet()
  • Obiectul întâi ()
  • etaj obiect (obiect o)
  • SortedSet set cu cască (E e)
  • NavigableSet headSet (E e, boolean inclusiv)
  • Obiect mai sus (Obiect o)
  • boolean este gol ()
  • Iterator iterator()
  • Elast()
  • E mai jos (E e)
  • E pollFirst()
  • E sondajLast()
  • Eliminare booleană (Obiect o)
  • dimensiune int()
  • Spliterator spliter()
  • NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
  • SortedSet subSet(E fromElement, E toElement)
  • SortedSet tailSet(E fromElement)
  • NavigableSet tailSet(E fromElement, boolean inclusiv)
  • În următorul exemplu modificat de la utilizarea TreeSet Valorile vor fi trimise pe consolă într-o formă ordonată.

    SortedSet treeSet = nou TreeSet (); treeSet.add("Sfecla"); treeSet.add("Castraveți"); treeSet.add("Roșii"); treeSet.add("Cartofi"); treeSet.add("Morcov"); // Această intrare nu trebuie inclusă în setul treeSet.add("Cartofi"); // Imprimă dimensiunea setului pe consolă System.out.println("treeSet size = " + treeSet.size()); // Imprimați intrările Iteratorului în consolă itr = treeSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Random random = new Random(30); SortedSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoriset = nou TreeSet

    itr = iset.iterator(); în timp ce (itr.hasNext()) ( System.out.println(itr.next().toString()); )

    Ultima actualizare: 29.07.2018

    Pe lângă metodele obișnuite, limbajul C# oferă metode speciale de acces numite proprietăți. Acestea oferă acces ușor la câmpurile de clasă, le află valoarea sau le setează.

    Descrierea proprietății standard are următoarea sintaxă:

    [access_modifier] return_type custom_name ( // cod de proprietate )

    De exemplu:

    Clasa Persoană (nume șir privat; șir public Nume (get (nume returnat; ) set (nume = valoare; ) ) )

    Prin această proprietate putem controla accesul la variabila nume. Definiția proprietății standard conține blocuri get și set. În blocul get returnăm valoarea câmpului, iar în blocul set o setăm. Parametrul value reprezintă valoarea care trebuie transmisă.

    Putem folosi această proprietate astfel:

    Person p = new Person(); // Setați proprietatea - se declanșează blocul Set // valoarea „Tom” este valoarea transmisă proprietății p.Name = „Tom”; // Obține valoarea proprietății și atribuie-o unei variabile - se declanșează blocul Get șir personName = p.Name;

    Poate apare întrebarea, de ce avem nevoie de proprietăți dacă ne putem descurca cu câmpurile obișnuite de clasă în această situație? Dar proprietățile vă permit să adăugați o logică suplimentară care poate fi necesară, de exemplu, atunci când atribuiți o valoare unei variabile de clasă. De exemplu, trebuie să setăm o verificare a vârstei:

    Clasa Persoană ( private int vârsta; public int Age ( set ( dacă (valoare< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

    Blocurile set și get nu trebuie să fie prezente într-o proprietate în același timp. Dacă o proprietate este definită doar printr-un bloc get, atunci proprietatea este doar pentru citire - putem obține valoarea acesteia, dar nu o setăm. Dimpotrivă, dacă o proprietate are doar un bloc stabilit, atunci acea proprietate poate fi scrisă numai - puteți seta doar valoarea, dar nu o puteți obține:

    Clasa Persoană (nume șir privat; // proprietate numai pentru citire șir public Nume ( get (nume returnat; ) ) private int vârsta; // proprietate numai pentru scriere public int Vârstă ( set ( vârstă = valoare; ) ) )

    Modificatori de acces

    Putem aplica modificatori de acces nu numai întregii proprietăți, ci și blocurilor individuale - fie obțineți, fie setați:

    Clasa Persoană (nume șir privat; șir public Nume ( get (nume returnat; ) set privat (nume = valoare; ) ) Persoană publică (nume șir, vârstă int) ( Nume = nume; Vârstă = vârstă; ) )

    Acum putem folosi blocul set închis numai în această clasă - în metodele sale, proprietăți, constructor, dar nu în altă clasă:

    Person p = new Person ("Tom", 24); // Eroare - setul este declarat cu modificatorul privat //p.Name = "Ioan"; Console.WriteLine(p.Name);

    Când folosiți modificatori în proprietăți, există o serie de restricții de luat în considerare:

      Un modificator pentru un bloc set sau get poate fi setat dacă proprietatea are ambele blocuri set și get.

      Doar un bloc set sau get poate avea un modificator de acces, dar nu ambele

      Modificatorul de acces al unui bloc set sau get trebuie să fie mai restrictiv decât modificatorul de acces al unei proprietăți. De exemplu, dacă o proprietate are modificatorul public, atunci blocul set/get poate avea numai modificatorii protejați intern, intern, protejat, privat

    Încapsulare

    Am văzut mai sus că accesul la variabilele de clasă privată se stabilește prin proprietăți. Ascunderea stării unei clase de interferența exterioară în acest fel reprezintă mecanismul de încapsulare, care reprezintă unul dintre conceptele cheie ale programării orientate pe obiecte. (Este de remarcat faptul că însuși conceptul de încapsulare are destul de multe interpretări diferite, care nu se suprapun întotdeauna între ele) Utilizarea modificatorilor de acces privat protejează o variabilă de accesul extern. Pentru a controla accesul, multe limbaje de programare folosesc metode speciale, getters și setters. În C#, rolul lor este de obicei jucat de proprietăți.

    De exemplu, există o clasă de cont care are un câmp de sumă care reprezintă o sumă:

    Cont de clasă ( public int suma; )

    Deoarece variabila sumă este publică, o putem accesa oriunde în program și o putem modifica, inclusiv setarea oricărei valori nevalide, de exemplu, negativă. Este puțin probabil ca un astfel de comportament să fie de dorit. Prin urmare, încapsularea este utilizată pentru a restricționa accesul la variabila sumă și pentru a o ascunde în interiorul clasei:

    Cont de clasă ( private int sum; public int Sum ( get (return sum;) set ( if (valoare > 0) ( sum=valoare; ) ) ) )

    Proprietăți automate

    Proprietățile controlează accesul la câmpurile unei clase. Cu toate acestea, ce se întâmplă dacă avem o duzină sau mai multe câmpuri, atunci definirea fiecărui câmp și scrierea unei proprietăți de același tip pentru acesta ar fi plictisitoare. Prin urmare, proprietățile automate au fost adăugate cadrului .NET. Au o declarație scurtă:

    Clasa Persoană ( șir public Nume ( get; set; ) public int Vârstă ( get; set; ) public Person (nume șir, int vârstă) ( Nume = nume; Vârsta = vârstă; ) )

    De fapt, aici sunt create și câmpuri pentru proprietăți, doar că nu sunt create de programator în cod, dar compilatorul le generează automat în timpul compilării.

    Care este avantajul auto-proprietăților, dacă în esență doar accesează o variabilă creată automat, de ce să nu acceseze direct o variabilă fără proprietăți automate? Faptul este că în orice moment, dacă este necesar, putem extinde proprietatea automată într-o proprietate obișnuită și îi putem adăuga o logică specifică.

    Merită să luați în considerare faptul că nu puteți crea o proprietate automată numai de scriere, așa cum este cazul proprietăților standard.

    Proprietăților automate pot fi atribuite valori implicite (inițializarea proprietăților automate):

    Clasa Persoană ( șir public Nume ( get; set; ) = „Tom”; public int Vârstă ( get; set; ) = 23; ) class Program ( static void Main(string args) ( Persoană persoană = new Person(); Consolă .WriteLine(persoana.Nume // Tom Console.WriteLine(persoana.Vârsta // 23 Console.Read();

    Și dacă nu specificăm valorile proprietăților Nume și Vârstă pentru obiectul Persoană, atunci se vor aplica valorile implicite.

    Proprietățile automate pot avea și modificatori de acces:

    Clasa Persoană ( șir public Nume ( set privat; obține;) Persoană publică (șir n) ( Nume = n; ) )

    Putem elimina blocul set și putem face proprietatea automată doar în citire. În acest caz, pentru a stoca valoarea acestei proprietăți, se va crea implicit un câmp cu modificatorul readonly pentru ea, deci trebuie avut în vedere că astfel de proprietăți get pot fi setate fie din constructorul clasei, ca în exemplu. de mai sus sau la inițializarea proprietății:

    Persoană de clasă ( șir public Nume ( get;) = „Tom” )

    Notație scurtă pentru proprietăți

    La fel ca și metodele, putem scurta proprietățile. De exemplu:

    Clasa Persoană (nume șir privat; // echivalent cu șirul public Nume ( get (nume returnat; ) ) șir public Nume => nume; )

    Pentru a controla modul în care sunt utilizate câmpurile, puteți crea metode get și set și le puteți face publice. Ele oferă capacitatea de a controla accesul la un câmp. În același timp, este mai bine să faceți privat câmpul Age, astfel încât să nu poată fi accesat direct în afara clasei.

    Cont de clasă publică

    private int age;

    public int GetAge()

    returneaza aceasta.varsta;

    public void SetAge(int inAge)

    dacă ((în vârstă > 0) && (în vârstă< 120))

    this.age = inAge;

    Acum putem controla accesul la câmpul nostru, dar acest lucru necesită scrierea multor coduri suplimentare. Pentru a accesa valoarea de vârstă, trebuie să apelați metodele create:

    Account s = cont nou();

    Console.WriteLine("Vârsta: " + s.GetAge());

      1. Utilizarea Proprietăților

    Proprietățile facilitează gestionarea datelor. Proprietatea Age poate fi declarată după cum urmează:

    Cont de clasă publică

    private int ageValue;

    dacă ((valoare > 0) && (valoare< 120))

    ageValue = valoare;

    returnează ageValue;

    Aici valoarea de vârstă este o proprietate. Proprietatea declară secțiuni pentru scrierea și citirea valorii sale. Acțiunile descrise în aceste secțiuni sunt echivalente cu metodele descrise anterior. În acest caz, proprietățile sunt utilizate în același mod ca și câmpurile obișnuite:

    Account s = cont nou();

    Console.WriteLine("Vârsta: " + vârsta);

    Când proprietatea Age este setată la o valoare, se apelează codul secțiunii setate. Cuvântul cheie value denotă valoarea care este atribuită proprietății. Când citiți valoarea proprietății Age, se apelează codul secțiunii get. Această abordare combină avantajele utilizării metodelor și vă permite să lucrați cu proprietăți la fel de ușor ca și cu câmpurile de clasă.

    Verificarea corectitudinii datelor din proprietăți . Dacă încercați să setați o valoare de vârstă nevalidă (de exemplu, 150), codul de mai sus va efectua o verificare a valabilității și va respinge valoarea (nimeni peste 120 nu poate avea un cont la banca noastră), lăsând valoarea bătrâneții. Singura modalitate de a ști dacă unei proprietăți i s-a atribuit o valoare este de a verifica valoarea proprietății după această operație:

    Account s = cont nou();

    int newAge = 150;

    dacă (s.Age != newAge)

    Console.WriteLine("Valoarea vârstei nu a fost setată");

    Următorul cod încearcă să seteze vârsta la o valoare nevalidă de 150 și apoi verifică dacă acea valoare a fost setată. Dacă metoda Set ar fi folosită pentru a atribui valoarea, aceasta ar putea returna valoarea fals Dacă acest lucru nu reușește, atunci utilizarea proprietății necesită ca utilizatorul să facă ceva mai multă muncă.

    Diferite moduri de a citi valoarea unei proprietăți. Proprietățile vă permit să efectuați alte acțiuni utile.

    public int AgeInMonths

    returnează this.ageValue * 12;

    Noua proprietate AgeInMonths este descrisă aici. Este doar pentru citire deoarece nu conține o secțiune setată. Returnează valoarea vârstei în luni, folosind aceeași valoare ca proprietatea Age. Aceasta înseamnă că puteți folosi mai multe metode diferite pentru a obține aceeași valoare. Este posibil să se creeze proprietăți numai pentru citire fără a le putea schimba direct, precum și proprietăți numai pentru scriere, deși acestea din urmă sunt rar utilizate.

    Proprietățile elementelor vizuale . Este logic să folosiți proprietăți în descrierea unui cont bancar, unde trebuie să protejați datele din obiecte. Dar în Silverlight, puteți introduce orice text într-un element TextBlock și nu pare să fie nevoie să verificați validitatea valorii introduse. Rularea acestui cod va încetini procesul de introducere a valorii. Deci, făcând valoarea Text un șir public, programul ar conține mai puțin cod și ar rula mai repede.

    Dar când modificăm textul din elementul TextBlock, dorim să se schimbe și textul din pagina Silverlight, de exemplu când programul Adder afișează rezultatul. Dacă programul ar schimba pur și simplu valoarea câmpului, Silverlight nu ar avea de unde să știe că mesajul de pe ecran trebuie actualizat.

    Cu toate acestea, dacă Text este făcută o proprietate, atunci când valoarea elementului TextBlock este actualizată, se va rula metoda corespunzătoare, care poate actualiza valoarea stocată a casetei de text și poate apela o metodă pentru a actualiza ecranul pentru a afișa noua valoare. Proprietățile oferă capacitatea de a manipula un obiect atunci când valoarea acestuia se schimbă. Operare simplă:

    resultTextBlock.Text = "0";

    poate duce la câteva sute de operații C#, deoarece stocarea noii valori în elementul TextBlock declanșează operațiuni de actualizare a imaginii ecranului.