1-2 -маъруза
Download 171 Kb.
|
1-2 Maruza Классы2
1-2 -Маъруза Синф аъзоларига рухсатни бошқариш Синф, майдон тушунчаси, синф яратиш ва уларга мурожат қилиш, модификациялар билан ишлаш Синфлар
Синфлап объект шаклини белгилаб берувчи намунадир. Унда маълумотлар ва шу маълумотлар устида иш кўрувчи код кўрсатилади. C# да синф намуналари ҳисобланган объектларни қуриш учун синф спецификасидан фойдаланилади. Демак, синф умуман олганда объектни қуришга оид бир қатор схематик таърифларни ўз ичига олади. Бунда, синф мантиқий абстракция ҳисобланишини қайд этиш лозим. Синфнинг жисмоний тавсифи оператив хотирада мазкур синфнинг объекти яратилгандан кейингина акслантирилади. Синф ва тузилмалар- умуман олганда объектларни яратиш мумкин бўлган намуналардир. Ҳар бир объект берилганлар устида керакли амалларни бажарувчи усулларни ўз ичига олади. Синфнинг умумий берилиш усули Синфнинг берилишида таркибига кирувчи маълумотлар, ҳамда шу маълумотлар устида амаллар бажарувчи код эълон қилинади. Агар энг содда синфлар фақат код ёки фақат маълумотларни ўз ичига олса, кўпгина ҳақиқий синфлар ҳар иккаласини ўз ичига олади. Умуман олганда, маълумотлар синф томонидан берилувчи маълумот аъзоларида, код эса- функция-аъзоларда сақланади. Қайд этиш жоизки, C# да маълумот аъзолари ва функция-аъзоларнинг бир нечта турлари ҳисобга олинган:
Маълумот-аъзолар Маълумот-аъзолар- бу синф маълумотлари ўз ичига олган аъзолардир. Маълумот-аъзолар статик(static) бўлиши мумкин. Синф аъзоси static деб эълон қилинмаган бўлса намуна аъзоси ҳисобланади. Ушбу маълумот турларини ўрганиб чиқайлик. Майдонлар(field) Бу синф билан ўхшаш деб топилган ҳар қандай ўзгарувчилардир Ўзгармаслар Ўзгармаслар ўзгарувчилар сингари ўхшаш усулда мослаштирилиши Синф class калит ўзи ёрдамида яратилади. Қуйида содда синфни аниқлашнинг умумий шакли келтирилган бўлиб, унда фақат намуна ва усул ўзгарувчилари сақланади: class синф_номи { // Намуна ўзгарувчиларини эълон қилиш. мурожаат ўзгарувчи1 тури; мурожаат ўзгарувчи2 тури; //... мурожаат ўзгарувчиN тури; // Усулларни эълон қилиш. мурожаат қайтарилувчи 1-тур (параметрлар) { // усул танаси } мурожаат қайтарилувчи 2-тур (параметрлар) { // усул танаси } //. . . мурожаат қайтарилувчи N-тур (параметрлар) { // усул танаси } } Қайд этиш жоизки, ўзгарувчи ва усул эълон қилинишидан аввал мурожаат кўрсатиб ўтилади. Бу мурожаат спецификаторидир, масалан public мазкур синф аъзосига мурожаат тартибини белгилайди. Синф аъзолари синф доирасида ёпиқ (private), очиқ (public), яъни мурожаат учун мос бўлиши мумкин. Мурожаат спецификатори рухсат берилган мурожаат турини белгилайди. Мурожаат спецификаторини кўрсатиб ўтиш шарт эмас, аммо у бўлмаса, у ҳолда эълон қилинадиган аъзо синф доирасида ёпиқ деб ҳисобланади. Ёпиқ мурожаатли аъзолар синфдаги бошқа аъзолар томонидан тадбиқ этилиши мумкин. Фойдаланувчининг тавсифларини ифодаловчи синфни яратишга мисол қарайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class UserInfo { // Синф майдонлари public string Name, Family, Adress; public byte Age; // Консолга контак маълумотларни чиқарувчи усул public void writeInConsoleInfo(string name, string family, string adress, byte age) { Console.WriteLine("Исми: {0}\nФамилияси: {1}\nЖойлашган ўрни: {2}\nЁши: {3}\n", name, family, adress, age); } }
class Program { static void Main(string[] args) { // Создаем объект типа UserInfo UserInfo myInfo = new UserInfo(); myInfo.Name = "Alexandr"; myInfo.Family = "Erohin"; myInfo.Adress = "ViceCity"; myInfo.Age = 26; // UserInfo синфининг янги нусхаси яратилди UserInfo myGirlFriendInfo = new UserInfo(); myGirlFriendInfo.Name = "Elena"; myGirlFriendInfo.Family = "Korneeva"; myGirlFriendInfo.Adress = "ViceCity"; myGirlFriendInfo.Age = 22; // Маълумотни консолга чиқарамиз myInfo.writeInConsoleInfo(myInfo.Name, myInfo.Family, myInfo.Adress, myInfo.Age); myGirlFriendInfo.writeInConsoleInfo(myGirlFriendInfo.Name,myGirlFriendInfo.Family,myGirlFriendInfo.Adress,myGirlFriendInfo.Age); Console.ReadLine(); } } }
Олдинга қараб силжишдан аввал, қуйидаги асосий тамойилни ўрганайлик: ҳар бир объектнинг синфда аниқланган нусха ўзгарувчилари бўлади. Демак, битта объектдаги ўзгарувчи таркиби бошқа объектдаги таркибдан фарқ қилиши мумкин. Иккала объект ўртасида ҳеч қандай алоқа йўқ, умумий жиҳати фақатгина бир турдаги объект эканлигидадир. Чунончи, агар UserInfo турига мансуб иккита объект берилган бўлса, у ҳолда ҳар бирида Name, Family, Age ва Adress нусхалари сақланади, иккала объектдаги таркиби эса фарқланиши мумкин: Object синфи C# --- C# бўйича йўриқнома --- Object синфи C# да махсус object синфи ҳисобга олинган бўлиб, у қолган барча синф ва турлар учун базавий синф ҳисобланади. Бошқа сўз билан айтганда, қолган барча турлар object дан ҳосил бўлади. Хусусан, object ҳаволали турга мансуб ўзгарувчи ҳар қандай бошқа турдаги объектга ҳавола қилиши мумкин. Бундан ташқари, object турига мансуб ўзгарувчи ҳар қандай массивга ҳавола қилиши мумкин, чунки C# да массивлар объект сифатида жорий қилинади. Шартли равишда object номи C# System.Object синфнинг .NET Framework муҳити учун синфлар кутубхонасига кирувчи яна бир белгиланишидир. Бунинг амалий аҳамияти шундаки, усул ва хоссалардан ташқари, Object синфида аниқланган ҳимояланган ва оммабоп усул-аъзоларга мурожаат ҳуқуқи берилади. Бу усуллар кўпгина аниқланувчи синфларда иштирок этади. System.Object усуллар Қуйида берилган синфнинг барча усуллари санаб ўтилган: ToString() ToString() усули ўзи чақирилувчи объект таърифини ўз ичига олган белгили сатрни қайтаради. Бундан ташқари ToString() усули объект таркибини WriteLine() усули ёрдамида чақирганда автоматик равишда қайтарилади. Бу усул кўпгина синфларда аввалдан эълон қилинади, бу эса мазкур синфларда яратилувчи маълум турдаги объектларга мослаштириш имконини беради. Бу усулни объект таркиби тўғрисида тасаввурга эга бўлиш учун тадбиқ этинг. У маълумотларни форматлашнинг чегараланган воситаларини тақдим этади. Масалан, саналар жуда ҳам кўп форматларда тақдим этилиши мумкин, аммо DateTime.ToString() бу борада ҳеч қандай танлов қолдирмайди. Агар ўрнатилган афзалликлар, маҳаллий стандартларни эътиборга олиш керак бўлиб, мураккаб сатрли ифода керак бўлса, у ҳолда Iformattable интерфейсни жорий этиш лозим. GetHashCode() Бу усул объект харита(map) сифатида танилган, хеш-жадвал ёки луғат деб аталувчи маълумотлар тузилмасига жойлаштирилганда тадбиқ этилади. Ушбу тузилмалар устида амаллар бажарувчи синфлар томонидан тадбиқ этилади. Агар сиз синфдан луғат калити сифатида фойдаланмоқчи бўлсангиз, у ҳолда GetHashCode() ни олдиндан белгилашингиз лозим. Ўта юкланишни жорий этиш борасида қатъий талаблар мавжуд. ёё Хеш-кодни сақланувчи объектларга мурожаат этиш воситаси сифатида тадбиқ этилувчи ҳар қандай алгоритмда тадбиқ этиш мумкин. Аммо, шуни ёдда тутиш керакки, GetHashCode() усулнинг стандарт реализацияси барча ҳолатларда ҳам ўринли бўлавермайди. Equals() и ReferenceEquals() Келишувга биноан Equals (object) усули чақирувчи объект аргумент сифатида кўрсатилган объект сингари ҳудди шу объектга ҳавола қилишини белгилайди, яъни ҳар иккала ҳаволанинг бир хил эканлигини текширади. Equals (object) усули таққосланувчи объектлар бир хил бўлса true мантиқий қийматини, акс ҳолда false мантиқий қийматини қайтаради. Шунингдек у яратилувчи синфларда аввалдан аниқланиши мумкин. Бу яратилувчи синф учун объектларнинг тенглиги нима эканлигини аниқлашга имкон беради. Масалан Equals (object) усули шундай аниқланиши мумкинки, унда иккита объектларнинг таркиби таққосланиши мумкин. Объектларни таққослашнинг учта усули мавжуд эканлигини ҳисобга олсак,.NET муҳити объектларнинг эквивалентлигини аниқлаш бўйича анчагина мураккаб схемадан фойдаланади. Шу учта усул ва == таққослаш амали ўртасидаги фарқларни ҳисобга олиш лозим. Equals() нинг виртуал версиясини аввалдан аниқлашнинг тартиб қоидаларига оид чекловлар мавжуд-чунки System.Collections номлар фазосидан олинган айрим базавий синфлар бу усулни чақиради ва ундан маълум бир реакцияни кутади. Finalize() Бу усулнинг C# даги вазифаси С++ деструкторларга мос келади ва у ҳаволали объект томонидан банд қилинган ресурсни тозалаш давомида чиқиндиларни йиғиш учун чақирилади. Object дан Finalize() нинг амалиётга жорий этилиши аслида ҳеч қандай амал бажармайди ва чиқинди йиғувчи томонидан эътиборга олинмайди. Одатда Finalize() ни объект бошқариб бўлмайдиган ресурсларга эга бўлганда ҳисобга олиш зарур. Чиқинди ташувчи буни тўғридан-тўғри амалга ошира олмайди, чунки у фақат бошқарилувчи ресурслар тўғрисида маълумотга эга, шунинг учун у сиз томондан белгиланган якунга таянади. GetType() Бу усул System.Type дан ворисликка олинган синф нусхасини қайтаради. Ушбу объект аъзоси объект бўлган синф тўғрисидаги катта ҳажмдаги маълумотни, масалан базавий тур, усуллар, хоссалар ва ҳ.к. ларни тақдим этади. System.Type .NET рефлексия технологиясининг таянч нуқтасидир. Clone() Бу усул объект нусхасини яратади ва бу нусханинг ҳаволасини қайтаради. Қайд этиш жоизки, бунда чуқурмас нусхалаш бажарилади, яъни синфдаги барча қиймат турлари нусхаланади. Агар синфлар ҳаволали турга мансуб аъзоларни ўз ичига олса, у ҳолда ўзи ишора қиладиган объектлар эмас, ҳаволалар нусхаланади. Бу усул ҳимоялангандир, шунинг учун ташқи объектларни нусхалаш учун чақирила олмайди. Шунингдек, у виртуал эмас, шунинг учун унинг жорий этилишини аввалдан аниқлаб бўлмайди. Мазкур усуллардан айримларининг аниқ мисолда жорий этилишини кўрайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var m = Environment.Version; Console.WriteLine("m тур: "+m.GetType()); string s = m.ToString(); Console.WriteLine(".NET Framework нинг менинг версиям: " + s); Version v = (Version)m.Clone(); Console.WriteLine("v ўзгарувчининг қиймати: "+v); Console.ReadLine(); } } } object синфи универсал маълумотлар тури сифатида Агар object қолган барча турлар учун базавий синф ҳисобланса ва содда турлар қийматларининг жорий этилиши автоматик равишда амалга оширилса, у ҳолда object синфидан “универсал” маълумотлар тури сифатида фойдлааниш мумкин. Мисол тариқасида object туридаги массив яратилиб, унинг элементларига ҳар хил турдаги маълумот қийматлари бериладиган дастурни қарайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var myOS = Environment.OSVersion; object[] myArr = { "Строка", 120, 0.345m, 2.34f, myOS, 'Z' }; foreach (object obj in myArr) Console.WriteLine("Элемент \"{0}\" унинг тури - {1}",obj,obj.GetType()); Console.ReadLine(); } } } Берилган мисолдан кўриниб турибдики, object синфига мансуб объектга ҳаволаси орқали ихтиёрий турдаги маълумотларга мурожаат этиш мумкин, чунки ҳаволали турга мансуб ўзгарувчида қолган барча турдаги маълумотларга ҳаволаларни сақлаш мумкин. Демак, дастурда кўрилган object турдаги массивда ихтиёрий турдаги маълумотларни сақлаб қўйиш мумкин. Бу ғояни ривожантириб object синф объектларига ҳавола қилувчи стек синфини ҳеч қандай қийинчиликларсиз яратиш мумкин. Бу стекда ихтиёрий турдаги маълумотларни сақлашга имкон берар эди. Object синфининг мукаммал характери айрим ҳолатларда муваффақиятли тадбиқ этилишига қарамай, бу синф ёрдамида C# да қатъий белгиланган тур назоратини айланиб ўтишнинг иложи йўқ эди. Умуман олганда бутун қийматни int туридаги ўзгарувчида, сатрни- ҳаволали турга мансуб string ўгарувчида сақлаш мақсадга мувоқифдир. Энг муҳими, C# нинг 2.0 версиясидан бошлаб асли умумлашган маълумот турлари- бирлашмалар пайдо бўлди. Бирлашмаларнинг жорий этилиши ҳар хил турга мансуб маълумотларни автоматик равишда қайта ишловчи синф ва алгоритмларни одатий хавфсизликка амал қилган ҳолда аниқлаш имконини берди. Умумлашмалар ҳисобига object синфидан янги кодни яратиш давомида универсал маълумот тури сифатида фойдаланиш эҳтиёжи қолмади. Ушбу синфнинг универсал характеридан алоҳида ҳолатлардагина фойдаланиш мақсадга мувофиқдир. Объектларни яратиш Ихтиёрий турга мансуб объектни эълон қилиш учун қуйидаги тузилмадан фойдаланилади: <синф тури> ўзгарувчи номи = new <синф тури>(); Масалан: InfoUser myinfo = new InfoUser(); Мазкур эълон сатри учта функцияни бажаради. Биринчидан, InfoUser синфига мансуб myinfo щзгарувчиси эълон қилинади. Бу ўзгарувчининг ўзи объект ҳисобланмайди, у объектга ҳавола қилувчи ўзгарувчи холосдир. Иккинчидан, объектнинг аниқ, жисмоний нусхаси яратилади. Бу new оператори ёрдамида амалга оширилади. Ва ниҳоят, myinfo ўзгарувчига мазкур объектга ҳавола берилади. Шу тариқа, таҳлил қилинувчи сатр бажарилгандан сўнг эълон қилинган myinfo ўзгарувчиси InfoUser турига мансуб объектга ҳавола қилади. new оператори динамик равишда (яъни бажарилиш давомида) объект учун хотирани тақсимлайди ва унга ҳаволани қайтаради, сўнгра у ўзгарувчида сақлаб қолинади. Натижада, C# да барча синфларга мансуб объектлар учун хотира динамик равишда қайта тақсимланади. Синф объектларига ҳавола орқали мурожаат этиш мумкин бўлганлиги учун, синфларнинг нима сабабдан ҳаволали турлар деб номланишини изоҳлайди. Қийматли турларнинг ҳаволали турлардан асосий фарқи ҳар бир турга мансуб ўзгарувчининг таркибига нима киришидадир. Бинобарин, қиймат турига мансуб ўзгарувчи аниқ қийматни, ҳаволали ўзгарувчи эса объектнинг ўзини эмас, унга бўлган ҳаволани ўз ичига олади. Ҳаволали турга мансуб ўзгарувчилар ва ўзлаштириш Ўзлаштириш амалида ҳаволали турга мансуб ўзгарувчилар қиймат турига мансуб ўзгарувчи, масалан int туридан бошқача таъсир кўрсатади. Қиймат турига мансуб ўзгарувчи бошқасига ўзлаштирилса, вазият анча осонлашади. Ўзлаштириш операторидан чап томонда турган ўзгарувчи мазкур оператордан ўнг томонда жойлашган ўзгарувчи қийматининг нусхасини қабул қилади. Объектга ҳавола ўзгарувчисининг бири бошқасига ўзлаштирилса вазият бироз мураккаблашади, чунки бундай ўзлаштириш операторнинг чап қисмида жойлашган ўзгарувчи операторнинг ўнг томонида турган ўзгарувчи сингари бир хил объектга ҳавола қилади. Объектнинг ўзи эса нусхаланмайди. Ҳаволали турга мансуб ўзгарувчиларни ўзлаштиришдаги мазкур фарқ ҳисобига кутилмаган натижалар келиб чиқади.
Мисол тариқасида қуйидаги код қисмини кўрайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class autoCar { public string marka; } class Program { static void Main(string[] args) { autoCar Car1 = new autoCar(); autoCar Car2 = Car1; Car1.marka = "Renault"; Console.WriteLine(Car1.marka); Console.WriteLine(Car2.marka); Console.ReadLine(); } } } Car1 ўзгарувчиси Car2 ўзгарувчига ўзлаштирилса, охир оқибат Car2 ўзгарувчи Car1 каби объектга ҳавола қилади холос. Натижада, бу объектни Car1 ёки Car2 ўзгарувчилари ёрдамида бошқариш мумкин. Иккала ўзгарувчи, Car1 ва Car2 бир хил объектга ҳавола қилишига қарамай, улар ўзаро боғлиқ эмас. Объектлар инициализатори Объект инициализаторлари объектни яратиш усулини ҳамда майдон ва хоссалар инициализациясини тақдим этади. Агар объект инициализаторларидан фойдаланилса, у холда класс конструкторининг оддий чақирилиши ўрнига, биринчи бўлиб киритилган қийматлар орқали инициаллаштирилувчи майдон ёки хосса номлари орқали берилади. Натижада, инициализатор синтаксиси синф конструкторини ошкор равишда чақирилишнинг ўрнини босади. Объект инициализатори синтаксиси LINQ-ифодада мавҳум турларни яратишда тадбиқ этилади. Объект инициализаторидан номланган синфларда фойдаланиш мумкинлиги учун, қуйида объект инициализацияси тўғрисидаги асосий ҳолатлар келтирилган. Қуйида объект инициализацияси синтаксисининг умумий шакли келтирилган: new класс-номи {номи = ифода, исм-ифода, ...} бу ерда ном майдон ёки хосса, яъни очиқ синф аъзоси номинини ифодалайди. Ифода эса тури майдон ёки хосса турига мос бўлиши керак бўлган инициаллаштирилувчи ифодани белгилайди. Объект инициализаторлари номланган синфларда тадбиқ этилмайди, аммо бунинг амалда иложи бор. Умуман олганда, номланган синфлар билан иш тутганда оддий конструкторни чақириш синтаксисидан фойдаланилади. Объект инициализаторларидан фойдаланишга мисоллар: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class autoCar { public string marka; public short year; } class Program { static void Main(string[] args) { // инициализатордан фойдаланамиз autoCar myCar = new autoCar { marka = "Renault", year = 2004 }; Console.ReadLine(); } } } Усуллар
Усулларни эълон қилиш C# да усулларнинг аниқланиши ихтиёрий модификаторларлардан, қайтарилувчи қиймат тури, сўнгра усул номи, аргументар рўйхати думалоқ қавсларда, сўнгра усул танаси фигур қавслардадан ташкил топади: [модификаторлао] қайтарилиш-тури УсулНоми([параметрлар]) { // Усул танаси } Ҳар бир параметр параметр тури ва унга усул танасида мурожаат этиш мумкин бўлган номдан ташкил топади. Шунга қўшимча қилиб, агар усул қиймат қайтарса, у ҳолда чиқувчи нуқтани кўрсатиш учун қайтарилувчи қиймат билан биргаликда return қайтарилувчи оператордан фойдаланиш мумин. Агар усул ҳеч қандай қиймат қайтармаса, у ҳолда қайтарилувчи тур сифатида void кўрсатилади, чунки қайтарилиш турини мутлақо кўрсатмасликнинг иложи йўқ. Агарда у аргумент қабул қилмаса, у ҳолда усул номидан сўнг нима бўлганда ҳам бўш қавслар туриши лозим. Бунда усул танасига қайтариш операторини киритиш шарт эмас- усул ёпилган фигур қавсга етгандан сўнг автоматик равишда бошқарувни қайтаради. Усулдан қайтиш ва қиймат қайтариш Умуман олганда, усулдан қайтиш иккита шароитда содир бўлиши мумкин. Биринчидан, усул танасини ёпган фигур қавсга дуч келганда.Ва иккинчидан, return оператори бажарилганда. Return операторининг иккита шакли мавжуд: биринчиси —void туридаги усуллар учун (усулдан қайтиш), яъни қиймат қайтармайдиган усуллар, бошқаси эса — аниқ қиймат қайтарувчи усуллар учун (қиймат қайтариш). Қуйидаги мисолни кўрайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class MyMathOperation { public double r; public string s; // Доира юзини қайтаради public double sqrCircle() { return Math.PI * r * r; } // Айлана узунлигини қайтаради public double longCircle() { return 2 * Math.PI * r; } public void writeResult() { Console.WriteLine("Юза ёки узунлик ҳисоблансинми? s/l:"); s = Console.ReadLine(); s = s.ToLower(); if (s == "s") { Console.WriteLine("Доира юзи {0:#.###}",sqrCircle()); return; } else if (s == "l") { Console.WriteLine("Айлана узунлиги {0:#.##}",longCircle()); return; } else { Console.WriteLine("Сиз бошқа белги киритдингиз"); } } } class Program { static void Main(string[] args) { Console.WriteLine("Радиусни киритинг: "); string radius = Console.ReadLine(); MyMathOperation newOperation = new MyMathOperation { r = double.Parse(radius) }; newOperation.writeResult(); Console.ReadLine(); } } } Параметрлардан фойдаланиш Усулни чақиришда унга бир ёки бир нечта қийматни узатиш мумкин. Усулга узатиладиган қиймат аргумент деб аталади. Аргумент қабул қиладиган ўзгарувчи шартли параметр, ёки шунчаки параметр деб аталади. Параметрлар қавс ичида усул номидан кейин эълон қилинади. Параметрларни эълон қилиш синтаксиси ўзгарувчиларники кабидир. Параметрларнинг таъсир доираси эса усул танасидир. Аргументларни усулга узатишнинг ўзига хос ҳолатларидан ташқари қолган ҳолларда параметрлар қолган барча ўзгарувчилар сингари иш тутади. Умумий ҳолда параметрлар усулга ёки қиймат орқали, ёки ҳавола бўйича узатилиши мумкин. Ўзгарувчи ҳавола орқали узатилса, чақирилувчи усул ўзгарувчининг ўзини қабул қилади, шунинг учун усул ичида дуч келинадиган ҳар қандай ўзгаришлар якунланганидан сўнг ўз кучини йўқотмайди. Аммо, агар ўзгарувчи қиймат орқали узатилса, чақирилувчи усул ўзгарувчининг нусхасини қабул қилади, яъни ундаги ҳар қандай ўзгаришлар усул якунланганидан сўнг йўқолади. Мураккаб маълумот турлари учун ҳавола орқали узатиш нусхалаш керак бўладиган катта ҳажмдаги маълумот ҳисобига самаралироқдир. Қуйидаги мисолни қарайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class myClass { public void someMethod(double[] myArr, int i ) { myArr[0] = 12.0; i = 12; } } class Program { static void Main(string[] args) { double[] arr1 = { 0, 1.5, 3.9, 5.1 }; int i = 0; Console.WriteLine("Усул чақирилишидан аввал arr1 массиви: "); foreach (double d in arr1) Console.Write("{0}\t",d); Console.WriteLine("\n Ўзгарувчи i = {0}\n",i); Console.WriteLine("someMethod ... усулининг чақирилиши"); myClass ss = new myClass(); ss.someMethod(arr1,i); Console.WriteLine("Усул чақирилишидан сўнг arr1 массив"); foreach (double d in arr1) Console.Write("{0}\t",d); Console.WriteLine("\nЎзгарувчи i = {0}\n",i); Console.ReadLine(); } } } Шунисига алоҳида эътибор бериш керакки, i қиймат ўзгармай қолди, аммо myArr да ўзгартирилган қийматлар ҳам arr1 бошланғич массивда ўзгарди, чунки массивлар ҳаволали тур бўлиб ҳисобланади. Сатрларнинг ҳатти-ҳаракати ҳам фарқ қилади. Гап шундаки, сатрлар ўзгармас ҳисобланади(сатр қийматининг ўзгариши мутлақо янги сатрнинг яратилишига олиб келади), шунинг учун сатрлар ҳаволали турлар учун ҳарактерли ҳисобланган хатти-ҳаракатларни намоён қилмайди. Усул ичидаги сатр ичида амалга оширилган ҳар қандай ўзгаришлар бошланғич сатрга таъсир кўрсатмайди. Конструкторлар Конструктор объектни яратилиш пайтида инициаллаштиради. Конструкторнинг номи классники кабидир, синтаксис нуқтаи назаридан эса у усулга ўхшашдир. Аммо конструкторларнинг ошкор равишда кўрсатиладиган қайтарилувчи тури йўқ. Қуйида конструкторнинг умумий шакли келтирилган: мурожаат класс-номи(параметрлар-рўйхати) { // конструктор танаси } Одатда, конструктор синфда аниқланган намуна ўзгарувчиларининг бошланғич қийматини бериш учун қўлланилади. Бундан ташқари, мурожаат public туридаги мурожаат модификаторидир, чунки конструкторлар кўпинча класс ичида чақирилади. Параметрлар-рўйхати эса ҳам бўш, ҳам бир ёки ундан ортиқ параметрлардан ташкил топиши мумкин. C# нинг ҳар бир синфи келишувга биноан конструктор билан таъминланади, заруратга кўра у аввалдан аниқланиши мумкин. Таърифга кўра конструктор аргументлар ҳеч қачон қиймат қабул қилмайди. Хотирага янги объект жойлаштирилгандан сўнг, конструктор келишувга биноан барча майдонларнинг мос стандарт қийматларга ўрнатилишини кафолатлайди. Агар сиз келишувга биноан бундай ўзлаштиришлар биноан қаноатланмасангиз, келишувга биноан конструкторни ўз эҳтиёжларингиздан келиб чиққан ҳолда ўрнатишингиз мумкин. Конструктор бир ёки бир нечта параметр қабул қилиши мумкин. Конструкторга параметрлар усул каби киритилади. Бунинг учун уларни конструктор номидан сўнг қавс ичида эълон қилиш етарли. Констукторларнинг амалда қўлланишига мисоллар кўрайлик: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class MyClass { public string Name; public byte Age; //Параметрли конструкторни яратамиз public MyClass(string s, byte b) { Name = s; Age = b; } public void reWrite() { Console.WriteLine("Исм: {0}\nЁш: {1}", Name, Age); } } class Program { static void Main(string[] args) { MyClass ex = new MyClass("Alexandr", 26); ex.reWrite(); Console.ReadLine(); } } } Кўриб турганингиздек, мазкур мисолда ex синф нусхасининг майдонлари конструктор ёрдамида келишувга биноан инициаллаштирилади. Download 171 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling