Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Prochain SlideShare
Lecture vcp413
Lecture vcp413
Chargement dans…3
×
1 sur 93

C# hicheelin lekts

14

Partager

Télécharger pour lire hors ligne

Livres associés

Gratuit avec un essai de 30 jours de Scribd

Tout voir

C# hicheelin lekts

  1. 1. C# хичээлийн лекцүүд Лекц 1. Сэдэв: .NET Framework ба C# хэл Дэд сэдвүүд 1.1. .NET Платформ 1.2. .NET Фрэймворк 1.3. Хөрвүүлэлт ба MSIL 1.4. C# хэл 1.5. Класс, Объект, Төрөл 1.6. Програмаа хөрвүүлэх, ажиллуулах 1.1 .NET Платформ 2000 оны 7 сард Microsoft .NET платформыг албан ёсоор зарласан байна үүнтэй хамт C# хэл зарлагдсан юм. .NET платформ нь 1990-ээд оноос хойших Microsoft-н гаргасан олон технологиудыг нэг дор авчирсан, шинэлэг програмчлалын интерфэйсүүдээр тоноглогдсон шинэ хөгжүүлэлтийн орчин болсон юм. Үүнд COM+ сервисүүд, ASP вэб хөгжүүлэлт, XML болон объект хандлагат дизайн, мөн SOAP, WSDL, UDDI зэрэг шинэ вэб үйлчилгээний протоколуудыг дурдаж болно. Платформ нь 4 тусдаа бүтээгдэхүүний бүлгээс тогтддог. Үүнд: • Хөгжүүлэлтийн орчин: C#, J#, Visual Basic.NET зэрэг хэлүүд; Хөгжүүлэх хэрэгсэл: Visual Studio.NET; Веб үйлчилгээ, виндоуз орчны програмууд хийхэд зориулагдсан баялаг классын сан; Объектуудыг ажиллуулах Common Language Runtime (CLR). Эдгээр нь бүхэлдээ платформын томоохон хэсэг юм. • Веб үйлчилгээ: Худалдааны вэб үйлчилгээнүүдийг хөгжүүлэх боломж олгоно, мөн програм бүтээхэд нэг хэсэг нь болон ашиглагдаж болно • Тусгай серверүүд: B2B худалдаа (Business-To-Business) худалдаа, и-мэйл, өгөгдлийн менежмент зэрэгт тусгайлан зориулагдсан BizTalk, Exchange, SQL Server зэрэг сервер системүүд • Төхөөрөмж: .NET нь үүрэн утаснаас эхлээд тоглоомын төхөөрөмжүүд хүртэлх PC-бус төхөөрөмжүүд дээр ажиллаж чадна 1.2 .NET Фрэймворк .NET фрэймворк нь үйлдлийн системийн дээд талд ажиллах ба үйлдлийн систем нь Windows ангиллын ямар ч үйлдлийн систем байж болно. Мөн .NET систем нь онолын хувьд өөр үйлдлийн системүүд дээр ажиллах боломжтой, тухайлбал Linux, MAC, Solaris зэрэг. Энэ чиглэлээр MONO нэртэй төсөл амжилттай хийгдэж байна. Вэб хаяг нь http://www.mono-project.com/Main_Page. Зураг1-1 .NET системийн архитектур ‐1‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  2. 2. C# хичээлийн лекцүүд .NET фрэймворкын хамгийн чухал гишүүн бол CLR (Common Language Runtime) юм, CLR нь програм ажиллах орчин болж өгдөг. CLR ийг Java виртуаль машинтай адилхан гэж ойлгож болно. Виртуаль машин гэдэг нь компьютерийн платформ болон хэрэглэгчийн програмын хооронд хиймэл орчинг бүрдүүлж харилцан ажиллах боломж олгодог системийн програм юм. CLR нь объектуудыг идэвхжүүлж, тэдгээр дээр шалгалт хийж, санах ойд ачаалж, ажиллуулж, мөн тэдний ашиглахгүй орхисон санах ойн үлдэгдэлүүдийг нь цэвэрлэж байдаг. .NET фрэймворк нь дараахь хэсгүүдээс бүрддэг: 1 • Үндсэн хэлүүд : C#, J#, VB.NET, Managed C++, JScript.NET • CLR - энэ нь дээрх бүх хэлүүд хоорондоо хамтран ашиглах Windows болон Веб хөгжүүлэлтэд зориулсан объект хандлагат платформ юм. • Framework Class Library (FCL) гэж нэрлэгдэх хоорондоо хамаарал бүхий классуудын сан. .NET нь хэлний эрх чөлөөнөөс гадна хэлний нэгдмэл байдлыг хангадаг. Энэ нь өөр өөр хэл дээр бичигдсэн классуудын хооронд удамшуулах, алдаа барих, полиморф хийх давуу талтай юм. Энэ боломжийг Common Type System (CTS) гэж нэрлэгдэх тодорхойлолтын тусламжтайгаар бий болгодог. Тухайлбал, .NET дэх бүх зүйл нь System.Object гэж нэрлэгдэх язгуур классын объектууд юм. CTS нь класс, интерфэйс, төлөөлөгч2 3 , заалт төрөл , үндсэн төрөл зэрэг ерөнхий ухагдахуунуудыг өөртөө агуулдаг. Мөн .NET нь хэл хоорондын нэгдмэл байдлыг хангахад зориулагдсан Common Language Specification (CLS)-г өөртөө агуулдаг. CLS нь .NET хэл байх хамгийн доод                                                   1 Мөн CLR дээр ажиллах COBOL, Python, Fortran, Smalltalk зэрэг олон тооны хэлүүд бий болсон 2 delegate төрөл, C хэлний функцийн заагчтай төстэй 3 reference type – C# дахь бүх объектууд нь заалт төрөлд хамаарна   ‐2‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  3. 3. C# хичээлийн лекцүүд шаардлагуудыг тодорхойлсон байдаг. FCL нь CLS-тэй тохирдог ямар ч хэлнээс ашиглаж болох классуудыг агуулсан сан юм. .NET Фрэймворкын үндсэн классуудын санг Framework Class Library (FCL) гэх ба энэ нь түүхэнд байсан томоохон классын сангуудын нэг болох юм. 5000-аас илүү тооны классуудыг өөртөө агуулсан FCL нь дэсктоп, клиент/сервер, вэб үйлчилгээ болон бусад програм хангамжуудыг хөгжүүлэх ажлыг үлэмж хөнгөвчилдөг. FCL-н доод түвшин болох үндсэн классуудын сан нь үндсэн оролт/гаралт, тэмдэгт мөр боловсруулалт, хамгаалалтын менежмент, сүлжээний холболтууд, параллель боловсруулалт, өгөгдлийн бүтцийн үйлдлүүд зэргийг дэмждэг. Үүний дээрх давхарга нь өгөгдлийн менежмент, XML боловсруулалтыг дэмжих зорилгоор үндсэн суурь классуудыг өргөтгөсөн классууд юм. Классууд нь стандарт SQL хэлээр дамжуулан өгөгдлийг удирдах боломж олгодог, энэ классуудын олонлогыг ADO.NET гэж нэрлэдэг. Мөн XML өгөгдөл боловсруулах, XML хайлт хийх боломжтой классууд байдаг. Өгөгдлийн болон суурь классуудыг өргөтгөж гурван өөр технологиор програм хөгжүүлэхэд зориулж тоноглосон байна: Web Services, Web Forms, Windows Forms. Вэб үйлчилгээний сан нь firewall болон NAT програмын асуудал тулгарсан ч ажиллах чадвартай, сүлжээний орчны авсаархан үйлчилгээнүүдийг хөгжүүлэхэд зориулсан классуудыг агуулна. Вэб үйлчилгээнүүд нь HTTP болон SOAP протоколуудыг холболтдоо ашигладаг учраас энэ нь сүлжээний орон зайд чөлөөтэй ажиллах боломжтой болгодог. Web Forms болон Windows Forms сангууд нь веб болон виндоуз орчны програм хангамжуудыг Хурдан Хугацаанд Хөгжүүлэх (Rapid Application Development) боломж олгоно. Контролуудыг зүгээр л чирч тавих замаар програмын цонхон дээр оруулж, double-click хийж харгалзах үзэгдэл боловсруулалт хийх кодыг бичнэ. 1.3 Хөрвүүлэлт ба MSIL .NET-д програмууд нь машины биелэгдэх код руу хөрвүүлэгддэггүй, харин Microsoft Intermediate Language (MSIL) код руу хөрвүүлэгддэг, энэ нь CLR-аар ажиллах боломжтой тусгай код4 юм. C# хэлний үүсгэдэг MSIL (ихэвчлэн IL гэж товчилдог) нь өөр хэлнүүдийн үүсгэдэг IL файлтай ижилхэн байдаг. Үүний ачаар .NET нь хэл хамааралгүй платформ болж чаддаг. Програмаа хөрвүүлэх үед C# код нь IL руу хөрвүүлэгддэг. IL нь диск дээр файлд хадгалагдана. Програмаа ажиллуулах үед IL код нь Just In Time (JIT) хөрвүүлэгчээр дахин хөрвүүлэгддэг (энэ процессыг ихэвчлэн JIT’ing гэж хэлдэг). Үр дүнд нь машины код гарч машины процессор үүнийг биелүүлдэг байна. Стандарт JIT хөрвүүлэгч нь идэвхжихэд бэлэн горимд ажилладаг. Програм дуудагдсан үед JIT хөрвүүлэгч нь IL код дээр шинжилгээ хийгээд дараа нь машинтай зохицон маш хурдтай ажиллах машины кодыг үүсгэдэг. JIT хөрвүүлэгч нь програм ажиллаж байх үед код хөрвүүлэгдсэн эсэхийг таних чадвартай учраас шаардлагатай үед л хөврүүлэлт хийгддэг. .NET програм ажиллахдаа урьдчилан-хөрвүүлэгдсэн кодыг дахин ашиглаж улам хурдтай ажиллахыг тэмүүлдэг байна.      Боловсруулсан: ММЗТ-н багш Б.Болормаа                                                   4 Java байт кодтой төстэй ‐3‐ 
  4. 4. C# хичээлийн лекцүүд Ассемблай гэдэг нь IL кодыг агуулсан Dynamic Link Library (DLL) эсвэл биелэх файлыг (EXE) хэлнэ. Ассемблай бол програмын дахин ашиглагдах (reuse), хувилбарлах (versioning), нууцлах (security), зөөвөрлөн байршуулах (deployment) үндсэн нэгж нь юм. CLR нь ассемблайг удирдах классуудыг мөн өөртөө агуулдаг. 1.4 C# хэл C# бол шинэ хэл юм, гэхдээ сүүлийн хэдхэн жилийн дотор маш олон програм зохиогчдын сонирхолыг татаж чадсан хэл юм. Энэ хэл нь маш энгийн бөгөөд ердөө 80 түлхүүр үг, 12 үндсэн өгөгдлийн төрөлтэй. Тийм боловч C# нь орчин үеийн програмчлалын асуудлуудыг шийдэхэд маш тохиромжтой, үр бүтээмж өндөртэй хэл юм. C# нь C++ болон Java хэлнээс удамшин үүссэн бөгөөд объект хандлагат, компонентод суурилсан, бүтцийн програмчлалуудыг дэмждэг. C# хэлийг Microsoft-н инженерүүд болох Anders Hejlsberg, Scott Wiltamuth нараар удирдуулсан цомхон баг хөгжүүлсэн юм. Hejlsberg нь хамгийн түгээмэл PC хэл болох Turbo Pascal хэлийг үүсгэгчдийн нэг бөгөөд мөн Borland Delphi хэлийг хөгжүүлсэн багийг удирдаж байсан юм. C# програм бичиж эхлэх ‐4‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  5. 5. C# хичээлийн лекцүүд Уламжлалт “Hello World” програмаа бичиж эхлэе. Доорх жижигхэн програмаар C# хэлний түлхүүр онцлогуудыг гаргахыг оролдоё. class HelloWorld { static void Main() { // системийн консоль объектыг ашиглаж байна System.Console.WriteLine(“Hello World”); } } HelloWorld –г хөрвүүлээд ажиллуулахад “Hello World” гэсэн текстийг консоль (текст командын горимд ажилладаг) дээр харуулна. Энэ жижигхэн програм дээр илүү дэлгэрэнгүй цааш авч үзэе. 1.5 Класс, Объект, Төрөл Объект хандлагат програмчлалын үндэс суурь бол шинэ төрлүүдийн үүсэн бий бололт юм. Төрөл гэдэг нь нэг зүйл юм. Зарим тохиолдолд зүйл гэдэг нь өгөгдлийн хүснэгт, thread гэх мэт хийсвэр, зарим тохиолдолд цонхон доторх товчлуур гэх мэт бодитой байдаг. Төрөл нь зүйлүүдийн ерөнхий нийтлэг шинж чанар (property), авирыг (behavior) тодорхойлдог. Жишээлбэл, програмд Help, Ok, Cancel гэсэн гурван товчлууртай гэж бодоё. Эдгээр тус бүрдээ өөрийн хэмжээ, байрлал, гарчигтай. Мөн бүгд зурагдах, идэвхжих, дарагдах гэх мэт нийтлэг авиртай. Иймээс хэдийгээр бие биенээсээ ялгагдах боловч эд бүгдээрээ нэг төрлийнх юм. Объект хандлагат прорамчлалын хэлэнд байдаг шиг C# -д төрөл нь классаар тодорхойлогддог. Классын төлийг5 нь объект гэж нэрлэдэг. “Hello World” програмд нэг төрөл тодорхойлогдсон байна, тэр нь HelloWorld класс юм. C#-д төрлийг классаар тодорхойлох ба class гэсэн түлхүүр үгийг ашигладаг, тэгээд нэр өгнө - энэ тохиолдолд нэр нь HelloWorld, дараа нь түүний шинжүүд, авируудыг тодорхойлдог. Методууд Класс нь шинж чанар, авир хоёуланг өөртөө агуулдаг. Авир нь түүний гишүүн методуудаар тодорхойлогддог. Шинж чанарыг дараагийн сэдвээр авч үзэе. Метод гэдэг нь класс доторх функц юм. Заримдаа методыг гишүүн функц гэж нэрлэдэг. Методууд WriteLine(), AddNumbers() гэх мэт нэртэй байна. Дээрх жишээнд класс нь Main() гэж нэрлэгдэх тусгай нэртэй методыг агуулсан байна, энэ тодорхойлолт нь классын үндсэн буюу эхний метод юм шүү гэдгийг CLR-д хэлж өгдөг. Програм ажиллаж эхлэхэд CLR нь Main() функцийг дууддаг. C# програм болгон Main() методтой байх ёстой. Зарчмын хувьд програмд хэд хэдэн Main() метод байж болох ба /main директивыг ашиглан аль классын Main() метод нь тухайн програмын эхлэх цэг болох вэ гэдгийг зааж болно.                                                   5 Instance – Төл, нэг хувь, нэг хуулбар ‐5‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  6. 6. C# хичээлийн лекцүүд Метод тодорхойлолт нь дараахь байдалтай. int myMethod(int size); Энэ тодорхойлолт нь myMethod нэртэй метод size хувьсагчаар дамжуулан нэг параметерийг хүлээн авах ба бүхэл тоон утгыг үр дүн болгон гаргана гэдгийг хэлж байна. Зарим методууд үр дүн буцаадаггүй, энэ тохиолдолд түүнийг void буцааж байна гэж хэлдэг. Жишээ нь: void myVoidMethod( ); Тайлбар хийх C# програм дотор мөн тайлбар бичигдэж болно. // системийн консоль объектыг ашиглаж байна Хоёр налуу зураасаар эхэлсэн мөр нь тайлбар гэдгийг илэрхийлдэг. Тайлбар нь програм зохиогчийн бичсэн тэмдэглэгээ бөгөөд програмын ажиллагаанд нөлөө үзүүлэхгүй. C# хэлэнд тайлбарыг гурван янзаар хийж болно. Эхнийх нь, //-аар эхлээд тухайн мөрийн төгсгөл хүртэл нэг мөр тайлбар байж болно. Хоёр дахь нь, /*-ээр эхлүүлж */ –ээр дуусгаж олон мөр тайлбар хийж болно. Гурав дахь нь, кодыг XML дээр суурилсан баримттай холбож тайлбар хийх боломжтой байдаг. Үүнийг дараа үзнэ. Консоль програм “HelloWorld” програм нь консоль ангиллын програм юм. Консоль програм нь товч, сонголт зэрэг хэрэглэгчийн график интерфэйс байхгүй, зөвхөн текст өгөгдөл оруулах, гаргах үйлдлүүд хийгддэг програм юм (MS-DOS програмуудтай төстэй). Дээрх програмд консоль руу гаралт нь Console классаар хийгдэж байна, Console класс нь стандарт гаралт рүү текстийг хэвлэх WriteLine() методтой байдаг. Методыг дуудахдаа (.) цэг үйлдлийг ашиглана. Нэрмуж .NET системийн классын санд ArrayList, Dictionary, Event гэх мэт хэдэн арав, хэдэн зуун мянган нэрсүүд байдаг. Эдгээр нэрсийг ялгахад асуудал үүсдэг. Програм зохиогч тэдгээр нэрсийг бүгдийг нь санаж чадахгүй, мөн аль нэг нэртэй нь ижил нэртэй өөрийн гэсэн классыг үүсгэх үед асуудал гарна. Тухайлбал, програм зохиогч өөрийн Dictionary нэртэй классыг үүсгэхийг хүсэж болно, гэтэл энэ нь .NET-д байдаг Dictionary классын нэртэй зөрчил үүсгэнэ, учир нь класс бүр үл давхардах нэртэй байх ёстой байдаг. 6 Үүнийг шийдэх шийдэл нь нэрмуж юм. Нэрмуж нь тодорхой зүйлсийг нэгэн нэрийн дор хамаатуулан утга учиртай нэрлэх боломж олгодог юм.      Боловсруулсан: ММЗТ-н багш Б.Болормаа                                                   6 namespace  ‐6‐ 
  7. 7. C# хичээлийн лекцүүд Том, жижиг үсгүүд C# хэлэнд нэрний үсгийн том, жижиг нь ялгаатай, ө.х writeLine ба WriteLine нь ялгаатай юм. Тиймээс програмын код дахь хувьсагч, функц, тогтмолын нэрсүүдийг тодорхой дүрмийн дагуу нэршиж занших нь зүйтэй. static түлхүүр үг Өмнөх жишээн дэх Main() методод өөр нэг шинж ажиглагдаж байна, энэ нь static гэсэн түлхүүр үгээр эхэлсэн байна. static түлхүүр үг нь Hello объектыг эхэлж үүсгэлгүйгээр Main() методыг дуудаж болно гэдгийг илэрхийлнэ. Програмаа хөрвүүлэх, ажиллуулах “HelloWorld” програмыг хөрвүүлэх олон арга байна. Нэг бол Visual Studio.NET хөгжүүлэлтийн хэрэгслийн тусламжтай хөрвүүлж болно. Эсвэл C#-ийн командын мөрний хөрвүүлэгчийг ашиглан дараахь байдлаар хөрвүүлж болно. 1. Програмаа hello.cs нэртэйгээр хадгална 2. Командын цонхыг нээнэ (Start->Run гээд cmd гэж бичнэ) 3. Командын мөр дээр дараахь командыг бичнэ. (хөрвүүлэгчийн замыг тодорхойлж өгөхийн тулд Path хувьсагчид .NET фрэймворкын замыг зааж өгөх хэрэгтэй) csc hello.cs 4. Програмаа ажиллуулахдаа Hello гэж бичээд ажиллуулна. JIT (Just In Time) Хөрвүүлэлт csc командыг ашиглан hello.cs кодыг хөрвүүлэхэд биелэх файл үүснэ. Энэхүү .exe файл нь IL кодыг агуулна гэдгийг санаж байх хэрэгтэй. Сонирхолтой нь, хэрэв энэ програмыг VB.NET юмуу өөр хэл дээр бичээд хөрвүүлэхэд адилхан IL үүсэх болно. Өөр хэлнүүдээс үүссэн IL нь бараг ялгагдах боломжгүй байдаг. Хөрвүүлэгч нь IL код дээр нэмээд стандарт Win32 биелэх файлын толгойг .exe файлын зөвхөн-уншигдах хэсэгт оруулдаг.                           ‐7‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  8. 8. C# хичээлийн лекцүүд Лекц 2.3 C# хэлний үндэсүүд Дэд сэдвүүд: • Үндсэн төрлүүд (тогтмол,хувьсагч, илэрхийлэл) • Үйлдлүүд (энгийн, арифметик, жиших, нөхцөлт, логик үйлдэл, үйлдлийн зэрэглэл) • Заавар Үндсэн төрлүүд C# хэл нь хатуу төрөлтэй хэл юм. Хатуу төрөлтэй хэлэнд үүсгэж байгаа объект бүрийн төрлийг заавал тодорхой заах ёстой. Ингэснээр хөрвүүлэгч тухайн объектод тохирсон утгыг оноохыг шаарддаг, энэ нь мөн алдаа гаргахаас сэргийлдэг. Өгөгдлийн төрөл нь хөрвүүлэгчид тухайн объектын хэмжээ (жнь, int төрөл нь 4 байт объектыг заана), авируудыг мэдээлдэг (жнь, Button нь зурах, дарах гэх мэт авиртай). C#-ийн төрлүүдийг хоёр ангилалд хуваана: үндсэн төрөл (value type), заалт төрөл (reference type). Үндсэн төрөл болон заалт төрлийн хоорондох ялгаа бол санах ойд утгуудаа яаж хадгалж байгаа арга юм. Үндсэн төрөл нь өгөгдлөө стект хадгалдаг. Заалт төрлийн хувьсагчийн хаяг нь стект байрлана, харин жинхэнэ объект нь хийпэд7 байрладаг. Стек ба Хийп Стек гэдэг нь “эхэлж орсон нь сүүлд гарах“ зарчмаар элементүүдийг хадгалдаг өгөгдлийн бүтэц юм. Энд дурдсан стек нь локаль хувсагчидыг хадгалах санах ойн мужийг хэлж байна. C# хэлэнд үндсэн төрлүүд нь, жишээ нь integer, стект хувиарлагдах бөгөөд хувьсагчийн нэр нь санах ойн хаягаа илэрхийлж байдаг. Заалт төрлүүд нь (жнь, object) хийпэд хувиарлагддаг. Объект хийпэд хувиарлагдах үед түүний хаяг нь буцаагдах ба энэхүү хаяг нь заалт болон хувьсагчид оноогддог. 8 Хог цуглуулагч нь объектын зарлагдсан стек хүрээ дууссанаас хойш хэсэг хугацааны дараа тэрхүү объектыг санах ойгоос устгадаг. Стек хүрээ гэдэг нь үндсэндээ функцүүдээр тогтоогддог. Тухайлбал, функц дотор локаль хувьсагч зарлавал уг функ ажиллаж дууссаны дараа үлдэгдэл цуглуулагч түүнийг устгах ёстой гэдгийг ойлгох болно. Хийп дэх объектуудын хувьд түүнийг зааж байгаа хамгийн сүүлийн заалт устсанаас хойш хэсэг хугацааны дараа уг объект үлдэгдэл цуглуулагчаар устгагддаг. C# хэлэнд орчин үеийн хэлэнд байвал зохих бүх үндсэн төрлүүд байдаг бөгөөд эдгээр нь харгалзан .NET CLS төрөл рүүгээ бууж байдаг. C# төрлийг .NET рүү харгалзуулсан буулгалт нь C# дээр үүсгэгдсэн объект өөр хэл дээр үүсгэгдсэн объекттой харилцан ажиллах боломжийг олгодог.                                                   7 Heap – санах ойн нэг төрлий н муж 8 Garbage collector  ‐8‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  9. 9. C# хичээлийн лекцүүд Төрөл бүр санах ойд тогтмол хэмжээ эзэлдэг. Төрөл Хэмжээ(байт) .NET төрөл Тодорхойлолт byte 1 Byte Байт, 0-255 char 1 Char Юникод тэмдэгт bool 1 Boolean true эсвэл false sbyte 1 Sbyte Тэмдэгтэй байт, -128 - 127 short 2 Int16 Бага бүхэл тоо (-32768 - 32767)      Боловсруулсан: ММЗТ-н багш Б.Болормаа ushort 2 Uint16 Тэмдэггүй бага бүхэл тоо, 0 -ээс 216 -1 int 4 Int32 Бүхэл тоо -(231 -1) –ээс (231 -1) uint 4 Uint32 Тэмдэггүй бүхэл тоо, 0 -ээс 232 -1 float 4 Single Бодит тоо, ±1.5*10-45 ээс ±3.4*1038 double 8 Double Давхар нарийвчлалтай бодит тоо, ±5.0*10-324 ээс ±1.7*10308 decimal 8 Decimal 28 хүртэл цифртэй, тогтмол нарийвчлалтай бутархай тоо. Энэ нь ихэвчлэн санхүүгийн тооцоололд ашиглагддаг. “m” эсвэл “M” гэсэн дагаваруудыг хэрэглэдэг. long 8 Int64 Их бүхэл тоо, -9,223,372,036,854,775,808 ээс 9,223,372,036,854,775,807 ulong 8 Uint64 Тэмдэггүй их бүхэл тоо, 0 ээс 0xffffffffffffffff Эдгээр үндсэн төрлүүдээс гадна C# хэлэнд enum ба struct гэсэн үндсэн төрлүүд байдаг. Үндсэн төрлөөс сонгож хэрэглэх Ерөнхийдөө ямар хэмжээтэй бүхэл тоон төрөл (short, int эсвэл long) сонгох вэ гэдэг нь ямар хэмжээтэй өгөгдөл хадгалах вэ гэдгээс хамаарна. Жишээлбэл, ushort төрөл нь 0-ээс 65535 хүртэлх тоон утгыг хадгалж чадна. Санах ой хангалттай байгаад онцын өөр шалтгаан байхгүй бол int төрлийг ихэнх тохиолдолд хэрэглэх нь зүйтэй. Тогтмол ба Хувьсагч Хувьсагч гэдэг нь тодорхой төрөл бүхий санах ойн хадгалах үүр юм. Хувьсагчид утга оноож болно мөн тэрхүү утга нь програмын ажиллах үед өөрчлөдөнө. Хувсагчийг зарлахдаа түүний төрөл, нэрийг зааж өгөх ёстой. Хувьсагчийг зарлах үед түүнд анхны утгыг оноож өгч болно. class Values { static void Main( ) { int myInt = 7; System.Console.WriteLine("Initialized, myInt: {0}", myInt); myInt = 5; System.Console.WriteLine("After assignment, myInt: {0}", myInt); } } Энэ жишээн дээр myInt хувьсагчийг зарлах үедээ түүнд 7 гэсэн анхны утга оноож байна, тэгээд түүний утгыг хэвлээд дараа нь 5 гэсэн утгыг дахин оноож дахин хэвлэж байна. ‐9‐ 
  10. 10. C# хичээлийн лекцүүд WriteLine( ) Дээрх жишээнд WriteLine методын өөр нэг хэлбэрийг ашигласан байна. Энэ жишээнд WriteLine метод нь 2 параметр хүлээн авах ба эхний параметр нь өгөгдлийг хэвлэх форматыг “Initialized, myInt: {0}” хэлбэртэй гэж тодорхойлно, хоёр дахь нь хэвлэгдэх хувьсагчийн нэр. Энд {0} бичиглэл нь эхний хувьсагч гэдгийг заана. C# хэл нь хувьсагчийн ашиглахын өмнө заавал утга оноосон байхыг шаардана. Энэ дүрмийг шалгахын тулд myInt хувьсагчид утга оноолгүйгээр дээрх жишээг өөрчилж үзэж болно. class Values { static void Main( ) { int myInt; System.Console.WriteLine("UnInitialized, myInt: {0}", myInt); myInt = 5; System.Console.WriteLine("Assigned, myInt: {0}", myInt); } } Энэ програмыг хөрвүүлэх үед C# хөрвүүлэгч дараахь алдааг заана. values.cs(6,55): error CS0165: Use of unassigned local variable 'myInt' Тэгэхээр програм дахь хувьсагч бүрийг зарлахдаа анхны утга оноох ёстой юу? Үгүй, заавал анхны утга оноох хэрэггүй, гэхдээ заавал ашиглахын өмнө утга оноосон байх хэрэгтэй гэсэн үг. class Values { static void Main( ) { int myInt; myInt = 7; System.Console.WriteLine("UnInitialized, myInt: {0}", myInt); myInt = 5; System.Console.WriteLine("Assigned, myInt: {0}", myInt); } } Нэр Хувьсагч нь нэртэй байх бөгөөд нэр нь үсгээр эсвэл доогуур зураасаар эхлэх ёстой. Нэрэнд үсгийн том, жижиг нь ялгаатай байдаг, myVariable ба MyVariable нэрнүүд нь ялгаатай юм. C# хэлэнд өөрийн гэсэн тогтсон нэрлэх дүрэм байдаг, хувьсагчдын хувьд Камель тэмдэглэгээ (жнь, someVariableName), метод болон бусад нэрнүүдийн хувьд Паскаль тэмдэглээг (жнь, SomeFunction) ашигладаг. Камель ба Паскаль тэмдэглээний ялгаа гэвэл Паскаль тэмдэглэгээнд нэр нь том үсгээр эхэлдэг. ‐10‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  11. 11. C# хичээлийн лекцүүд Нэр нь түлхүүр үгтэй адил байж болохгүй. Ө.х int эсвэл class гэсэн нэртэй хувьсагчид байж болохгүй. Тогтмол Тогтмол гэдэг бол түүний утгыг нь өөрчлөх боломжгүй хувьсагч юм. Зарим тохиолдолд хувьсагчийн утга өөрчлөгдөхгүй байх хэрэгцээ гардаг. Тогтмол нь 3 хэлбэрээр байж болно: эх хэлбэрээрээ, нэрлэсэн тогтмол, тоочсон тогтмол. x = 32; Энд 32 гэсэн тоо нь эх хэлбэрээрээ байгаа тогтмол юм. Ө.х 32-н утга бол үргэлж 32 байна, 32-д шинэ утга оноож чадахгүй, өөрчилж чадахгүй. Нэрлэсэн тогтмол нь тогтмол утгад нэр оноосон хэлбэр юм. Дараахь байдлаар ийм тогтмолыг зарлаж болно. const type identifier = value; Тогтмол нь зарлагдах үедээ анхны утга нь оноогдсон байх ёстой. const int FreezingPoint = 32; Энд 32 нь эх хэлбэрээрээ байгаа тогтмол, FreezingPoint нь нэрлэсэн тогтмол юм. using System; class Values { static void Main( ) { const int FreezingPoint = 32; // degrees Farenheit const int BoilingPoint = 212; Console.WriteLine("Freezing point of water: {0}", FreezingPoint ); Console.WriteLine("Boiling point of water: {0}",BoilingPoint ); //BoilingPoint = 21; } } Тоочсон тогтмол Тоочих төрөл нь тогтмолын өөр нэг хувилбар юм. Тоочих төрөл нь тодорхой тооны нэрлэсэн-тогтмолуудын олонлог юм. Өмнөх жишээн дэх const int FreezingPoint = 32; const int BoilingPoint = 212; тогтмолууд дээр const int LightJacketWeather = 60; const int SwimmingWeather = 72; ‐11‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  12. 12. C# хичээлийн лекцүүд const int WickedCold = 0; тогтмолуудыг нэмэх хэрэгтэй гэж үзэе. C#-д enum тоочих төрөл нь энэ боломжийг олгоно. enum Temperatures { WickedCold = 0, FreezingPoint = 32, LightJacketWeather = 60, SwimmingWeather = 72, BoilingPoint = 212, } Ерөнхийдөө, тоочсон тогтмолыг зарлах хэлбэр нь дараахь байдалтай. [attributes] [modifiers] enum identifier [:base-type] {enumerator-list}; attributes, modifiers –н тухай дараа үзнэ. base-type нь тухайн тоочилтын суурь төрөл нь юм. Хэрэв энэ заалтыг орхивол тухайн тоочсон утгуудыг integer байна гэж ойлгодог. Мөн бусад тоон төрлүүдийг ашиглаж болно. Жишээ нь, ushort, uint enum ServingSizes :uint { Small = 1, Regular = 2, Large = 3 } Тоочих төрөл дэх тогтмол бүр түүнд харгалзах тоон утгатай байдаг, хэрэв энэ утгыг зааж өгөхгүй бол 0-ээс эхлэн дараалуулан автоматаар өмнөх утга дээр нэгийг нэмсэн утга олгогдох болно. Жишээ нь: enum SomeValues { First, Second, Third = 20, Fourth } Энд First=0, Second=1, Third=20, Fourth=21 болох юм. Тоочих төрөл нь хийсвэр төрөл юм, тиймээс тоочих төрөл болон бүхэл тоон төрлийн хооронд хөрвүүлэлт хийх бол ил хөрвүүлэлт хийхийг шаарддаг. Тэмдэгт мөр тогтмол Мөр тогтмол нь тэмдэгтүүдийн дараалал юм. Тэмдэгт мөр төрлийн хувьсагчийг string түлхүүр үгээр зарлана. string myString; Тэмдэгт мөр утга нь давхар хашилтад хийгдэж бичигдэнэ: ‐12‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  13. 13. C# хичээлийн лекцүүд “Hello World” Анхны утга оноосон тэмдэгт мөр төрлийн хувьсагч: string myString = “Hello World”; Илэрхийлэл Үр дүндээ утга гаргадаг хувьсагч, тогтмол, объект, үйлдлүүдийн дараалсан нийлэмжийг илэрхийлэл гэдэг. Жишээлбэл, myVariable = 57 нь илэрхийлэл юм. Учир нь энэ нь 57 гэсэн утгыг үр дүн болгон гаргаж байна. Энд (=) тэмдэгт нь утга оноох үйлдэл юм (тэнцүүлэх үйлдэл биш!). myVariable = 57 нь илэрхийлэл учраас өөр илэрхийлэл дотор мөн оролцож болно. mySecondVariable = myVariable = 57; Энэ жишээнд 57 утга myVariable хувьсагчид оноогдож байна, энэ олголтын үр дүн нь дахиад хоёр дахь хувьсагч болох mySecondVariable-д оноогдож байна. Илэрхийлэлд илүү сул зайнуудыг оруулж болно. Жишээлбэл, myVariable = 5;эсвэл: myVariable = 5; Хөрвүүлэгч нь дээрх хоёр зааврыг адилхан гэж үзнэ. Гэхдээ энэ дүрэм нь тэмдэгт мөр тогтмолын хувьд буруу болох юм. Ө.х “Hello World” ба “Hello World” тэмдэгт мөрүүд нь ялгаатай. Сул зайг ихэвчлэн програмыг уншихад илүү ойлгомжтой болгох зорилгоор ашигладаг, хөрвүүлэгчийн хувьд энэ нь ялгаагүй зүйл. Үйлдэл Энгийн тооцоолол хийхэд олгох, нэмэх, хасах гэх мэт олон үйлдлүүдийг ашигладаг. Олгох үйлдэл (=) Энэ тэмдэгт нь олгох үйлдлийг төлөөлөх ба зүүн талд байгаа хувьсагчид баруун талд байгаа утгыг олгоход хэрэглэгддэг. Арифметик үйлдлүүд C# нь нэмэх (+), хасах (-), үржих (*), хуваах (/), үлдэгдэл олох (%) арифметик үйлдлүүдийг ашигладаг. Хуваах үйлдлийн хувьд бүхэл 2 тоог хуваах үед ногдворын бүхэл хэсэг нь үр дүн болж гарна. Жишээ нь, 17-г 4-д хуваахад үр дүн нь 4 болно (17/4=4 ба 1 үлдэгдэлтэй). Харин бодит тоог хуваах үед үр дүн нь бутархай тоо гарна. ‐13‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  14. 14. C# хичээлийн лекцүүд Үлдэгдэл олох үйлдэл нь мөн тоог ямар нэг тоо өөр тоонд бүхлээр хуваагддаг эсэхийг шалгахад хэрэглэгдэж болно. 80 % 10 = 0 учраас 80 нь 10-д бүхлээр хуваагдана. Тооцоолоод олгох үйлдэл mySalary хувьсагчийн утгыг 5000-аар нэмэгдүүлэх хэрэгтэй гэж бодоё. Үүнийг mySalary = mySalary + 5000; эсвэл mySalary += 5000; гэж бичиж болно. C#-д тооцоолол хийгээд гарсан үр дүнг нь олгодог += (нэмээд олгох), -= (хасаад олгох), *= (үржээд олгох), /= (хуваагаад олгох), %= (үлдэгдэл олгох) операторууд байдаг. Хувьсагчийн утгыг 1-ээр нэмэгдүүлэх, хорогдуулах шаардлага олонтаа тохиолддог, үүнд зориулж ++, -- үйлдлүүд бий. Жишээлбэл, myAge++; firstValue = secondValue++; гэж хэрэглэж болно. Эдгээр үйлдлүүдийг олгох үйлдэлтэй хамт хэрэглэсэн үед хувьсагчийн утгыг 1-ээр нэмсэний дараа нөгөө хувьсагчид гарсан үр дүнг олгох уу, эсвэл олгосны дараа нь 1-ээр нэмэгдүүлэх үү гэсэн асуулт гарна. Үүнийг шийдэхэд угтвар (prefix), дагавар (postfix) бичиглэлүүдийг хэрэглэнэ. firstValue = secondValue++; // postfix firstValue = ++secondValue; // prefix Угтвар, дагавар операторуудын ялгааг ойлгохын тулд дараахь жишээг харая. using System; class Values { static void Main( ) { int valueOne = 10; int valueTwo; valueTwo = valueOne++; Console.WriteLine("After postfix: {0}, {1}", valueOne, valueTwo); valueOne = 20; valueTwo = ++valueOne; Console.WriteLine("After prefix: {0}, {1}", valueOne, valueTwo); } } Гарах үр дүн: After postfix: 11, 10 After prefix: 21, 21 ‐14‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  15. 15. C# хичээлийн лекцүүд Нөхцөлт үйлдэл Ихэнх үйлдэл нэг юмуу хоёр илэрхийллийг холбогддог. Харин нөхцөлт үйлдэл нь (?:) гурван илэрхийллийг холбодог. cond-expr ? expr1 : expr2 Энэ үйлдэл нь cond-expr нөхцөлд бичигдсэн илэрхийллийг үнэлээд хэрэв утга нь үнэн бол expr1, худал бол expr2-г үр дүн болгон гаргадаг. class Values { static void Main( ) { int valueOne = 10; int valueTwo = 20; int maxValue = valueOne > valueTwo ? valueOne : valueTwo; Console.WriteLine("ValueOne: {0}, valueTwo: {1}, maxValue: {2}", valueOne, valueTwo, maxValue); } } Гаралт: ValueOne: 10, valueTwo: 20, maxValue: 20 Жиших үйлдэл Жиших үйлдэл нь хоёр утгыг харьцуулаад үнэн эсвэл худал (boolean) утга буцаадаг оператор юм. Жишээ нь, эрс их (>) операторыг 5 > 2 гэж хэрэглэвэл үр дүн нь true, 2 > 5 гэж хэрэглэвэл үр дүн нь false болно. Нэр Оператор Тэнцүүлэх == Тэнцүү биш != Их > Их буюу тэнцүү >= Бага < Бага буюу тэнцүү <= Логик үйлдэл 9 Логик илэрхийллүүдийг холбоход логик үйлдлүүдийг ашигладаг. Нэр Оператор Ба && Эсвэл || Үгүйсгэл ! Жишээ нь, (x==3) && (y==7) энэ логик илэрхийлэл нь (x==3), (y==7) гэсэн хоёр логик илэрхийллээс тогтсон бөгөөд БА (&&) логик үйлдлээр холбогдсон байна. Энэ илэрхийллийн утга нь x нь 3-тай тэнцүү бөгөөд y нь 7-той тэнцүү байх үед үнэн байна.                                                   9 үнэн эсвэл худал утга гаргадаг илэрхийлэл  ‐15‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  16. 16. C# хичээлийн лекцүүд Богино үнэлэлт Дараахь кодыг авч үзэе. int x=8; ((x==8) || (y==12) ? expr1 : expr2) Энэ илэрхийллийг үнэлэхэд x нь 8-тай тэнцүү учраас үр дүн нь true гарна. Хоёр дахь илэрхийллийг бодох шаардлага байхгүй. Ө.х y нь 12-той тэнцүү байна уу, тэнцүү биш байна уу гэдгээс хамаарахгүй. Мөн дараахь илэрхийллийг авч үзэе. int x=8; ((x==5) && (y==12) ? expr1 : expr2) Энэ тохиолдолд мөн л хоёр дахь илэрхийллийг үнэлэх шаардлагагүй, үр дүн нь false утга гарах юм. Учир нь эхний x==5 илэрхийлэл false утга өгнө (&& үйлдэл нь хоёр утга хоёулаа үнэн үед үнэн гардгийг санаарай). Эдгээр тохиолдлуудад C# хөрвүүлэгч нь богино-үнэлэлт хийдэг, ө.х хоёр дахь илэрхийлэл дээр хэзээ ч үнэлэлт хийгдэхгүй. Үйлдлийн зэрэглэл Хөрвүүлэгч нь илэрхийлэл дэх үйлдлүүдийн биелэх дарааллыг мэддэг. Жишээ нь, myVar = 5 + 7 * 3; Энэ илэрхийлэлд * үйлдэл нь + үйлдлээс өмнө үнэлэгдэх ёстой. Ө.х * үйлдэл нь + үйлдлээс өндөр зэрэглэлтэй байна. Мөн нийлмэл илэрхийллүүд дотор хаалт хэрэглэн үйлдлүүдийн үнэлэх дарааллыг өөрчилж болно. Дараахь хүснэгтэд үйлдлүүдийн биелэх дарааллыг тодорхойллоо. Ангилал Үйлдлүүд Үндсэн (x) x.y f(x) a[x] x++ x—new typeof sizeof checked unchecked Унар + - ! ~ ++x —x (T)x Үржих * / % Нэмэх + - Шилжүүлэх << >> Жиших < > <= >= is Тэнцүүлэх == != Бит Ба & Бит XOR ^ Бит Буюу | Логик Ба && Логик Буюу || Гурван байрт ?: Олгох = *= /= %= += -= <<= >>= &= ^= |= 3. Заавар ‐16‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  17. 17. C# хичээлийн лекцүүд Зааварууд нь ямар боловсруулалт хийхийг компьютерт зааварлана. Заавруудын олонлогоос програм нь тогтоно. Заавар бүр цэгтэй таслалаар (;) төгсөх ёстой. Жишээлбэл, int x; // заавар x = 23; // өөр заавар int y = x; // бас нэг заавар Зааврууд нь програмд бичигдсэн дарааллынхаа дагуу биелэгддэг: програм ажиллахдаа хамгийн эхний заавраас эхлээд сүүлийн заавар хүртэл явдаг. Гэхдээ энэ нь салаалах заавруудын тохиолдолд өөр болох юм. Хоёр төрлийн салаалах заавар байдаг: нөхцөлт салаалах болон нөхцөлгүйээр салаалах. Програмын биелэх дараалал нь мөн давтах заавруудаар өөрчлөгдөж болно. Эдгээр нь for, while, do, in, foreach түлхүүр үгүүдээр тэмдэглэгддэг. 3.1 Нөхцөлт бус салаалах заавар Нөхцөлт бус салаалалт нь хоёр замаар хийгдэж болно. Эхнийх нь метод дуудалт юм. Програм ажиллаж байх үед метод дуудахад тухайн эгшинд ажиллаж байсан методын биелэлтийг зогсоогоод шинэ “дуудагдсан” метод руу салаалдаг. Тэр метод нь ажиллаж дуусаад утга буцаахад анхны методын дараагийн мөрнөөс биелэлтийг үргэлжлүүлдэг. using System; class Functions { static void Main( ) { Console.WriteLine("In Main! Calling SomeMethod( )..."); SomeMethod( ); Console.WriteLine("Back in Main( )."); } static void SomeMethod( ) { Console.WriteLine("Greetings from SomeMethod!"); } } Гаралт: In Main! Calling SomeMethod( )... Greetings from SomeMethod! Back in Main( ). Хоёр дахь зам нь нөхцөлт бус салаалах түлхүүр үгүүдийг ашиглах: goto, break, continue, return, throw. Эдгээрийн тухай дараа дэлгэрүүлэн судлана. 3.2 Нөхцөлт салаалах заавар Нөхцөлт салаалалт нь if, else, switch зэрэг түлхүүр үгүүдийн тусламжтай хийгдэнэ. Өгөгдсөн нөхцөлөөс хамааран салаалалт хийгдэнэ. 3.2.1 If..else заавар ‐17‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  18. 18. C# хичээлийн лекцүүд if..else заавар нь нөхцөлт салаалалт хийхэд ашиглагдана. Нөхцөл гэдэг нь логик илэрхийлэл юм. Энэ илэрхийллийн утга үнэн үед if заавар доторх командууд биелэнэ. if заавар нь else зааврыг агуулж болно, энд нөхцөл худал үед биелэх командууд бичигдэнэ. if (expression) statement1 [else statement2] using System; class Values { static void Main( ) { int valueOne = 10; int valueTwo = 20; if ( valueOne > valueTwo ) { Console.WriteLine("ValueOne: {0} larger than ValueTwo: {1}", valueOne, valueTwo); } else { Console.WriteLine("ValueTwo: {0} larger than ValueOne: {1}", valueTwo,valueOne); } } } Зааврын блок Зааврын блок гэдэг нь { } хаалтуудаар хашигдсан заавруудын олонлог юм. Тухайлбал, if (someCondition) { statementOne; statementTwo; statementThree; } гэж бичиж болно. 3.2.2 Давхар if заавар Нийлмэл нөхцөлүүдийг боловсруулахын тулд if зааврыг үүрлүүлж хэрэглэж болно. Жишээлбэл, using System; class Values { static void Main( ) { int temp = 32; if (temp <= 32) { Console.WriteLine("Warning! Ice on road!"); if (temp == 32) { Console.WriteLine("Temp exactly freezing, beware of water."); ‐18‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  19. 19. C# хичээлийн лекцүүд } else { Console.WriteLine("Watch for black ice! Temp: {0}", temp); } } } } Програмын нь агаарын температур 32-оос бага эсэхийг шалгаж байна. Хэрэв тийм бол "Warning! Ice on road!" гэсэн сэрэмжлүүлгийг хэвлэж байна. Дараа нь 32-той тэнцүү эсэхийг шалгаж дараагийг мэдэгдлийг хэвлэж байна. Энд if зааврыг if заавар дотор давхар хэрэглэсэн байна. Энд байгаа else заавар нь температур 32-оос эрс бага нөхцөлд биелэх юм. Тэнцүүлэх оператор C#-д тэнцүүлэх оператор нь “==” ээр тэмдэглэгддэг. if (temp == 32) Үүнийг “=” утга олгох оператортай андуурч болохгүй. 3.2.3 switch заавар Сэлгэх заавар нь угсраа if зааврын өөр нэг хувилбар нь юм, угсраа if заавар нь уншихад их төвөгтэй байдаг. Олон нөхцөлөөс сонголт хийх тохиолдолд сэлгэх зааврыг ашиглах нь илүү тохиромжтой юм. Сэлгэх зааврын логик нь тохирох утгыг олох, тэгээд биелүүлэх юм. switch (expression) { case constant-expression: statement jump-statement [default: statement] } Сэлгэх зааврын толгойд логик илэрхийлэл бичигдэнэ, case заавар бүрийн ард тогтмол утга тавихыг шаардана. Энд эх хэлбэрээрээ тогтмол, нэрлэсэн тогтмол, тоочих төрлийн тогтмолууд байж болно. Case зааврын ард талын утга тохирсон үед харгалзах зааврууд биелэнэ, тэгээд үсрэлт хийгдэх ёстой. Ерөнхийдөө, үсрэлт хийх заавар нь break юм. Эсвэл өөр заавар руу шилжих шаардлагатай бол goto зааврыг ашиглаж болно. using System; class Values { static void Main( ) { const int Democrat = 0; const int LiberalRepublican = 1; const int Republican = 2; const int Libertarian = 3; ‐19‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  20. 20. C# хичээлийн лекцүүд const int NewLeft = 4; const int Progressive = 5; int myChoice = Libertarian; switch (myChoice) { case Democrat: Console.WriteLine("You voted Democratic.n"); break; case LiberalRepublican: // fall through case Republican: Console.WriteLine("You voted Republican.n"); break; case NewLeft: Console.Write("NewLeft is now Progressive"); goto case Progressive; case Progressive: Console.WriteLine("You voted Progressive.n"); break; case Libertarian: Console.WriteLine("Libertarians are voting Republican"); goto case Republican; default: Console.WriteLine("You did not pick a valid choice.n"); break; } Console.WriteLine("Thank you for voting."); } } Энэ жишээнд улс төрийн бүлгүүдийг төлөөлсөн тогтмолууд тодорхойлсон байна. Дараа нь myChoice хувьсагчид Libertarian утгыг оноосон байна. Хэрэв myChoice нь Democrat -тай тохирч байвал харгалзах текстийг хэвлэнэ. Энэ тохиолдолд break заавраар төгссөн байгааг ажиглаарай, энэ нь switch зааврын гадна гарч дараагын зааврыг биелүүлэх юм. LiberalRepublican утгын дор харгалзах заавар байхгүй байна, тийм учраас энэ нь дараагийн заавар болох Republican руу “бууна”. Энэ нь сонгогдсон утга LiberalRepublican эсвэл Republican байх үед Republican заавар биелэнэ гэсэн үг. Өөр заавар руу шилжих шаардлагатай үед goto зааврыг ашиглаж болно. Хэрэв аль ч тохиолдол нь таарахгүй бол default-н ард бичигдсэн заавар биелэх болно. Програм дараахь үр дүнг хэвлэнэ: Libertarians are voting Republican You voted Republican. Thank you for voting. Энэ жишээнд сонголт хийгдэх утга нь бүхэл тоон тогтмол байна. C# нь мөн тэмдэгт мөр төрлийн утга дээр сонголт хийх боломж олгодог. Жишээ нь: case “Libertarian”: ‐20‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  21. 21. C# хичээлийн лекцүүд 3.3 Давтах заавар C#-д үйлдлийг давтан гүйцэтгэхэд зориулсан for, while..do, do..while, foreach зааврууд байдаг. C# нь мөн goto, break, continue, return үсрэх заавруудыг хэрэглэх боломжтой. 3.3.1 goto заавар Goto заавар нь бусад бүх давтах заавруудын үндэс нь юм. Гэхдээ энэ зааврыг ашиглахгүй байх хэрэгтэй, учир нь энэ нь кодыг ойлгомжгүй болгодог, ийм төрлийн програмыг “шпагетти” програм гэж хэлдэг. Ихэнхи туршлагатай програм зохиогчид goto зааврыг ашиглахаас зайлсхийдэг, гэхдээ энд яаж хэрэглэх тухай дурдая. 1. Тодорхой байрлалд хаяг (label) тодорхойлно 2. Дараа нь хаа нэг газраас энэ хаяг руу goto-ээр үсрэнэ using System; public class Tester { public static int Main( ) { int i = 0; repeat: // the label Console.WriteLine("i: {0}",i); i++; if (i < 10) goto repeat; // the dasterdly deed return 0; } } Хэрэв goto заавар олон ашигласан програмын командын биелэх дарааллыг зурж үзвэл бие биен дээгүүрээ үсэрсэн, огтлолцсон шпагетти-тэй төстэй дүр зураг харагдана. Эндээс “шпагетти програм” гэсэн нэр томъёо үүссэн юм. 3.3.2 while давталт while давталтын үндсэн санаа нь “энэ нөхцөл биелж байвал энэ ажлыг хий” гэсэн утга юм. while (expression) statement Энд илэрхийлэл нь логик илэрхийлэл байх ёстой. using System; public class Tester { public static int Main( ) { int i = 0; while (i < 10) { Console.WriteLine("i: {0}",i); i++; ‐21‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  22. 22. C# хичээлийн лекцүүд } return 0; } } Энэ код нь өмнөх goto-н жишээн дэх кодтой ижил үйлдэл хийнэ. Гэхдээ програмын логик нь илүү ойлгожтой харагдаж байна. while заавар нөхцөл худал үед нэг ч удаа биелэхгүй. 3.3.3 do..while давталт Зарим тохиолдолд “үнэн үед үүнийг гүйцэтгэ” гэсэн өгүүлбэрээ “үүнийг гүйцэтгэ, үнэн байх үед давт” гэж өөрчлөх хэрэг гарч болно. Ө.х үйлдэл эхлээд хийгдэнэ, үүний дараа шалгалт хийгдэнэ. Энэ зорилгоор do..while давталтыг ашиглаж болно. do expression while statement Жишээ нь, using System; public class Tester { public static int Main( ) { int i = 11; do { Console.WriteLine("i: {0}",i); i++; } while (i < 10); return 0; } } Энд i хувьсагчийн анхны утга 11 байна, тиймээс while дахь нөхцөл тохирохгүй, гэвч давталт доторхи заавар нэг удаа ажиллах юм. 3.3.4 for давталт Өмнөх давтах заавруудаас харахад дараахь хэв загварын зааврууд олон тааралдаж байна: хувьсагчид анхны утга оноох (i = 0), нөхцөл шалгах (i < 10) , хэсэг зааврыг биелүүлэх, мөн хувьсагчийн утгыг өөрчлөх (i++). For давталт нь энэ бүх алхмуудыг нэг дор нэгтгэж өгдөг. for ([initializers]; [expression]; [iterators]) statement Жишээ нь, using System; public class Tester { public static int Main( ) { for (int i=0; i<100; i++) { Console.Write("{0} ", i); ‐22‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  23. 23. C# хичээлийн лекцүүд if (i%10 == 0) { Console.WriteLine("t{0}", i); } } return 0; } } Энэ жишээнд 10-д үлдэгдэлгүй хуваагдах тоонуудыг хэвлэж байна. Хэвлэхдээ Console.Write методыг ашигласан байна, энэ нь WriteLine –тай адил боловч шинэ мөрөнд шилжихгүй үргэлжлүүлж хэвлэдэгээрээ ялгаатай. Энд зарласан i хувьсагч нь for давталтын хүрээн дотроо л үйлчлэх юм. Ө.х дараахь мөрийг нэмбэл хөрвүүлэгч алдаа заах болно. using System; public class Tester { public static int Main( ) { for (int i=0;i<100;i++) { Console.Write("{0} ", i); if (i%10 == 0) { Console.WriteLine("t{0}", i); } } Console.WriteLine("n Final value of i: {0}", i); return 0; } } Сул зай ба Хаалт Сул зай ба хаалтыг ямар байдлаар хэрэглэх нь програм зохиогчийн дурын хэрэг боловч код уншихад хялбар байлгахыг бодох хэрэгтэй. Жишээлбэл, for (int i=0;i<100;i++) { Console.Write("{0} ",i); if (i%10==0) Console.WriteLine("t{0}", i); } кодын нээх хаалтуудыг шинэ мөрөнд оруулж, үйлдлүүдийн хооронд сул зай аван дараахь байдлаар бичиж болно. for (int i=0; i<100; i++) { Console.Write("{0} ", i); if (i%10 == 0) { Console.WriteLine("t{0}", i); } } ‐23‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  24. 24. C# хичээлийн лекцүүд Энэ нь илүү уншихад ойлгомжтой бичиглэл юм. 3.3.5 foreach давталт Энэ давталт нь C төрлийн програм зохиогчдын хувьд шинэ зүйл юм, гэхдээ Visual Basic програм зохиогчдын хувьд танил байх. Энэ давталт нь массив болон бусад өгөгдлийн бүтцийн бүх элементүүдээр давталт хийхэд хэрэглэгддэг. foreach (type identifier in expression) statement Жишээ: using System; public class Tester { static void Main() { int[] intArray; intArray = new int[5]; // populate the array for (int i = 0;i<intArray.Length;i++) { intArray[i] = i; } foreach (int i in intArray) { Console.WriteLine(i.ToString()); } } } 3.3.6 continue ба break зааврууд Зарим тохиололд давталт доторх үлдсэн хэсгийг билүүлэлгүйгээр давталтыг шинэчлэн эхлүүлэх шаардлага гардаг. continue заавар нь давталтын удирдлагыг дахин эхэнд нь аваачиж биелүүлэхэд хэрэглэгддэг. Мөн давталтыг таслан зогсоох боломжтой, үүнд break зааврыг ашиглаж болно. break ба continue зааврууд нь кодыг олон гарцтай болгож унших болон засахад төвөгтэй болгодог. Тиймээс бодолтой хэрэглэх хэрэгтэй. Доорхи жишээ нь урсгалын дохио хянах програм юм. Дохиог гарнаас Console.ReadLine методын тусламжтай оруулна. Алгоритм нь энгийн: “0” дохио хүлээж авбал нөхцөл хэвийн байна гэсэн үг, арга хэмжээ авах шаардлагагүй. Таслах дохио “A” хүлээн авсан үед боловсруулалт шууд зогсоно. Бусад дохио авсан үед анхааруулга гарч арга хэмжээ авахыг мэдэгдэнэ. “X” дохио хүлээн авсан үед анхааруулга хийж бөгөөд давталт зогсоно. using System; public class Tester { public static int Main( ) { ‐24‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  25. 25. C# хичээлийн лекцүүд string signal = "0"; // initialize to neutral while (signal != "X") { // X indicates stop Console.Write("Enter a signal: "); signal = Console.ReadLine( ); // do some work here, no matter what signal you receive Console.WriteLine("Received: {0}", signal); if (signal == "A") { // faulty - abort signal processing // Log the problem and abort. Console.WriteLine("Fault! Abortn"); break; } if (signal == "0") { // normal traffic condition // log and continue on Console.WriteLine("All is well.n"); continue; } // Problem. Take action and then log the problem and then continue on Console.WriteLine("{0} -- raise alarm!n",signal); } return 0; } } Нэр тодорхойлох #define DEBUG заавар нь DEBUG нэртэй препроцессорт зориулсан тогтмол утга үүсгэнэ. Мөн ийм зааврууд нь өөр кодноос using заавраар дагаж орж ирж болно. #define DEBUG //... ердийн код – препроцессорт хамааралгүй #if DEBUG // туршилт хийх үед хөрвүүлэгдэх, ажиллах код #else // туршилт хийгээгүй үед ажиллах код #endif //... ердийн код – препроцессорт хамааралгүй Препроцессор ажиллах үед #define зааврын дагуу DEBUG нэрийг үүсгэнэ. Дараа нь хэсэг ердийн кодыг алгасана, дараа нь #if-#else-#endif блоктой таарна. #if заавар нь DEBUG нэртэй тогтмол зарлагдсан эсэхийг шалгаж байна, ийм нэр өмнө үүссэн учраас #if ба #else –н хооронд бичигдсэн код програм руу хөрвүүлэгдэнэ. Харин #else ба #endif-н хоорондох код хөрвүүлэгдэхгүй. Ө.х энэ хоорондох код нь эцсийн ассемблай файл дотор үүсэхгүй гэсэн үг. #if ба #endif-н хооронд бичигдээгүй бусад кодын хувьд препроцессорт хамаагүй бөгөөд програм руу хөрвүүлэгдэх болно. ‐25‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  26. 26. C# хичээлийн лекцүүд Үүсгэсэн нэрийг #undefine заавраар хасаж болно. Жишээ нь: #define DEBUG #if DEBUG // энэ код хөвүүлэгдэнэ #endif #undef DEBUG #if DEBUG // энэ код хөрвүүлэгдэхгүй #endif Эхний #if биелэгдэнэ, дараагийнх нь биелэгдэхгүй. (DEBUG нэр байхгүй болсон) #if, #elif, #else, #endif Препроцессорт олон сонголтоос сонгох заавар байхгүй, гэхдээ #elif, #else заавруудаар орлуулж болно. #elif заавар нь else-if гэсэн логиктой юм. #if DEBUG // compile this code if debug is defined #elif TEST // compile this code if debug is not defined // but TEST is defined #else // compile this code if neither DEBUG nor TEST // is defined #endif #region #region заавар нь тайлбар бүхий текст мужийг тодорхойлдог. Энэ зааврар нь Visual Studio гэх мэт хэрэгсэл ашиглах үед програмын кодын зарим хэсгийг эвхэж зөвхөн тайлбарыг нь харуулахад хэрэглэгддэг. Жишээлбэл, доорх жишээнд ийм кодын муж тодорхойлсон ба муж нь дэлгэгдсэн харагаж байна. ‐26‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  27. 27. C# хичээлийн лекцүүд Энд муж нь #region ба #endregion зааврын хооронд бичигдсэн байна. Энэ мужийг эвхсэн үед зөвхөн тайлбар нь харагдана.                 ‐27‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  28. 28. C# хичээлийн лекцүүд Лекц №4.5.6 Сэдэв: Класс ба Объектууд Дэд сэдвүүд: • Класс тодорхойлох • Объект үүсгэх • Статик гишүүд • Объектыг устгах • Параметер дамжуулах • Метод болон байгуулагчыг дахин тодорхойлох • Операторыг дахин тодорхойлох • Өгөгдлийг далдлах – Проперти Бид int, long, char гэх мэт үндсэн төрлүүдийг мэднэ. Програмчлалын хэл нь програм зохиогчид шинэ, илүү нийлмэл төрлүүдийг үүсгэх боломжийг олгох ёстой. C#-д класс үүсгэж шинэ төрлүүдийг бий болгож болно. Классын төлийг объект гэж хэлдэг. Програм ажиллаж байх үед объект нь санах ойд үүсдэг. Класс ба Объектын хоорондох ялгаа бол нохойны тухай дүрслэл, төсөөлөл ба жинхэнэ таны өмнө сууж байгаа нохой хоёрын хоорондох ялгаатай болон ижил зүйл юм. Та нохойны дүрслэлтэй тоглож чадахгүй, зөвхөн бодит нохойтой л чадна. Dog класс нь “нохой ямар байдаг вэ” гэдгийг тодорхойлно: жин, өндөр, нүдний өнгө, үсний өнгө гэх мэт. Тэд мөн идэх, явах, хуцах, унтах гэх мэт хийж чаддаг авируудтай. Тодорхой нэг нохой, жишээ нь миний нохой, тодорхой жин (62 pounds), өндөр (22 inches), нүдний өнгө (black), үсний өнгөтэй (yellow). Тэр мөн нохойнуудын хийж чаддаг бүх л зүйлийг хийж чадна. ‐28‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  29. 29. C# хичээлийн лекцүүд Объект хандлагат прорамчлалын том давуу тал нь програмын элементүүдийн боломж, шинжүүдийг нэгэн дан, биеэ даасан нэгжид далдлан кодлох боломж олгодогт оршдог. Өгөгдлийн далдлалт, удамшил, полиморфизм нь объект хандлагат програмчлалын гурван тулгуур ухагдахуун юм. / Хуучны програм зохиогчид нэгэн хошин асуултыг тавьдаг. Объект хандлагат програм зохиогчийн хувьд гэрлийг унтраахад хэдэн үйлдэл хэрэгтэй вэ? Хариулт нь: нэг ч үйлдэл хийхгүй, зүгээр гэрлийн лампад өөрийгөө унтраа гэж хэлэхэд хангалттай. / 3.1 Класс тодорхойлох Классыг class түлхүүр үгээр тодорхойлно. Бичиглэл нь дараахь байдалтай: [attributes] [access-modifiers] class identifier [:base-class ] { class-body } Аттрибут болон хандалт тодорхойлогчийн (access-modifiers) тухай дараагийн лекцээр үзнэ. Identifier нь классын нэр юм. base-class-ийн тухай мөн удамшлын үед ярина. Классын биеийг муруй хаалтаар {} хашиж бичнэ. C#-д бүх зүйл класс дотор бичигддэг. public class Tester { public static int Main( ) { //... } } Класс үүсгэх үед түүний бүх шинжүүд, авируудыг тодорхойлох ёстой. Дараахь цаг хадгалах, хэвлэх жишээнд анхаарал хандуулая. Классын дотоод төлөв нь одоогийн он, сар, өдөр, цаг, минут, секундыг дүрслэх чадвартай байх ёстой. Мөн энэ класс нь цагыг хэвлэн харуулах чадвартай байх хэрэгтэй. Ийм классыг 6 хувьсагч, 1 методтойгоор тодорхойлоё. ‐29‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  30. 30. C# хичээлийн лекцүүд using System; public class Time { // public methods public void DisplayCurrentTime( ) { Console.WriteLine("stub for DisplayCurrentTime"); } // private variables int Year; int Month; int Date; int Hour; int Minute; int Second; } public class Tester { static void Main( ) { Time t = new Time( ); t.DisplayCurrentTime( ); } } Энэ жишээнд Main() метод дотор Time классын объектыг үүсгэж t хувьсагчид оноосон байна. t нь Time классын объект учраас DisplayCurrentTime( ) методыг ашиглаж болно гэсэн үг. t.DisplayCurrentTime( ); 3.1.1 Хандалт тодорхойлох Хандалт тодорхойлох гэдэг нь тухайн классын гишүүн хувьсагч, методууд руу ямар методууд хандаж болох вэ гэдгийг тодорхойлохыг хэлнэ. Хандалт Хязгаарлалт public Хязгаарлалт байхгүй. Public гэж тэмдэглэгдсэн гишүүд рүү ямар ч метод, ямар ч классаас хандаж болно. private Private гэж тэмдэглэгдсэн гишүүд рүү зөвхөн тухайн классын методууд хандана protected Protected гэж тэмдэглэгдсэн гишүүд рүү тухайн классын методууд ба түүнээс удамшсан классын методууд хандана internal Internal гэж тэмдэглэгдсэн гишүүд рүү тухайн классыг агуулж байгаа ассемблай доторх бүх классуудаас хандах боломжтой protected internal Ассемблай доторх бүх классуудаас хандахаас гадна тухайн классаас удамшсан классын методууд хандана. Ерөнхийдөө классын гишүүд нь private хандалттай байдаг. Гишүүний хандалтыг нь заагаагүй бол private гэж ойлгоно. Тиймээс өмнөх жишээн дэх Time классын гишүүд нь private хандалттай гэсэн үг. private int Year; private int Month; private int Date; private int Hour; private int Minute; ‐30‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  31. 31. C# хичээлийн лекцүүд private int Second; 3.1.2 Методын аргумент Метод нь дурын тооны параметерийг хүлээн авдаг байж болно. Методын нэрний араас параметүүдийг хаалтад жагсаан бичнэ. Жишээлбэл, “аргумент” ба “параметер” гэсэн ойлголтуудыг ихэнх тохиолдолд адилхан хэрэглэдэг, гэхдээ аргументыг тодорхойлдог, параметерыг метод дуудах үед дамжуулдаг гэсэн ялгааг нь ойлгох хэрэгтэй. void MyMethod (int firstParam, button secondParam) { // ... } MyMethod метод нь int, button төрлийн 2 параметер хүлээж аваад void утга буцааж байна. 3.2 Объект үүсгэх Объектыг new түлхүүр үгээр санах ойд үүсгэдэг. Time t = new Time(); Объект нь заалт төрөл юм, ө.х t нь Time объектыг яг агуулахгүй, харин санах ойд нэргүй Time төрлийн объект үүсэх ба тэр объект руу хүрэх хаягыг t агуулна. Зураг? 3.2.1 Байгуулагч Дараахь Time объектыг үүсгэж байгаа бичиглэл нь метод дуудах бичиглэлтэй төстэй харагдаж байна. Time t = new Time(); Үнэндээ, объектыг үүсгэх үед метод дуудагддаг юм. Энэ дуудагдах методыг нь байгуулагч гэж нэрлэдэг. Байгуулагчыг нь класс дотор тодорхойлж өгөх ёстой, эсвэл CLR үүнийг орлуулж хийж өгдөг. Байгуулагчын үүрэг бол классаар заагдсан объектыг үүсгэх, түүнийгээ зөв төлөвт оруулах юм. Байгуулагч ажиллахын өмнө объект нь тодорхой бус санах ойн муж байдаг, байгуулагч ажилласны дараа зөв болж санах ойн муж эзэлдэг. Байгуулагчийг тодорхойлохдоо классын нэртэй ижил медотыг тодорхойлдог. Байгуулагч нь буцаах утгагүй байдаг ба ихэнхдээ public хандалттай байдаг. Хэрэв аргумент авах шаардлагатай бол аргументуудыг зааж өгөх ёстой. Time класс нь байгуулагч тодорхойлогдоогүй байна. Хэрэв байгуулагч байхгүй бол хөрвүүлэгч default байгуулагчийг санал болгох ба энэ нь объектыг санах ойд үүсгэнэ, ‐31‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  32. 32. C# хичээлийн лекцүүд гэхдээ өөр ямар нэг үйлдэл хийхгүй. Гишүүн хувьсагчдад нь тогтсон (default) утгууд оноогдоно. Жишээлбэл үндсэн төрлүүдийн хувьд дараахь байдалтай: Төрөл Тогтсон утга numeric (int, long г.м) 0 bool false char ‘0’ (null) enum 0 reference null Time класст DateTime төрлийн нэг параметер хүлээн авах байгуулагч нэмж бичие. public class Time { // public accessor methods public void DisplayCurrentTime( ) { System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", Month, Date, Year, Hour, Minute, Second); } // constructor public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } // private member variables int Year; int Month; int Date; int Hour; int Minute; int Second; } public class Tester { static void Main( ) { System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime( ); } } Энэ жишээнд байгуулагч нь DateTime төрлийн параметер хүлээж аваад Time объектын харгалзах гишүүн хувьсагчдад оноож байна. DateTime нь System санд байдаг класс юм. DateTime классын Now статик гишүүн метод нь системийн одоогийн цагыг өгдөг. 3.2.2 Хуулагч байгуулагч Хуулагч байгуулагч нь байгаа объектоос өөр нэг ижил төрлийн шинэ объектийг үүсгэдэг. Ийм байгуулагч нь объектыг хувилахад хэрэглэгдэх юм. Жишээлбэл, Time байгуулагчид Time төрлийн параметер дамжуулж тухайн объектын утгуудтай ижил утгуудыг агуулах шинэ объект үүсгэх хэрэгтэй болсон гэж үзэе. C#-д хуулагч байгуулагч байхгүй, тиймээс үүнийг өөрөө хийх хэрэгтэй. Тухайлбал дараахь байгуулагчийг үүсгэж болно. ‐32‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  33. 33. C# хичээлийн лекцүүд public Time(Time existingTimeObject) { Year = existingTimeObject.Year; Month = existingTimeObject.Month; Date = existingTimeObject.Date; Hour = existingTimeObject.Hour; Minute = existingTimeObject.Minute; Second = existingTimeObject.Second; } Time t3 = new Time(t2); Хувилах .NET-н зарим класс Clone() методыг өөртөө агуулсан байдаг. Энэ метод нь тухайн объектын яг ижил хуулбарыг санах ойд үүсгэдэг. 3.2.3 this түлхүүр үг this түлхүүр үг нь тухайн объектыг өөрийг нь заана. this заалт нь классын статик биш гишүүд рүү хандах “нууц” заалт юм. Ихэнхдээ this заалтыг хэрэглэх гурван хэрэглээ байдаг. Нэгдүгээрт, гишүүн өгөгдлийг параметерээс ялгах. public void SomeMethod (int hour) { this.hour = hour; } Энэ жишээнд SomeMethod() метод нь гишүүн хувьсагчийн нэртэй ижил hour нэртэй параметерийг авч байна. Энэ үед this заалт нь нэрсийг ялгахад туслана, this.hour нь гишүүн хувьсагчийг илэрхийлж байна, hour нь параметерийг хэлж байна. Хоёрдугаарт, тухайн объектыг өөрийг нь өөр методод параметер болгон дамжуулж өгөхөд ашиглана. public void FirstMethod(OtherClass otherObject) { otherObject.SecondMethod(this); } Гуравдугаарт, индекслэгчид ашиглана. 3.3 Статик гишүүд Классын гишүүн нь статик байж болно. Статик бус гишүүдийн хувьд тухайн классаас үүссэн объекттой холбогдсон байдаг бол харин статик гишүүдийн хувьд холбоогүй байдаг. Статик гишүүдэд түүнийг агуулж байгаа классын нэрээр дамжуулан хандаж болно. Жишээлбэл, Button нэртэй класс SomeMethod нэртэй статик гишүүн методтой бол ‐33‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  34. 34. C# хичээлийн лекцүүд Button.SomeMethod() гэж дуудна. Харин энэ классаас үүссэн btnUpdate гэсэн объект байх тохиолдолд btnUpdate.SomeMethod() гэж болохгүй. Энэ тохиолдолд хөрвүүлэгч алдаа заах болно. Статик гишүүд нь глобаль методтой адил гэж ойлгож болно, тиймээс объект үүсгэлгүйгээр дуудаж хэрэглэж болно. Класс дотор статик гишүүн хэрэглэхийн давуу тал нь тухайн гишүүн классаараа хаяглагдана, энэ нь томоохон програм хангамж хөгжүүлэхэд нэрний хувьд илүү оновчтой болгож тусладаг. Програмд ашиглагдаж байгаа бүх статик методуудыг нэг класс дотор оруулж болох юм. Гэвч энэ нь объект хандлагат загварчлалын битүүмжлэх чанарыг алдагдуулсан зүйл болох юм. 3.3.1 Статик байгуулагч Статик байгуулагч нь ердийн байгуулагчтай төстэй, гэхдээ тухайн классын объект үүсэхээс өмнө дуудагддаг. Ерөнхийдөө классын статик гишүүдтэй ажиллахад хэрэглэгддэг. Статик байгуулагч нь далд хэлбэрийн public хандалттай бөгөөд ханалт хувиргагч байхгүй. Статик байгуулагч нь static түлхүүр үгээр тодорхойлогдоно. class Player { static Player() { _counter = -1; } public Player(string Name) { } } Статик байгуулагч яг хэзээ дуудагдахыг мэдэх боломжгүй. Гэхдээ дараахь байдлаар явагдана гэдэг нь тодорхой: • Статик байгуулагч нь классын хамгийн эхний объект үүсэхээс өмнө дуудагдана. • Статик байгуулагч нь зөвхөн нэг удаа дуудагдана. • Статик байгуулагч нь статик гишүүд анхны утгаа авсны дараа дуудагдана. • Статик байгуулагч нь статик гишүүдэд хандахаас өмнө дуудагдана. Статик байгуулагч нь програм эхлэхэд нэг удаа бэлдэх шаардлагатай бэлтгэл ажлуудыг хийхэд тохиромжтой. 3.3.2 private байгуулагч C#-д глобаль хувьсагч, функц гэсэн ойлголт байхгүй. Тиймээс статик гишүүдийг агуулсан жижиг туслах класс үүсгэх хэрэгтэй болно. Энэ нь сайн дизайн ч бай, муу дизайн ч бай хэрэв тийм класс үүсгэж байгаа бол тэр классаас ямар ч объект үүсгэхийг ‐34‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  35. 35. C# хичээлийн лекцүүд зөвшөөрөхгүй байх хэрэгтэй. Үүнийг private хандалтаар хийж болно. Ингэснээр классаас объект үүсгэх боломжгүй болно. 3.3.3 Статик гишүүн өгөгдөлийн хэрэглээ Статик гишүүн өгөгдөлийн нэг нийтлэг хэрэглээ бол тухайн классаас үүсэж байгаа объектуудыг тоолох юм. Дараахь жишээнд instances нэртэй статик гишүүн өгөгдлийг Cat класс дотор зарлаж энэ хувьсагчийн эхний утгыг 0-ээр оноож байна. Энэ тоолуур нь объект шинээр үүсэх бүрд нэгээр нэмэгдэж байна. using System; public class Cat { public Cat( ) { instances++; } public static void HowManyCats( ) { Console.WriteLine("{0} cats adopted",instances); } private static int instances = 0; } public class Tester { static void Main( ) { Cat.HowManyCats( ); Cat frisky = new Cat( ); Cat.HowManyCats( ); Cat whiskers = new Cat( ); Cat.HowManyCats( ); } } Гаралт: 0 cats adopted 1 cats adopted 2 cats adopted Гишүүн өгөгдлийг public хандалттай байлгах нь тохиромжгүй юм. Энэ нь мөн статик гишүүн өгөгдлийн хувьд ч хамаатай. Тиймээс статик гишүүнийг мөн private хандалттай тодорхойлох хэрэгтэй. Дээрх жишээнд instances статик гишүүн хувьсагчийг private хандалттай зарлаж, public хандалттай HowManyCats() статик гишүүн методыг тодорхойлсон байна. HowManyCats() нь мөн статик учраас instances статик гишүүн рүү хандаж байна. 3.4 Объектыг устгах C# нь санах ойн цэвэрлэгчтэй учраас объектуудыг хэрэглэж дууссаны дараа устгах ажлыг заавал хийх шаардлагагүй. Хэдий тийм боловч хяналтгүй нөөц10 програмдаа ашиглаж байгаа бол ашиглаж дууссаны дараа ил хэлбэрээр устгах шаардлагатай. Үүнд                                                   10 unmanaged resource  ‐35‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  36. 36. C# хичээлийн лекцүүд зориулж Finalize() нэртэй метод хэрэглэгддэг, энэ метод нь объект устах үед үлдэгдэл цэвэрлэгчээр дуудагддаг. 11 Хэрэв зөвхөн хяналттай нөөцүүд ашиглаж байгаа бол энэ методыг класс дотроо хэрэглэх шаардлагагүй. Мөн Finalize() методыг шууд дуудах хэрэггүй. Үлдэгдэл цуглуулагч үүнийг хийх болно. Цэвэрлэлт яаж хийгддэг вэ Үлдэгдэл цэвэрлэгч нь Finalize() методтой бүх объектын жагсаалтыг гаргана. Энэ жагсаалт нь объект үүсэх, устах бүрд шинэчлэгдэж байдаг. Энэ жагсаалтад байгаа объект нь цэвэрлэгдэх объектын дараалалд эхэлж бичигддэг. Finalize() метод ажилласны дараа үлдэгдэл цэвэрлэгч объектыг устгана, дараа нь утсгалын дарааллаа шинэчлэнэ, мөн Finalize() хийгдэх объектын жагсаалтаа цэвэрлэнэ. 3.4.1 Устгагч C#-д устгагч методыг дараахь байдлаар тодорхойлно. ~MyClass( ) { } Устгагч метод нь зүгээр л Finalize() методыг дуудах өөр нэг хэлбэр юм. Ө.х ~MyClass( ) { // do work here } гэж бичих нь MyClass.Finalize( ) { // do work here base.Finalize( ); } бичиглэлтэй адилхан юм. Ер нь эндүүрэл үүсгэхгүйн тулд устгагч методыг ашиглахгүй байх нь зүйтэй, шаардлагатай бол Finalize() методыг ашиглах хэрэгтэй. 3.4.2 Finalize ба Dispose Finalize() метод нь үлдэгдэл цэвэрлэгчээр дуудагдах учраас түүнийг код дотор дуудах нь хориотой. Зарим тохиолдолд үлдэгдэл цэвэрлэгчид орхилгүйгээр тэр дариуд нь санах ойгоос цэвэрлэх хэрэг гарна. Хэрэв хяналтгүй нөөц ашиглаад түүнийгээ тэр дариуд нь устгах шаардлагатай бол IDisposable интерфэйсийг классдаа хэрэгжүүлэх хэрэгтэй. Энэ интерфэйс нь Dispose() нэртэй методыг өөртөө агуулна. Dispose() методын утга нь “Finalize() дуудагдахыг хүлээхгүй, шууд устга” юм.                                                   11 managed resource  ‐36‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  37. 37. C# хичээлийн лекцүүд 3.4.3 Close методыг хэрэглэх Зарим объектыг устгахад Close() методыг дуудах нь тохиромжтой байдаг. Тухайлбал, урсгал, файлтай ажиллах объектууд байна. private хандалттай Dispose() метод, public хандалттай Close() метод тодорхойлоод, Close() нь Dispose()-г дууддаг байдлаар зохион байгуулж болно. 3.4.4 using заавар Цэвэрлэгч хэзээ ажиллахыг хянаж чадахгүй. Dispose() хэзээ дуудагдах нь тодорхой бус гэсэн үг. Гэхдээ C#-д using зааврыг ашиглан тухайн объектын амьдрах мужийг тодорхой зааж, хэзээ устахыг нь хэлж өгч болно. Объектын амьдрах муж нь нээх хаалтаар эхлээд хаах хаалт таарах үед автоматаар Dispose() метод дуудагдаж дуусах юм. using System.Drawing; class Tester { public static void Main( ) { using (Font theFont = new Font("Arial", 10.0f)) { // use theFont } // compiler will call Dispose on theFont Font anotherFont = new Font("Courier",12.0f); using (anotherFont) { // use anotherFont } // compiler calls Dispose on anotherFont } } Жишээний эхний хэсэгт Font объект using заавартай хамт үүсэж байна, заавар дуусахад Dispose() дуудагдах болно. Хоёр дахь хэсэгт Font объект using зааврын гадна үүсгэгдэж байна. Тэрхүү Font объектыг ашиглах болмогц using заавар дотор оруулна, заавар дуусахад мөн Dispose() дуудагдах болно. using заавар нь мөн тооцоолоогүй алдаануудаас хамгаалдаг. Ө.х using заавар яаж ажиллаж дууссанаас үл хамааран объектыг төгсгөлд нь заавал устгадаг. Энэ нь try- catch-finally блоктой ижил гэсэн үг. Энэ блокын тухай алдаа барих заавруудыг судлах үед ярина. 3.5 Параметер дамжуулах Үндсэн төрлүүд нь методод утгаараа дамжигдана. Метод руу үндсэн төрлийн объект дамжуулах үед тухайн методод зориулсан түр зуурын хуулбар үүсдэг гэсэн үг. Метод дууссаны дараа тэрхүү хуулбар нь хаягдана. Ихэнхдээ ингэж утгаар дамжуулалт хийгддэг. Зарим үед заалтаар дамжуулах хэрэг гардаг. Заалтаар объектыг дамжуулахад ref параметер хувиргагчыг хэрэглэнэ, ref-г анхны утга олголгүйгээр дамжуулах ‐37‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа
  38. 38. C# хичээлийн лекцүүд параметер дээр хэрэглэх бол out параметер хувиргагчыг хэрэглэнэ. Мөн хувьсах тооны параметер дамжуулах үед params параметер хувиргагчыг ашигладаг. 3.5.1 Заалтаар дамжуулах Метод нь нэг л объектыг буцаадаг. Time класс дээр жишээ авая, GetTime() нэртэй цаг, минут, секунд буцаадаг метод нэмэх хэрэгтэй байг. Энэ тохиолдолд метод нь 3 утга буцааж чадахгүй, тиймээс 3 параметер дамжуулаад тэр 3 параметерээрээ хүссэн утгуудаа буцаан авч болно. Энэ тохиололд методыг дараахь байдлаар тодорхойлох хэрэгтэй болно. public void GetTime(ref int h, ref int m, ref int s) { h = Hour; m = Minute; s = Second; } Методын дуудалт дээр мөн өөрчлөлт хийх хэрэгтэй. t.GetTime(ref theHour, ref theMinute, ref theSecond); Хэрэв дамжуулахдаа ref түлхүүр үгийг орхивол хөрвүүлэгч int төрлөөс ref int төрөл рүү хөрвүүлж чадахгүй гэсэн алдаа хэлэх болно. Объектыг заалтаар дамжуулах үед түүний хуулбар дамжуулагдахгүй, харин тухайн объектыг заах заалт дамжуулагдана. Ингэснээр метод тухайн объект дээр ажиллана гэсэн үг, хуулбар дээр биш. Энгийн үгээр хэлбэл заалтаар дамжуулна гэдэг нь “энэ объект байна, үүн дээр ажилла”, утгаар дамжуулна гэдэг нь “энэ яг адилхан хуулбар нь байна, үүн дээр ажилла” гэсэн үг юм. 3.5.2 out параметер C# нь хувьсагчидыг ашиглахын өмнө утга оноосон байхыг шаарддаг. Жишээлбэл, theHour, theMinute, theSecond хувьсагчдыг GetTime() метод руу дамжуулахын өмнө утга оноохгүй бол хөрвүүлэгч алдаа хэлнэ. Тиймээс тэдгээрт 0 анхны утгуудыг оноож өгч болно. int theHour = 0; int theMinute = 0; int theSecond = 0; t.GetTime( ref theHour, ref theMinute, ref theSecond); Гэвч энэ нь тухайн параметерээр дамжуулан зөвхөн буцах утга авах тохиолдолд илүү зүйл юм шиг харагдаж байна, гэвч ингэхгүй бол алдаа заана. Use of unassigned local variable 'theHour' Use of unassigned local variable 'theMinute' Use of unassigned local variable 'theSecond' ‐38‐       Боловсруулсан: ММЗТ-н багш Б.Болормаа

×