Kotiin / Ohjeet / Getterit ja setterit ovat taikuutta, jonka täytyy tietää paikkansa. Käyttöliittymän tietojoukko Aseta ominaisuuden pikamerkintä

Getterit ja setterit ovat taikuutta, jonka täytyy tietää paikkansa. Käyttöliittymän tietojoukko Aseta ominaisuuden pikamerkintä

Joseph Crawford, yksi lukijoistani, luki artikkelin siitä, kuinka en pidä getterien ja asettajien kirjoittamisesta, ja ehdotti, että voisin käyttää taika-__get- ja __set-menetelmiä.
Kerron sinulle, miksi ei ole hyvä idea käyttää niitä tavalliseen tapaan. Aion myös kertoa sinulle tarinan, jossa niistä oli todella hyötyä - staattisten tyyppien luomisessa PHP:llä (dynaaminen kieli).
Niille, jotka eivät tunne __get- ja __set -menetelmiä, ne ovat kaksi "magista" menetelmää, jotka toimivat seuraavasti:
luokka Eläin ( funktio __get($property) ( //... ) funktio __set($ominaisuus, $arvo) (//... ) ) $lehmä = uusi eläin; $lehmä->paino = "1 tonni"; // sama kuin $lehmä->__set("paino", "1 tonni") print $lehmä->paino; // sama kuin print $lehmä->__get("paino");

Tyypillisesti yllä olevia menetelmiä käytetään dynaamisten ominaisuuksien luomiseen. Mitä johtopäätöstä tästä voidaan vetää? Jos haluat luoda satunnaisia ​​ominaisuuksia, käytä vain tiivistettä (eli taulukkoa avaimilla).
Mitä hyvää gettereissä ja settereissä on?
Katsotaanpa:
luokka Animal ( julkinen $weightInKgs; ) $lehmä = uusi eläin; $lehmä->painoKgs = -100;

Mitä? Negatiivinen paino? Tämä on useimmista näkökulmista väärin.
Lehmä ei saa painaa alle 100 kg (luulen niin:). 1000 sisällä on hyväksyttävää.
Kuinka voimme varmistaa tällaisen rajoituksen?
__get:n ja __setin käyttäminen on melko nopea tapa.
class Animal ( yksityinen $ominaisuudet = array(); julkinen funktio __get($nimi) ( if(!empty($this->properties[$name])) ( return $this->properties[$name]; ) else ( throw new Exception("Määrittämätön ominaisuus ".$name." viitattu." ) ) julkinen funktio __set($name, $value) ( ​​if($name == "weight") ( if($arvo< 100) { throw new Exception("The weight is too small!") } } $this->ominaisuudet[$nimi] = $arvo;

) ) $lehmä = uusi eläin; $lehmä->painoKgs = -100; //heittää poikkeuksen
Entä jos sinulla on luokka, jossa on 10-20 omaisuutta ja tarkistaa ne? Tässä tapauksessa ongelmat ovat väistämättömiä.< 100) { throw new Exception("The weight is too small!") } if($this->julkinen funktio __set($nimi, $arvo) ( if($name == "paino") ( if($arvo

paino != $paino) ( Shepherd::notifyOfWeightChange($lehmä, $paino); ) ) if($nimi == "jalat") ( if($arvo != 4) ( heittää uusi Poikkeus("Jalkojen määrä on liian pieni tai liian suuri") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( .... ymmärrät idean ... ) $this->properties[$nimi] = $arvo;
)< 100) { throw new Exception("The weight is too small!"); } if($this->Sitä vastoin getterit ja asettajat ovat parhaimmillaan tietojen validoinnissa.

luokka Animal ( yksityinen $paino; yksityinen $numberOfLegs; yksityinen $numberOfHooves; julkinen $lempinimi; julkinen funktio setNumberOfLegs($numberOfLegs) ( if ($numberOfLegs != 100) ( heittää new Exception("Jalkojen määrä on liian vähän tai liian iso"); ) $this->numberOfLegs = $numberOflegs; $this->numberOfHooves = $numberOfLegs; ) julkinen funktio getNumberOfLegs() ( palauttaa $this->numberOfLegs; ) julkinen funktio setWeight($weight) ( if ($weight)
paino != $paino) ( Shepherd::notifyOfWeightChange($lehmä, $paino); ) $this->weight = $paino;
) julkinen funktio getWeight() ( palauttaa $this->weight; ) )
Mikään ei ole verrattavissa C#:n lyhyisiin funktioihin (get, set;). On todennäköistä, että tällainen tuki ilmestyy pian PHP: hen, mutta älkäämme toistaiseksi rentoutuko...
Jälleen, en todellakaan kirjoittanut kaikkia näitä saajia ja asettajia - PHP Storm teki sen puolestani. Kirjoitin vain seuraavan:
luokka Animal ( yksityinen $paino; yksityinen $numberOfLegs; )

Ja painettiin Alt+Insert -> Getterit ja asettajat. PHPStorm loi kaiken automaattisesti.
Nyt PHP Stormin lisäetuna minulla on mahdollisuus käyttää automaattista täydennystoimintoa työskennellessäni getterien ja asettajien kanssa:

Jos __get minulla ei ole tätä vaihtoehtoa, voin kirjoittaa vain tämän:
$lehmä->paino = -100

Nyt lehmä "painoa" (painot) miinus 100 kg.
Voin unohtaa, että tämä on paino kg, kirjoita vain paino ja kaikki toimii.
Joten getterit ja setterit voivat olla erittäin hyödyllisiä (mutta älä silti palvo niitä, et ole Java-ohjelmoija). Jos haluat vain ilmaisia ​​ominaisuuksia, käytä taulukkoa:
$lehmä = array("paino" => 100, "jalat" => 4);

Tämä temppu on paljon helpompi toteuttaa kuin __get and __set.
Mutta jos haluat varmistaa, että tiedoillasi on aina vain kelvollisia arvoja, käytä vahvistettavia asettimia. Jos sinulla on integroitu kehitysympäristö (IDE), kuten PHP Storm, tulet rakastamaan settereitä, koska niitä on niin helppo käyttää. PHP Stormin $cow->setLegs() sijaan riittää kirjoittaa cosl. Kyllä, se on helppoa! Kirjoitusvirheitä ei enää ole ja näet, mitä parametreja menetelmä ottaa.
__set-menetelmällä on toinen haittapuoli. Se hyväksyy vain 1 parametrin. Entä jos tarvitset 2? Esimerkiksi tässä: $kauppa1->setPrice("tuote-1", 100). Sinun on asetettava tuotteen hinta myymälässä. __set-metodi ei salli sinun tehdä tätä, mutta asettaja sallii.

Käyttöliittymän toteutus Sarja on järjestämätön kokoelma, joka ei voi sisältää päällekkäisiä tietoja.

Käyttöliittymä Sarja sisältää seuraavat menetelmät:

MenetelmäKuvaus
lisää (objekti o) Elementin lisääminen kokoelmaan, jos se puuttuu. Palauttaa tosi, jos elementti lisättiin.
lisää kaikki (kokoelma c) Lisäämällä kokoelman kohteita, jos niitä puuttuu.
selvä () Kokoelman tyhjentäminen.
sisältää (objekti o) Elementin läsnäolon tarkistaminen joukossa. Palauttaa tosi, jos elementti löytyy.
sisältääKaikki (kokoelma c) Kokoelman läsnäolon tarkistaminen sarjassa. Palauttaa tosi, jos kaikki elementit sisältyvät joukkoon.
yhtä suuri (objekti o) Tasa-arvon tarkistus.
hashCode() Joukon hash-koodin saaminen.
isEmpty() Elementtien läsnäolon tarkistaminen. Palauttaa tosi, jos kokoelmassa ei ole elementtejä.
iteraattori() Toiminto kokoelmaiteraattorin saamiseksi.
poista (objekti o) Elementin poistaminen joukosta.
poista kaikki (kokoelma c) Poistaa kaikki läpäisyn kokoelman elementit joukosta.
säilyttää kaikki (kokoelma c) Siirrettyyn kokoelmaan kuulumattomien elementtien poistaminen.
koko() Kokoelman elementtien lukumäärä
toArray() Joukkon muuntaminen elementtijoukoksi.
toArray(T a) Joukkon muuntaminen elementtijoukoksi. Toisin kuin edellinen menetelmä, joka palauttaa joukon Object-tyyppisiä objekteja, tämä menetelmä palauttaa joukon objekteja, joiden tyyppi on parametrissa välitetty.

Perheen käyttöliittymään Sarja sisältää HashSet, TreeSet Ja LinkedHashSet. Sarjoissa Sarja Eri toteutuksissa käytetään erilaista tallennusjärjestystä. HashSetissä elementtien järjestys on optimoitu nopeaa hakua varten. TreeSet-säilö tallentaa objektit nousevaan järjestykseen. LinkedHashSet tallentaa elementit lisäysjärjestyksessä.

HashSet Dataset

HashSet-konstruktorit:

// Luo tyhjä joukko, jonka alkukapasiteetti on 16 ja oletuslatauskerroin 0,75 public HashSet(); // Joukkon luominen kokoelmaelementeistä public HashSet(Collection c); // Luo joukko määritetyllä alkukapasiteetilla ja // oletuskuormituskertoimella (0.75) public HashSet(int originCapacity); // Luo joukko määritetyllä alkukapasiteetilla ja // kuormituskertoimella public HashSet(int alkuperäinenCapacity, float loadFactor);

HashSet-menetelmät

  • julkinen int koko()
  • julkinen boolean isEmpty()
  • julkinen boolen lisäys (objekti o)
  • julkinen boolean addAll(kokoelma c)
  • julkinen boolenpoisto(objekti o)
  • julkinen boolean removeAll (kokoelma c)
  • julkinen boolean sisältää(Objekti o)
  • public void clear()
  • julkinen objektin klooni()
  • julkinen iteraattori iteraattori()
  • julkinen Object toArray()
  • julkinen boolean säilyttää kaikki (kokoelma c)

HashSet sisältää menetelmiä, jotka ovat samanlaisia ​​kuin ArrayList. Poikkeuksena on add(Object o) -metodi, joka lisää objektin vain, jos se puuttuu. Jos objekti lisätään, add-metodi palauttaa tosi, muuten false.

Esimerkki HashSetin käytöstä:

HashSet hashSet = uusi HashSet (); hashSet.add("Perunat"); hashSet.add("Porkkana"); hashSet.add("juurikkaat"); hashSet.add("Kurkut"); // Seuraava merkintä ei saa olla joukossa hashSet.add("Perunat"); // Tulosta asetettu koko konsoliin System.out.println("HashSet size = " + hashSet.size()); // Tulosta Iterator-merkinnät konsoliin

Meidän pitäisi nähdä vain 4 merkintää konsolissa. On huomattava, että järjestys, jossa tietueet lisätään joukkoon, on arvaamaton. HashSet käyttää hajautustoimintoa nopeuttamaan hakua.

Käyttöesimerkki HashSet kokonaislukuarvoilla. Lisäämme joukkoon arvot 0-9 25 mahdollisesta satunnaisesti valitusta arvosta - päällekkäisyyttä ei tapahdu.

Satunnainen satunnainen = uusi Satunnainen(30); Sarja iset = uusi HashSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

On huomattava, että täytäntöönpano HashSet ei synkronoitu. Jos useat säikeet käyttävät hajautusjoukkoa samanaikaisesti ja yhden tai useamman säikeen on muokattava joukkoa, se on synkronoitava ulkoisesti. Tämä on parasta tehdä luomishetkellä, jotta estetään vahingossa tapahtuva synkronoimaton pääsy joukkoon:

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

LinkedHashSet-tietojoukko

Luokka LinkedHashSet perii HashSet lisäämättä uusia menetelmiä ja ylläpitää linkitettyä luetteloa joukon elementeistä siinä järjestyksessä, jossa ne lisättiin. Tämä mahdollistaa sarjaan lisäämisen säännöllisen iteraation.

LinkedHashSet-konstruktorit:

// Luo tyhjä joukko alkukapasiteetilla (16) ja oletuslatauskertoimella (0.75) public LinkedHashSet() // Luo joukko kokoelmaelementeistä public LinkedHashSet(Collection c) // Luo joukko määritetyllä alkukirjaimella kapasiteetti ja tekijän arvo oletuskuormitus (0,75) public LinkedHashSet(int originalCapacity) // Luo joukko määritetyllä alkukapasiteetilla ja kuormituskertoimella julkinen LinkedHashSet(int alkuperäinenCapacity, float loadFactor)

Ihan kuin HashSet, LinkedHashSet ei synkronoitu. Siksi, kun käytät tätä toteutusta sovelluksessa, jossa on monia säikeitä, joista osa voi tehdä muutoksia joukkoon, synkronointi tulisi suorittaa luontivaiheessa:

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

TreeSet-tietojoukko

Luokka TreeSet luo kokoelman, joka käyttää puuta elementtien tallentamiseen. Objektit tallennetaan nousevaan järjestykseen.

TreeSet-konstruktorit:

// Luo tyhjä puujoukko, lajiteltu // sen elementtien luonnollisen järjestyksen mukaan TreeSet() // Luo puujoukko, joka sisältää määritetyn joukon elementit, // lajiteltuna sen elementtien luonnollisen järjestyksen mukaan. TreeSet(kokoelmac) // Luo tyhjä puujoukko, joka on lajiteltu vertailijan TreeSet(Comparatorvertailija) // Luo puujoukko, joka sisältää samat elementit ja käyttäen // samaa järjestystä kuin määritetty lajiteltu joukko TreeSet(SortedSet s)

TreeSet Methods

  • boolen lisäys (objekti o)
  • boolean addAll(kokoelmac)
  • Objektin katto (Objekti o)
  • void clear ()
  • TreeSet-klooni()
  • Vertailijavertailija()
  • boolean sisältää(Objekti o)
  • Iteraattori descendingIterator()
  • NavigableSet laskevajoukko()
  • Objekti ensin ()
  • Objektin kerros (Objekti o)
  • LajiteltuSet kuulokemikrofoni (E e)
  • NavigableSet headSet (E e, boolean mukaan lukien)
  • Kohde ylempänä (objekti o)
  • boolean isEmpty()
  • Iteraattori iteraattori()
  • Elast()
  • E alempi (E e)
  • E kysely Ensimmäinen()
  • E kysely Viimeinen()
  • boolen poisto (objekti o)
  • int size ()
  • Jakaja splitter()
  • NavigableSet osajoukko (E elementistä, looginen arvo inclusivesta, E elementistä, looginen arvo inclusive)
  • LajiteltuSet osajoukko (E elementistä, E elementistä)
  • LajiteltuSet tailSet (E elementistä)
  • NavigableSet tailSet (E elementistä, boolean mukaan lukien)
  • Seuraavassa muokatussa esimerkissä käytöstä TreeSet Arvot tulostetaan konsoliin järjestetyssä muodossa.

    LajiteltuSet treeSet = uusi TreeSet (); treeSet.add("juurikkaat"); treeSet.add("Kurkut"); treeSet.add("Tomaatit"); treeSet.add("Perunat"); treeSet.add("Porkkana"); // Tätä merkintää ei pitäisi sisällyttää joukkoon treeSet.add("Perunat"); // Tulosta joukon koko konsoliin System.out.println("treeSet size = " + treeSet.size()); // Tulosta Iterator-merkinnät konsoliin itr = treeSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Satunnainen satunnainen = new Random(30); LajiteltuSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoriset = uusi puujoukko

    itr = iset.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); )

    Viimeisin päivitys: 29.07.2018

    Tavallisten menetelmien lisäksi C#-kieli tarjoaa erityisiä pääsymenetelmiä, joita kutsutaan ominaisuuksiksi. Ne tarjoavat helpon pääsyn luokkakenttiin, selvittää niiden arvon tai asettaa ne.

    Ominaisuuden vakiokuvauksessa on seuraava syntaksi:

    [access_modifier] return_type custom_name ( // ominaisuuskoodi )

    Esimerkiksi:

    Luokan henkilö ( yksityinen merkkijonon nimi; julkinen merkkijono Nimi ( get ( palauttaa nimi; ) set ( nimi = arvo; ) ) )

    Tämän ominaisuuden kautta voimme hallita pääsyä nimimuuttujaan. Standardiominaisuusmäärittely sisältää get- ja set-lohkot. Get-lohkossa palautamme kentän arvon ja set-lohkossa asetamme sen. Arvoparametri edustaa välitettävää arvoa.

    Voimme käyttää tätä omaisuutta seuraavasti:

    Henkilö p = uusi Henkilö(); // Aseta ominaisuus - Set-lohko laukeaa // arvo "Tom" on arvo, joka välitetään ominaisuudelle p.Name = "Tom"; // Hae ominaisuuden arvo ja määritä se muuttujalle - Get string personName = p.Name -lohko laukeaa;

    Ehkä herää kysymys, miksi tarvitsemme ominaisuuksia, jos tässä tilanteessa pärjäämme tavallisilla luokkakentillä? Mutta ominaisuuksien avulla voit lisätä logiikkaa, joka voi olla tarpeen esimerkiksi määritettäessä arvoa luokkamuuttujalle. Meidän on esimerkiksi määritettävä iän tarkistus:

    Luokka Henkilö ( yksityinen int ikä; julkinen int Ikä ( set ( if (arvo< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

    Set- ja get-lohkojen ei tarvitse olla läsnä omaisuudessa samanaikaisesti. Jos ominaisuus on määritelty vain get-lohkolla, ominaisuus on vain luku - saamme sen arvon, mutta emme aseta sitä. Päinvastoin, jos ominaisuudella on vain asetettu lohko, tämä ominaisuus on vain kirjoitettava - voit asettaa vain arvon, mutta et saa sitä:

    Luokan henkilö ( yksityinen merkkijonon nimi; // vain luku -ominaisuus julkinen merkkijono Nimi ( get ( paluunimi; ) ) yksityinen int ikä; // vain kirjoitusominaisuus public int Ikä ( set ( ikä = arvo; ) ) )

    Pääsyn muokkaajat

    Voimme soveltaa käyttöoikeusmuutoksia koko kiinteistön lisäksi myös yksittäisiin lohkoihin - joko hanki tai aseta:

    Luokan henkilö ( yksityinen merkkijonon nimi; julkinen merkkijono Nimi ( get ( paluunimi; ) yksityinen joukko ( nimi = arvo; ) ) julkinen henkilö (merkkijonon nimi, int ikä) ( Nimi = nimi; Ikä = ikä; ) )

    Nyt voimme käyttää suljettua joukko-lohkoa vain tässä luokassa - sen menetelmissä, ominaisuuksissa, konstruktorissa, mutta ei toisessa luokassa:

    Henkilö p = uusi henkilö("Tom", 24); // Virhe - joukko ilmoitetaan yksityisellä muokkaimella //p.Name = "John"; Console.WriteLine(p.Nimi);

    Käytettäessä muuntajia ominaisuuksissa, on otettava huomioon useita rajoituksia:

      Muuttaja set- tai get-lohkolle voidaan asettaa, jos ominaisuudella on sekä set- että get-lohkot.

      Vain yhdellä set- tai get-lohkolla voi olla pääsymuokkaus, mutta ei molemmilla

      Set- tai get-lohkon käyttöoikeusmuuttajan on oltava rajoittavampi kuin ominaisuuden käyttöoikeusmuuttajan. Esimerkiksi, jos ominaisuuden muokkaus on julkinen, set/get-lohkossa voi olla vain suojattuja määritteitä sisäinen, sisäinen, suojattu, yksityinen.

    Kapselointi

    Näimme edellä, että pääsy yksityisen luokan muuttujiin muodostetaan ominaisuuksien kautta. Luokan tilan piilottaminen ulkopuolisilta häiriöiltä tällä tavalla edustaa kapselointimekanismia, joka edustaa yhtä olio-ohjelmoinnin avainkäsitteitä. (On syytä huomata, että kapseloinnin käsitteellä on useita erilaisia ​​tulkintoja, jotka eivät aina mene päällekkäin) Yksityisten pääsyn muokkaajien käyttö suojaa muuttujaa ulkoiselta pääsyltä. Pääsyn hallitsemiseksi monet ohjelmointikielet käyttävät erikoismenetelmiä, gettereitä ja asettimia. C#:ssa niiden roolia ovat yleensä ominaisuudet.

    Esimerkiksi jollakin tililuokalla on summakenttä, joka edustaa summaa:

    Luokan tili (julkinen välisumma; )

    Koska summamuuttuja on julkinen, voimme käyttää sitä missä tahansa ohjelmassa ja muuttaa sitä, mukaan lukien asettamalla virheellisen arvon, esimerkiksi negatiivisen. On epätodennäköistä, että tällainen käytös on toivottavaa. Siksi kapselointia käytetään rajoittamaan pääsyä summamuuttujaan ja piilottamaan se luokan sisällä:

    Luokkatili ( yksityinen int summa; public int Sum ( get (palautussumma;) set ( if (arvo > 0) ( summa=arvo; ) ) ) )

    Automaattiset ominaisuudet

    Ominaisuudet hallitsevat pääsyä luokan kenttiin. Mutta entä jos kenttiä on kymmenkunta tai useampia, jokaisen kentän määrittäminen ja samantyyppisen ominaisuuden kirjoittaminen sille olisi työlästä. Siksi automaattiset ominaisuudet lisättiin .NET-kehykseen. Heillä on lyhennetty ilmoitus:

    Luokan henkilö ( julkinen merkkijono Nimi ( get; set; ) public int Ikä ( get; set; ) julkinen henkilö (merkkijonon nimi, int ikä) ( Nimi = nimi; Ikä = ikä; ) )

    Itse asiassa tänne luodaan myös kenttiä ominaisuuksille, mutta niitä ei ole ohjelmoijan luomassa koodissa, vaan kääntäjä luo ne automaattisesti kääntämisen aikana.

    Mitä etua automaattisista ominaisuuksista on, jos ne pohjimmiltaan vain pääsevät automaattisesti luotuun muuttujaan, miksi ei suoraan käsiksi muuttujaan ilman automaattisia ominaisuuksia? Tosiasia on, että milloin tahansa voimme tarvittaessa laajentaa automaattisen ominaisuuden tavalliseksi omaisuudeksi ja lisätä siihen tiettyä logiikkaa.

    On syytä ottaa huomioon, että et voi luoda automaattista vain kirjoitusominaisuutta, kuten tavallisten ominaisuuksien tapauksessa.

    Automaattisille ominaisuuksille voidaan määrittää oletusarvot (automaattisten ominaisuuksien alustus):

    Luokan henkilö ( julkinen merkkijono Nimi ( get; set; ) = "Tom"; public int Ikä ( get; set; ) = 23; ) luokka Ohjelma ( staattinen void Main(string args) ( Henkilö henkilö = uusi henkilö(); konsoli .WriteLine(person.Name); // Tom Console.WriteLine(person.Ikä) // 23 Console.Read();

    Ja jos emme määritä Henkilö-objektin Nimi- ja Ikä-ominaisuuksien arvoja, oletusarvoja sovelletaan.

    Automaattisilla ominaisuuksilla voi myös olla käyttöoikeusmuutoksia:

    Luokan henkilö ( julkinen merkkijono Nimi ( yksityinen joukko; get;) julkinen henkilö (merkkijono n) ( Nimi = n; ) )

    Voimme poistaa asetuslohkon ja tehdä automaattisen ominaisuuden vain luku -muotoiseksi. Tässä tapauksessa tämän ominaisuuden arvon tallentamiseksi sille luodaan implisiittisesti kenttä, jossa on vain luku -muuttaja, joten on otettava huomioon, että tällaiset get-ominaisuudet voidaan asettaa joko luokan rakentajasta, kuten esimerkissä edellä tai omaisuutta alustaessasi:

    Luokan henkilö (julkinen merkkijono Nimi ( get;) = "Tom")

    Lyhyt merkintä ominaisuuksille

    Kuten menetelmät, voimme lyhentää ominaisuuksia. Esimerkiksi:

    Luokan henkilö ( yksityinen merkkijonon nimi; // vastaava julkisen merkkijonon nimi ( get ( paluunimi; ) ) julkinen merkkijono Nimi => nimi; )

    Voit hallita kenttien käyttöä luomalla hankinta- ja asetusmenetelmiä ja julkistamalla ne. Ne tarjoavat mahdollisuuden hallita kentälle pääsyä. Samalla Ikä-kenttä on parempi tehdä yksityiseksi, jotta siihen ei pääse suoraan luokan ulkopuolelta.

    julkisen luokan tili

    yksityinen int ikä;

    julkinen int GetAge()

    palauta tämä.ikä;

    public void SetAge(int inAge)

    if ((inAge > 0) && (inAge< 120))

    this.age = inIge;

    Nyt voimme hallita kentällemme pääsyä, mutta tämä vaatii paljon lisäkoodin kirjoittamista. Ikäarvon saamiseksi sinun on kutsuttava luodut menetelmät:

    Tili s = uusi tili();

    Console.WriteLine("Ikä: " + s.GetAge());

      1. Ominaisuuksien käyttäminen

    Ominaisuudet helpottavat tiedonhallintaa. Ikä-ominaisuus voidaan ilmoittaa seuraavasti:

    julkisen luokan tili

    yksityinen int ageValue;

    if ((arvo > 0) && (arvo< 120))

    ageValue = arvo;

    palauttaa ageValue;

    Tässä ikäarvo on omaisuus. Kiinteistö ilmoittaa osia arvon kirjoittamista ja lukemista varten. Näissä osissa kuvatut toimet vastaavat aiemmin kuvattuja menetelmiä. Tässä tapauksessa ominaisuuksia käytetään samalla tavalla kuin tavallisia kenttiä:

    Tili s = uusi tili();

    Console.WriteLine("Ikä: " + s.Ikä);

    Kun Ikä-ominaisuuden arvoksi on asetettu arvo, kutsutaan set-osion koodia. Arvoavainsana ilmaisee arvon, joka on määritetty ominaisuudelle. Kun luetaan Age-ominaisuuden arvo, kutsutaan get-osion koodia. Tämä lähestymistapa yhdistää menetelmien käytön edut ja mahdollistaa ominaisuuksien käsittelyn yhtä helposti kuin luokkakenttien kanssa.

    Ominaisuuksien tietojen oikeellisuuden tarkistaminen . Jos yrität asettaa virheellisen ikäarvon (esimerkiksi 150), yllä oleva koodi suorittaa kelpoisuustarkistuksen ja hylkää arvon (yli 120-vuotiaalla ei voi olla tiliä pankissamme), jolloin vanhuusarvo jää jäljelle. Ainoa tapa tietää, onko omaisuudelle määritetty arvo, on tarkistaa kiinteistön arvo tämän toimenpiteen jälkeen:

    Tili s = uusi tili();

    int uusi Ikä = 150;

    if (s.Age != newAge)

    Console.WriteLine("Ikäarvoa ei asetettu");

    Seuraava koodi yrittää asettaa iän virheelliseksi arvoksi 150 ja tarkistaa sitten, onko tämä arvo asetettu. Jos arvon määrittämiseen käytettiin Set-menetelmää, se voisi palauttaa arvon väärä Jos tämä epäonnistuu, ominaisuuden käyttäminen vaatii käyttäjältä hieman ylimääräistä työtä.

    Eri tapoja lukea kiinteistön arvo. Ominaisuuksien avulla voit suorittaa muita hyödyllisiä toimintoja.

    julkinen int AgeInMonths

    palauttaa this.ageValue * 12;

    Uusi AgeInMonths-ominaisuus on kuvattu tässä. Se on vain luku -tilassa, koska se ei sisällä asetettua osaa. Se palauttaa ikäarvon kuukausina käyttäen samaa arvoa kuin Ikä-ominaisuus. Tämä tarkoittaa, että voit käyttää useita eri menetelmiä saadaksesi saman arvon. On mahdollista luoda vain luku -ominaisuuksia ilman, että niitä voi muuttaa suoraan, sekä vain kirjoitusominaisuuksia, vaikka jälkimmäisiä käytetään harvoin.

    Visuaalisten elementtien ominaisuudet . On järkevää käyttää ominaisuuksia pankkitilin kuvauksessa, jossa objektien tiedot on suojattava. Mutta Silverlightissa voit kirjoittaa minkä tahansa tekstin TextBlock-elementtiin, eikä syötetyn arvon oikeellisuutta tarvitse tarkistaa. Tämän koodin suorittaminen hidastaa arvon syöttöprosessia. Joten jos Teksti-arvosta tehdään julkinen merkkijono, ohjelma sisältäisi vähemmän koodia ja toimisi nopeammin.

    Mutta kun muutamme tekstiä TextBlock-elementissä, haluamme myös Silverlight-sivun tekstin muuttuvan, esimerkiksi kun Adder-ohjelma näyttää tuloksen. Jos ohjelma vain muuttaisi kentän arvoa, Silverlightilla ei olisi mitään mahdollisuutta tietää, että näytöllä oleva viesti on päivitettävä.

    Jos Teksti kuitenkin tehdään ominaisuudeksi, kun TextBlock-elementin arvo päivitetään, vastaava menetelmä suoritetaan, joka voi päivittää tekstilaatikon tallennetun arvon ja kutsua menetelmän päivittää näyttö näyttämään uusi arvo. Ominaisuudet tarjoavat mahdollisuuden käsitellä objektia sen arvon muuttuessa. Yksinkertainen toiminta:

    resultTextBlock.Text = "0";

    voi aiheuttaa useita satoja C#-operaatioita, koska uuden arvon tallentaminen TextBlock-elementtiin käynnistää toiminnot näytön kuvan päivittämiseksi.