Үй / Нұсқаулар / Алушылар мен орнатушылар - өз орнын білуі керек сиқырлар. Интерфейс деректер жиыны Сипаттың стенографиялық белгісі

Алушылар мен орнатушылар - өз орнын білуі керек сиқырлар. Интерфейс деректер жиыны Сипаттың стенографиялық белгісі

Джозеф Кроуфорд, менің оқырмандарымның бірі, мен гетер және сеттер жазуды қалай ұнатпайтыным туралы мақаланы оқып, сиқырлы __get және __set әдістерін қолдануға болатынын айтты.
Неліктен оларды әдеттегідей пайдалану жақсы идея емес екенін айтамын. Сондай-ақ, мен сізге олар шынымен де пайдалы болған оқиғаны айтып беремін - PHP (динамикалық тіл) тілінде статикалық типтерді жасау.
__get және __set әдістерімен таныс емес адамдар үшін олар келесідей жұмыс істейтін екі «сиқырлы» әдіс:
класс Animal (функция __get($property) ( //... ) функциясы __set($property, $value) ( //... ) ) $cow = new Animal; $сиыр->салмағы = "1 тонна"; // бірдей $cow->__set("weight", "1 ton") басып шығару $cow->weight; // бірдей басып шығару $cow->__get("салмақ");

Әдетте динамикалық қасиеттерді құру үшін жоғарыда аталған әдістер қолданылады. Бұдан қандай қорытынды жасауға болады? Кез келген кездейсоқ сипаттарды жасағыңыз келсе, жай ғана хэшті пайдаланыңыз (мысалы, пернелері бар массив).
Алушылар мен орнатушылардың несі жақсы?
Көрейік:
сынып Жануар (қоғамдық $салмақInKgs; ) $сиыр = жаңа Жануар; $сиыр->салмақInKgs = -100;

Не? Теріс салмақ? Бұл көптеген көзқарастар бойынша дұрыс емес.
Сиырдың салмағы 100 кг-нан кем болмауы керек (менің ойымша:). 1000 шегінде қабылданады.
Мұндай шектеуді қалай қамтамасыз ете аламыз?
__get және __set пайдалану өте жылдам әдіс.
class Animal ( private $properties = array(); public function __get($name) ( if(!empty($this->properties[$name])) ( return $this->properties[$name]; ) else ( throw new Exception("Анықталмаған сипат ".$name." сілтеме жасалды." ) ) жалпы функция __set($name, $value) (if($name == "салмақ") ( if($value)< 100) { throw new Exception("The weight is too small!") } } $this->қасиеттер[$аты] = $мән;

) ) $сиыр = жаңа жануар; $сиыр->салмақInKgs = -100; //Ерекше жағдайды шығарады
Егер сізде 10-20 қасиеті бар сынып болса және оларды тексерсе ше? Бұл жағдайда қиындықтар сөзсіз.< 100) { throw new Exception("The weight is too small!") } if($this->жалпы функция __set($name, $value) (if($name == "салмақ") ( if($value)

салмақ != $салмақ) ( Shepherd::notifyOfWeightChange($cow, $weight); ) ) if($name == "аяғы") ( if($value != 4) ( throw new Exception("Аяқтардың саны" тым аз немесе тым үлкен") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( .... сіз идеяны түсінесіз ... ) $this->properties[$name] = $value;
)< 100) { throw new Exception("The weight is too small!"); } if($this->Керісінше, деректерді тексеру кезінде қабылдаушылар мен орнатушылар ең жақсы жағдайда.

class Animal ( private $weight; private $numberOfLegs; private $numberOfHooves; public $nickname; public function setNumberOfLegs($numberOfLegs) ( if ($numberOfLegs != 100) ( throw new Exception («Аяқтардың саны тым аз немесе тым аз) big"); ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) жалпы функция getNumberOfLegs() ( return $this->numberOfLegs; ) public функциясы setWeight($weight) ( if ($weight)
салмақ != $салмақ) ( Шопан::notifyOfWeightChange($сиыр, $салмақ); ) $this->салмақ = $салмақ;
) getWeight() қоғамдық функциясы ($this->weight; ) қайтарыңыз)
C# тіліндегі қысқа функциялармен (алу, орнату;) ештеңе салыстырылмайды. Жақында мұндай қолдау PHP-де пайда болуы мүмкін, бірақ әзірге босаңсуға болмайды...
Тағы да, мен бұл қабылдаушылар мен орнатушылардың барлығын жазған жоқпын - PHP Storm мұны мен үшін жасады. Мен жай ғана келесіні жаздым:
сынып Жануар (жеке $салмағы; жеке $numberOfLegs; )

Және Alt+Insert -> Қабылдағыштар мен орнатушылар пернесін басыңыз. PHPStorm барлығын автоматты түрде жасады.
Енді, PHP Storm қосымша артықшылығы ретінде, қабылдаушылармен және орнатушылармен жұмыс істегенде, мен автотолтыру функциясын пайдалана аламын:

__get жағдайында менде бұл опция жоқ, мен тек мынаны жаза аламын:
$сиыр->салмақ = -100

Қазір сиырдың «салмағы» (салмағы) минус 100 кг.
Мен бұл кг салмақ екенін ұмытып кетемін, тек салмақты жазыңыз және бәрі жұмыс істейді.
Сонымен, қабылдаушылар мен орнатушылар өте пайдалы болуы мүмкін (бірақ оларға табынбаңыз, сіз Java бағдарламашысы емессіз). Егер сіз жай ғана тегін сипаттарды алғыңыз келсе, массивді пайдаланыңыз:
$сиыр = массив("салмақ" => 100, "аяғы" => 4);

Бұл трюк __get және __ орнатудан гөрі оңайырақ.
Бірақ, деректеріңізде әрқашан жарамды мәндер бар екеніне көз жеткізгіңіз келсе, тексеруі бар орнатушыларды пайдаланыңыз. Егер сізде PHP Storm сияқты біріктірілген әзірлеу ортасы (IDE) болса, сіз орнатушыларды жақсы көресіз, себебі оларды пайдалану өте оңай. PHP Storm үшін $cow->setLegs() орнына cosl теру жеткілікті болады. Иә, бұл оңай! Ешқандай қателер жоқ және әдіс қандай параметрлерді қажет ететінін көре аласыз.
__set әдісінің тағы бір кемшілігі бар. Ол тек 1 параметрді қабылдайды. Сізге 2 керек болса ше? Мысалы, мына жердегі сияқты: $store1->setPrice("item-1", 100). Дүкенде өнімнің бағасын орнату керек. __set әдісі мұны істеуге мүмкіндік бермейді, бірақ орнатушы мүмкіндік береді.

Интерфейсті іске асыру Орнатуқайталанатын деректерді қамтымайтын ретсіз жинақ болып табылады.

Интерфейс Орнатукелесі әдістерді қамтиды:

ӘдісСипаттама
қосу(o нысаны) Элемент жоқ болса, жинаққа қосу. Элемент қосылған болса, шын мәнін қайтарады.
addAll(c жинағы) Жинақ элементтері жоқ болса, қосу.
таза() Жинақты тазалау.
қамтиды (o нысаны) Жиында элементтің болуын тексеру. Элемент табылса, true мәнін қайтарады.
Барлығын қамтиды(c жинағы) Жиынтықта коллекцияның болуын тексеру. Барлық элементтер жиында болса, шын мәнін қайтарады.
тең(o нысаны) Теңдікті тексеру.
hashCode() Жиынның хэшкодын алу.
isEmpty() Элементтердің болуын тексеру. Жинақта элементтер болмаса, шын мәнін қайтарады.
итератор() Коллекция итераторын алу функциясы.
жою (о нысаны) Жиыннан элементті жою.
removeAll(C жинағы) Жиыннан өткізілген жинақтың барлық элементтерін жояды.
retainAll(c жинағы) Өткізілген жинаққа жатпайтын элементтерді жою.
size() Коллекция элементтерінің саны
toArray() Жиынды элементтер массивіне түрлендіру.
toArray(T a) Жиынды элементтер массивіне түрлендіру. Object түріндегі нысандар жиымын қайтаратын алдыңғы әдіске қарағанда, бұл әдіс параметрде берілген түрдегі нысандар жиымын қайтарады.

Отбасы интерфейсі үшін Орнатуқамтиды HashSet, Tree SetЖәне LinkedHashSet. Жиынтықта ОрнатуӘртүрлі іске асыру элементтерді сақтаудың әртүрлі ретін пайдаланады. HashSet-те элементтердің реті жылдам іздеу үшін оңтайландырылған. TreeSet контейнері өсу ретімен сұрыпталған нысандарды сақтайды. LinkedHashSet элементтерді қосылған ретімен сақтайды.

HashSet деректер жинағы

HashSet конструкторлары:

// Бастапқы сыйымдылығы 16 және әдепкі жүктеу коэффициенті 0,75 жалпы HashSet() болатын бос жиынды жасаңыз; // Жинақ элементтерінен жиын құру public HashSet(Collection c); // Көрсетілген бастапқы сыйымдылығы бар жиынды жасаңыз және // әдепкі жүктеу коэффициенті (0,75) public HashSet(int initialCapacity); // Көрсетілген бастапқы сыйымдылығы бар жиынды жасаңыз және // жүктеу факторы public HashSet(int initialCapacity, float loadFactor);

HashSet әдістері

  • public int size()
  • жалпы логикалық isEmpty()
  • жалпы логикалық қосу (o нысаны)
  • жалпы логикалық addAll(c жинағы)
  • жалпы логикалық жою (o нысаны)
  • жалпы логикалық removeAll(С жинағы)
  • жалпы логикалық құрамында (o нысаны)
  • қоғамдық жарамсыз таза()
  • Қоғамдық нысан клоны()
  • public Iterator итераторы()
  • public Object toArray()
  • жалпы логикалық retainAll(c жинағы)

HashSetқұрамында ArrayList-ке ұқсас әдістер бар. Ерекшелік - ол жоқ болса ғана нысанды қосатын add(Object o) әдісі. Нысан қосылса, add әдісі ақиқат, әйтпесе жалған мәнін қайтарады.

HashSet пайдалану мысалы:

HashSet hashSet = жаңа HashSet (); hashSet.add("Картоп"); hashSet.add («Сәбіз»); hashSet.add («Қызылша»); hashSet.add("Қияр"); // Келесі жазба hashSet.add("Картоп") жиынында болмауы керек; // Жиын өлшемін консольге басып шығарыңыз System.out.println("HashSet size = " + hashSet.size()); // Итератор жазбаларын консольге басып шығару

Біз консольде тек 4 жазбаны көруіміз керек. Айта кету керек, жазбаларды жинаққа қосу реті болжанбайтын болады. HashSetіздеуді жылдамдату үшін хэшингті пайдаланады.

Қолдану мысалы HashSetбүтін мәндермен. Жиынға кездейсоқ таңдалған 25 мүмкін мәннің 0-ден 9-ға дейінгі мәндерді қосамыз - қайталану болмайды.

Кездейсоқ кездейсоқ = жаңа Кездейсоқ (30); Орнату iset = жаңа хэштер жинағы (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

жүзеге асыруды атап өту керек HashSetсинхрондалмаған. Бірнеше ағындар хэш жиынына бір уақытта қатынасса және бір немесе бірнеше ағындар жиынды өзгертуі керек болса, онда ол сыртқы синхрондалу керек. Бұл жинаққа кездейсоқ синхрондалмаған қатынасты болдырмау үшін жасау уақытында жақсы орындалады:

Орнату set = Collections.synchronizedSet(жаңа HashSet ());

LinkedHashSet деректер жинағы

Сынып LinkedHashSetмұра етеді HashSetешқандай жаңа әдістерді қоспай және жиын элементтерінің байланыстырылған тізімін олар енгізілген ретпен жүргізеді. Бұл жинаққа кірістірудің реттелген қайталануына мүмкіндік береді.

LinkedHashSet конструкторлары:

// Бастапқы сыйымдылығы (16) және әдепкі жүктеу коэффициенті мәні (0,75) бар бос жиынды жалпыға ортақ LinkedHashSet() жасаңыз // Жиынның жалпы элементтерінен жиын жасаңыз LinkedHashSet(Collection c) // Көрсетілген бастапқы мәні бар жиын жасаңыз сыйымдылық және фактор мәні әдепкі жүктеме (0,75) жалпыға ортақ LinkedHashSet(int initialCapacity) // Көрсетілген бастапқы сыйымдылық және жүктеме коэффициенті бар жиын жасау public LinkedHashSet(int initialCapacity, float loadFactor)

Дәл сияқты HashSet, LinkedHashSetсинхрондалмаған. Сондықтан, бұл іске асыруды көптеген ағындары бар қолданбада пайдаланған кезде, олардың кейбіреулері жиынға өзгертулер енгізе алады, синхрондау жасау сатысында орындалуы керек:

Орнату set = Collections.synchronizedSet(жаңа LinkedHashSet ());

TreeSet деректер жинағы

Сынып Tree Setэлементтерді сақтау үшін ағашты пайдаланатын жинақты жасайды. Нысандар сұрыпталған өсу ретімен сақталады.

TreeSet конструкторлары:

// Табиғи бойынша сұрыпталған бос ағаштар жинағын жасаңыз // оның элементтерінің реті TreeSet() // Көрсетілген жиындағы элементтерді қамтитын ағаш жиынын жасаңыз, // элементтерінің табиғи ретіне сәйкес сұрыпталған. TreeSet(Жинақc) // TreeSet(Comparatorкомпаратор) // Бірдей элементтерден тұратын және // көрсетілген сұрыпталған жиынтық сияқты бірдей ретті пайдалану арқылы ағаш жиынын жасаңыз TreeSet(SortedSet) с)

TreeSet әдістері

  • логикалық қосу(o нысаны)
  • логикалық addAll(Жинақв)
  • Объектінің төбесі (объектісі)
  • жарамсыз таза()
  • TreeSet клоны()
  • Салыстырғышкомпаратор()
  • логикалық құрамында (o нысаны)
  • Итератор descendingIterator()
  • Navigaable Set descendingSet()
  • Бірінші нысан()
  • Объектінің қабаты (объектісі)
  • SortedSet гарнитура(E e)
  • Navigaable Set гарнитура(E e, логикалық қосылған)
  • Жоғарырақ нысан (o нысаны)
  • логикалық бос()
  • Итератор итератор()
  • Elast()
  • E төмен(E e)
  • E pollFirst()
  • E pollLast()
  • логикалық жою (o нысаны)
  • int өлшемі()
  • Сплитератор сплит()
  • Navigaable Set subset(E fromElement, логикалық fromInclusive, E toElement, логикалық toInclusive)
  • SortedSet ішкі жиын(E элементінен, E элементінен)
  • SortedSet tailSet(E fromElement)
  • Navigaable Set tailSet(E fromElement, логикалық қосылған)
  • Келесі өзгертілген мысалда пайдаланудан Tree SetМәндер реттелген пішінде консольге шығарылады.

    SortedSet treeSet = жаңа TreeSet (); treeSet.add («Қызылша»); treeSet.add("Қияр"); treeSet.add("Қызанақтар"); treeSet.add("Картоп"); treeSet.add («Сәбіз»); // Бұл жазба treeSet.add("Картоп") жиынына қосылмауы керек; // Жинақ өлшемін консольге басып шығару System.out.println("treeSet size = " + treeSet.size()); // Итератор жазбаларын консольге басып шығару itr = treeSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Кездейсоқ кездейсоқ = жаңа Кездейсоқ(30); SortedSet (); for(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoriset = жаңа ағаш жиыны

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

    Соңғы жаңарту: 29.07.2018

    Кәдімгі әдістерден басқа, C# тілі сипаттар деп аталатын арнайы қатынас әдістерін қамтамасыз етеді. Олар сынып өрістеріне оңай қол жеткізуді қамтамасыз етеді, олардың мәнін анықтайды немесе орнатады.

    Стандартты сипат сипаттамасы келесі синтаксиске ие:

    [access_modifier] қайтару_түрі теңшелетін_атауы ( // сипат коды )

    Мысалы:

    Класс тұлғасы ( жеке жол атауы; жалпы жол атауы ( get (қайтару атауы; ) жиынтық ( name = мән; ) ) )

    Бұл сипат арқылы біз атау айнымалысына қол жеткізуді басқара аламыз. Стандартты сипат анықтамасында алу және орнату блоктары бар. get блогында өрістің мәнін қайтарамыз, ал жиынтық блокта оны орнатамыз. Мән параметрі жіберілетін мәнді білдіреді.

    Біз бұл сипатты келесідей пайдалана аламыз:

    Person p = new Person(); // Қасиетті орнату - Set блогы іске қосылды // «Tom» мәні p.Name = «Tom» сипатына берілген мән; // Сипаттың мәнін алыңыз және оны айнымалыға тағайындаңыз - Get жолы personName = p.Name блогы іске қосылады;

    Мүмкін сұрақ туындауы мүмкін, егер біз бұл жағдайда қарапайым класс өрістерімен жұмыс істей алсақ, неге қасиеттер қажет? Бірақ сипаттар қажет болуы мүмкін қосымша логиканы қосуға мүмкіндік береді, мысалы, класс айнымалысына мән тағайындағанда. Мысалы, біз жасты тексеруді орнатуымыз керек:

    Сынып адамы (жеке инт жас; public int Age (орнатылған (егер (мәні).< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

    Жиын және алу блоктарының бір уақытта сипатта болуы міндетті емес. Егер сипат тек get блогымен анықталса, онда сипат тек оқуға арналған – біз оның мәнін ала аламыз, бірақ оны орнатпаймыз. Керісінше, егер сипат тек жиынтық блокқа ие болса, онда бұл сипат тек жазуға болады - тек мәнді орнатуға болады, бірақ оны ала алмайсыз:

    Класс тұлғасы (жеке жол атауы; // тек оқуға арналған сипаттың жалпы жолы Аты ( get (қайтару атауы; ) ) private int age; // тек жазуға арналған сипат public int Age ( жиын ( жас = мән; ) ) )

    Қол жеткізу модификаторлары

    Біз кіру модификаторларын тек бүкіл сипатқа ғана емес, сонымен қатар жеке блоктарға да қолдана аламыз - алу немесе орнату:

    Класс тұлғасы ( жеке жол атауы; жалпы жол Аты ( get ( қайтарылатын атау; ) жеке жиын ( name = мән; ) ) жалпы тұлға (жол атауы, int жасы) ( Аты = аты; Жасы = жасы; ) )

    Енді біз жабық жиын блогын тек осы класста – оның әдістерінде, қасиеттерінде, конструкторында пайдалана аламыз, бірақ басқа класста емес:

    Person p = new Person("Том", 24); // Қате – жиын жеке модификатормен жарияланады //p.Name = «Джон»; Console.WriteLine(p.Name);

    Сипаттарда модификаторларды пайдалану кезінде ескеру қажет бірқатар шектеулер бар:

      Сипатта жиын және алу блоктары болса, жиын немесе алу блогының модификаторын орнатуға болады.

      Тек бір жиын немесе алу блогында қатынас модификаторы болуы мүмкін, бірақ екеуі де емес

      Жиынның немесе алу блогының қатынас модификаторы сипаттың қатынас модификаторына қарағанда шектеуші болуы керек. Мысалы, егер сипаттың модификаторы public болса, онда set/get блогында тек ішкі, ішкі, қорғалған, жеке қорғалған модификаторлар болуы мүмкін.

    Инкапсуляция

    Жоғарыда біз жеке класс айнымалыларына қол жеткізу сипаттар арқылы орнатылатынын көрдік. Класс күйін сырттан келген кедергілерден осылай жасыру объектіге бағытталған программалаудың негізгі концепцияларының бірін білдіретін инкапсуляция механизмін білдіреді. (Айта кетейік, инкапсуляция ұғымының өзі бір-бірімен үнемі сәйкес келе бермейтін біршама әртүрлі интерпретацияларға ие) Жеке қол жеткізу модификаторларын пайдалану айнымалыны сыртқы қол жеткізуден қорғайды. Қол жеткізуді басқару үшін көптеген бағдарламалау тілдері арнайы әдістерді, гетерлерді және орнатушыларды пайдаланады. C# тілінде олардың рөлін әдетте қасиеттер атқарады.

    Мысалы, қосындыны білдіретін қосынды өрісі бар кейбір Account класы бар:

    Сынып шоты (қоғамдық сома; )

    Қосынды айнымалысы жалпыға ортақ болғандықтан, біз оған бағдарламаның кез келген жерінде қол жеткізе аламыз және оны өзгерте аламыз, соның ішінде кез келген жарамсыз мәнді орнату, мысалы, теріс. Мұндай мінез-құлық қажет болуы екіталай. Сондықтан инкапсуляция sum айнымалысына қол жеткізуді шектеу және оны сынып ішінде жасыру үшін қолданылады:

    Класс тіркелгісі (жеке ішкі сома; public int сомасы (алу (қайтару сомасы;) жиыны (егер (мән > 0) (сома=мән; ) ) ) )

    Автоматты қасиеттер

    Сипаттар сыныптың өрістеріне қатынасты басқарады. Дегенмен, егер бізде ондаған немесе одан да көп өрістер болса, онда әрбір өрісті анықтау және оған бірдей типтегі сипатты жазу жалықтырмайды. Сондықтан автоматты сипаттар .NET құрылымына қосылды. Олардың қысқартылған декларациясы бар:

    Класс Тұлға ( public string Name ( get; set; ) public int Age ( get; set; ) public Person (жол аты, int age) ( Name = name; Age = age; ) )

    Іс жүзінде қасиеттерге арналған өрістер де осында жасалады, тек оларды кодта бағдарламашы жасамайды, бірақ компилятор оларды компиляция кезінде автоматты түрде жасайды.

    Автоматты сипаттардың артықшылығы неде, егер олар шын мәнінде автоматты түрде жасалған айнымалыға қол жеткізетін болса, неге автоматты сипаттарысыз айнымалыға тікелей қатынамасқа? Өйткені, кез келген уақытта, қажет болған жағдайда, біз автоматты сипатты кәдімгі сипатқа кеңейтіп, оған белгілі бір логиканы қоса аламыз.

    Стандартты сипаттардағыдай автоматты түрде тек жазуға арналған сипатты жасай алмайтыныңызды ескерген жөн.

    Автоматты сипаттарға әдепкі мәндер тағайындалуы мүмкін (автоматты сипаттарды инициализациялау):

    Класс Тұлға ( жалпы жол атауы ( алу; орнату; ) = "Том"; public int Age ( get; set; ) = 23; ) сынып Бағдарлама ( статикалық бос Main(string args) ( Тұлға = жаңа Адам(); Консоль .WriteLine(адам.Аты); // Tom Console.WriteLine(адам.Жасы); // 23 Console.Read();

    Егер біз Person нысаны үшін Name және Age сипаттарының мәндерін көрсетпесек, әдепкі мәндер қолданылады.

    Автоматты сипаттарда рұқсат модификаторлары болуы мүмкін:

    Класс тұлғасы ( жалпыға ортақ жол Аты (жеке жиын; алу;) жалпы тұлға(жол n) ( Name = n; ) )

    Орнатылған блокты алып тастап, авто сипатын тек оқуға арналған етіп жасай аламыз. Бұл жағдайда, осы сипаттың мәнін сақтау үшін, ол үшін тек оқуға арналған модификаторы бар өріс жасырын түрде жасалады, сондықтан мұндай алу сипаттарын мысалдағыдай класс конструкторынан орнатуға болатынын ескеру қажет. жоғарыда немесе сипатты инициализациялау кезінде:

    Сынып тұлғасы (қоғамдық жол атауы ( алу;) = "Том" )

    Қасиеттердің стенографиялық белгісі

    Әдістер сияқты біз сипаттарды қысқарта аламыз. Мысалы:

    Класс тұлғасы (жеке жол атауы; // жалпы жолға баламалы Name ( get (қайтару атауы; ) ) жалпы жол Name => name; )

    Өрістердің қалай пайдаланылатынын басқару үшін алу және орнату әдістерін жасауға және оларды жалпыға ортақ етуге болады. Олар өріске қол жеткізуді басқару мүмкіндігін береді. Сонымен қатар, сыныптан тыс тікелей қол жеткізуге болмайтындай Жас өрісін жеке етіп жасаған дұрыс.

    жалпы сынып тіркелгісі

    жеке инт жасы;

    public int GetAge()

    this.age қайтару;

    public void SetAge(int inAge)

    егер ((жасы > 0) && (жасы< 120))

    this.age = in Age;

    Енді біз өз өрісімізге кіруді басқара аламыз, бірақ бұл үшін көп қосымша код жазу қажет. Жас мәніне қол жеткізу үшін жасалған әдістерді шақыру керек:

    Account s = new Account();

    Console.WriteLine("Жасы: " + s.GetAge());

      1. Сипаттар пайдалану

    Сипаттар деректерді басқаруды жеңілдетеді. Age сипатын келесідей жариялауға болады:

    жалпы сынып тіркелгісі

    private int ageValue;

    егер ((мән > 0) && (мән< 120))

    ageValue = мән;

    ageValue қайтару;

    Мұндағы жас мәні меншік болып табылады. Сипат оның мәнін жазуға және оқуға арналған бөлімдерді жариялайды. Осы бөлімдерде сипатталған әрекеттер бұрын сипатталған әдістерге тең. Бұл жағдайда сипаттар кәдімгі өрістер сияқты пайдаланылады:

    Account s = new Account();

    Console.WriteLine("Жасы: " + жасы);

    Age қасиеті мәнге орнатылғанда, жиынтық бөлім коды шақырылады. Мән кілт сөзі сипатқа тағайындалған мәнді білдіреді. Age қасиетінің мәнін оқу кезінде get бөлімінің коды шақырылады. Бұл тәсіл әдістерді пайдаланудың артықшылықтарын біріктіреді және сипаттармен сынып өрістері сияқты оңай жұмыс істеуге мүмкіндік береді.

    Қасиеттердегі мәліметтердің дұрыстығын тексеру . Жарамсыз жас мәнін (мысалы, 150) орнатуға әрекеттенсеңіз, жоғарыдағы код жарамдылықты тексереді және мәнді қабылдамайды (120 жастан асқан ешкімнің біздің банкте шоты болуы мүмкін емес), кәрілік мәнін қалдырады. Сипатқа мән тағайындалғанын білудің жалғыз жолы - осы операциядан кейін сипаттың мәнін тексеру:

    Account s = new Account();

    int newAge = 150;

    егер (s.Age!= newAge)

    Console.WriteLine("Жас мәні орнатылмады");

    Келесі код жасты жарамсыз 150 мәніне орнатуға әрекеттенеді, содан кейін сол мәннің орнатылғанын тексереді. Мәнді тағайындау үшін Set әдісі пайдаланылса, ол мәнді қайтара алады жалған Егер бұл орындалмаса, сипатты пайдалану пайдаланушыдан қосымша жұмыс істеуді талап етеді.

    Сипат мәнін оқудың әртүрлі тәсілдері. Сипаттар басқа пайдалы әрекеттерді орындауға мүмкіндік береді.

    public int AgeInMonths

    this.ageValue қайтару * 12;

    Жаңа AgeInMonths сипаты осы жерде сипатталған. Ол тек оқуға арналған, себебі онда жиынтық бөлім жоқ. Ол Age сипаты сияқты бірдей мәнді пайдаланып, жас мәнін айлармен қайтарады. Бұл бірдей мәнді алу үшін бірнеше түрлі әдістерді қолдануға болатындығын білдіреді. Тікелей өзгерту мүмкіндігінсіз тек оқуға арналған сипаттарды, сондай-ақ тек жазуға арналған сипаттарды жасауға болады, бірақ соңғылары сирек қолданылады.

    Көрнекі элементтердің қасиеттері . Нысандардағы деректерді қорғау қажет банктік шоттың сипаттамасында қасиеттерді пайдалану мағынасы бар. Бірақ Silverlight бағдарламасында TextBlock элементіне кез келген мәтінді енгізуге болады және енгізілген мәннің жарамдылығын тексерудің қажеті жоқ сияқты. Бұл кодты іске қосу мәнді енгізу процесін баяулатады. Сонымен, Мәтін мәнін жалпыға ортақ жолға айналдыру арқылы бағдарламада код аз болады және жылдамырақ жұмыс істейді.

    Бірақ TextBlock элементіндегі мәтінді өзгерткенде, Silverlight бетіндегі мәтіннің де өзгеруін қалаймыз, мысалы, Adder бағдарламасы нәтижені көрсеткенде. Егер бағдарлама өрістің мәнін жай ғана өзгертсе, Silverlight экрандағы хабарды жаңарту қажет екенін біле алмайды.

    Дегенмен, егер Text сипатқа айналдырылған болса, TextBlock элементінің мәні жаңартылғанда, мәтіндік жолдың сақталған мәнін жаңарта алатын және жаңа мәнді көрсету үшін экранды жаңарту әдісін шақыратын сәйкес әдіс іске қосылады. Сипаттар объектінің мәні өзгерген кезде оны басқару мүмкіндігін береді. Қарапайым операция:

    resultTextBlock.Text = "0";

    C# бірнеше жүздеген әрекеттерге әкелуі мүмкін, себебі TextBlock элементінде жаңа мәнді сақтау экран кескінін жаңарту әрекеттерін іске қосады.