SlideShare a Scribd company logo
1 of 104
Download to read offline
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐1‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Лекц 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 
систем  нь  онолын  хувьд  өөр  үйлдлийн  системүүд  дээр  ажиллах  боломжтой, 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐2‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
тухайлбал  Linux,  MAC,  Solaris    зэрэг.  Энэ  чиглэлээр  MONO  нэртэй  төсөл 
амжилттай хийгдэж байна. Вэб хаяг нь http://www.mono‐project.com/Main_Page.  
 
 
Зураг1‐1 .NET системийн архитектур 
 
 
 
.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 нь хэлний эрх чөлөөнөөс гадна хэлний нэгдмэл байдлыг хангадаг. Энэ нь 
өөр  өөр  хэл  дээр  бичигдсэн  классуудын  хооронд  удамшуулах,  алдаа  барих, 
                                                 
1 Мөн CLR дээр ажиллах COBOL, Python, Fortran, Smalltalk зэрэг олон тооны хэлүүд бий болсон
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐3‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
полиморф хийх давуу талтай юм. Энэ боломжийг Common Type System (CTS) 
гэж нэрлэгдэх тодорхойлолтын тусламжтайгаар бий болгодог. Тухайлбал, .NET 
дэх бүх зүйл нь System.Object гэж нэрлэгдэх язгуур классын объектууд юм. CTS 
нь  класс,  интерфэйс,  төлөөлөгч2,  заалт  төрөл3,  үндсэн  төрөл  зэрэг  ерөнхий 
ухагдахуунуудыг өөртөө агуулдаг. 
 
Мөн .NET нь хэл хоорондын нэгдмэл байдлыг хангахад зориулагдсан Common 
Language  Specification  (CLS)‐г  өөртөө  агуулдаг.  CLS  нь  .NET  хэл  байх  хамгийн 
доод  шаардлагуудыг  тодорхойлсон  байдаг.    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
                                                 
2
delegate төрөл, C хэлний функцийн заагчтай төстэй
3
reference type – C# дахь бүх объектууд нь заалт төрөлд хамаарна  
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐4‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
.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 байт кодтой төстэй
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐5‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Ассемблай гэдэг нь 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# програм бичиж эхлэх 
 
Уламжлалт  “Hello  World”  програмаа  бичиж  эхлэе.  Доорх  жижигхэн 
програмаар C# хэлний түлхүүр онцлогуудыг гаргахыг оролдоё. 
 
class HelloWorld { 
  static void Main() { 
    // системийн консоль объектыг ашиглаж байна 
    System.Console.WriteLine(“Hello World”); 
  } 
} 
 
HelloWorld –г хөрвүүлээд ажиллуулахад “Hello World” гэсэн текстийг консоль 
(текст  командын  горимд  ажилладаг)  дээр  харуулна.  Энэ  жижигхэн  програм 
дээр илүү дэлгэрэнгүй цааш авч үзэе. 
 
1.5 Класс, Объект, Төрөл 
 
Объект хандлагат програмчлалын үндэс суурь бол шинэ төрлүүдийн үүсэн бий 
бололт  юм.    Төрөл  гэдэг  нь  нэг  зүйл  юм.  Зарим  тохиолдолд  зүйл  гэдэг  нь 
өгөгдлийн  хүснэгт,  thread  гэх  мэт  хийсвэр,  зарим  тохиолдолд  цонхон  доторх 
товчлуур гэх мэт бодитой байдаг. Төрөл нь зүйлүүдийн ерөнхий нийтлэг шинж 
чанар (property), авирыг (behavior) тодорхойлдог.  
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐6‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Жишээлбэл,  програмд  Help,  Ok,  Cancel  гэсэн  гурван  товчлууртай  гэж  бодоё. 
Эдгээр  тус  бүрдээ  өөрийн  хэмжээ,  байрлал,  гарчигтай.  Мөн  бүгд  зурагдах, 
идэвхжих, дарагдах гэх мэт нийтлэг авиртай. Иймээс хэдийгээр бие биенээсээ 
ялгагдах боловч эд бүгдээрээ нэг төрлийнх юм. 
 
Объект  хандлагат  прорамчлалын  хэлэнд  байдаг  шиг  C#  ‐д  төрөл  нь  классаар 
тодорхойлогддог. Классын төлийг5 нь объект гэж нэрлэдэг.  
 
“Hello  World”  програмд  нэг  төрөл  тодорхойлогдсон  байна,  тэр  нь  HelloWorld 
класс  юм.  C#‐д  төрлийг  классаар  тодорхойлох  ба  class  гэсэн  түлхүүр  үгийг 
ашигладаг, тэгээд нэр өгнө ‐ энэ тохиолдолд нэр нь HelloWorld, дараа нь түүний 
шинжүүд, авируудыг тодорхойлдог.  
Методууд
Класс нь шинж чанар, авир хоёуланг өөртөө агуулдаг. Авир нь түүний гишүүн 
методуудаар тодорхойлогддог. Шинж чанарыг дараагийн сэдвээр авч үзэе. 
 
Метод гэдэг нь класс доторх функц юм. Заримдаа методыг гишүүн функц гэж 
нэрлэдэг. Методууд WriteLine(), AddNumbers() гэх мэт нэртэй байна. Дээрх 
жишээнд класс нь Main() гэж нэрлэгдэх тусгай нэртэй методыг агуулсан байна, 
энэ тодорхойлолт нь классын үндсэн буюу эхний метод юм шүү гэдгийг CLR‐д 
хэлж  өгдөг.  Програм  ажиллаж  эхлэхэд  CLR  нь  Main()  функцийг  дууддаг.  C# 
програм болгон Main() методтой байх ёстой.  
 
Зарчмын  хувьд  програмд  хэд  хэдэн  Main()  метод  байж  болох  ба  /main 
директивыг ашиглан аль классын Main() метод нь тухайн програмын эхлэх цэг 
болох вэ гэдгийг зааж болно. 
 
Метод тодорхойлолт нь дараахь байдалтай. 
 
int myMethod(int size);
 
Энэ  тодорхойлолт  нь  myMethod  нэртэй  метод  size  хувьсагчаар  дамжуулан  нэг 
параметерийг  хүлээн  авах  ба  бүхэл  тоон  утгыг  үр  дүн  болгон  гаргана  гэдгийг 
хэлж байна.  
 
Зарим методууд үр дүн буцаадаггүй, энэ тохиолдолд түүнийг void буцааж байна 
гэж хэлдэг. Жишээ нь: 
 
void myVoidMethod( );
Тайлбар хийх
                                                 
5 Instance – Төл, нэг хувь, нэг хуулбар
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐7‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
C# програм дотор мөн тайлбар бичигдэж болно.  
 
// системийн консоль объектыг ашиглаж байна
Хоёр налуу зураасаар эхэлсэн мөр нь тайлбар гэдгийг илэрхийлдэг. Тайлбар нь 
програм зохиогчийн бичсэн тэмдэглэгээ бөгөөд програмын ажиллагаанд нөлөө 
үзүүлэхгүй. C# хэлэнд тайлбарыг гурван янзаар хийж болно. 
 
Эхнийх  нь,  //‐аар  эхлээд  тухайн  мөрийн төгсгөл  хүртэл  нэг  мөр  тайлбар  байж 
болно. 
 
Хоёр дахь нь, /*‐ээр эхлүүлж */ –ээр дуусгаж олон мөр тайлбар хийж болно. 
 
Гурав  дахь  нь,  кодыг  XML  дээр  суурилсан  баримттай  холбож  тайлбар  хийх 
боломжтой байдаг. Үүнийг дараа үзнэ. 
Консоль програм
“HelloWorld” програм нь консоль ангиллын програм юм. Консоль програм нь 
товч,  сонголт  зэрэг  хэрэглэгчийн  график  интерфэйс  байхгүй,  зөвхөн  текст 
өгөгдөл  оруулах,  гаргах  үйлдлүүд  хийгддэг  програм  юм  (MS‐DOS 
програмуудтай төстэй).  
 
Дээрх програмд консоль руу гаралт нь Console классаар хийгдэж байна, Console 
класс  нь  стандарт  гаралт  рүү  текстийг  хэвлэх  WriteLine()  методтой  байдаг. 
Методыг дуудахдаа (.) цэг үйлдлийг ашиглана. 
Нэрмуж
.NET  системийн  классын  санд  ArrayList,  Dictionary,  Event  гэх  мэт  хэдэн  арав, 
хэдэн  зуун  мянган  нэрсүүд  байдаг.  Эдгээр  нэрсийг  ялгахад  асуудал  үүсдэг. 
Програм  зохиогч  тэдгээр  нэрсийг  бүгдийг  нь  санаж  чадахгүй,  мөн  аль  нэг 
нэртэй  нь  ижил  нэртэй  өөрийн  гэсэн  классыг  үүсгэх  үед  асуудал  гарна.  
Тухайлбал, програм зохиогч өөрийн Dictionary нэртэй классыг үүсгэхийг хүсэж 
болно,  гэтэл  энэ  нь  .NET‐д  байдаг  Dictionary  классын  нэртэй  зөрчил  үүсгэнэ, 
учир нь класс бүр үл давхардах нэртэй байх ёстой байдаг. 
 
Үүнийг шийдэх шийдэл нь нэрмуж6 юм. Нэрмуж нь тодорхой зүйлсийг нэгэн 
нэрийн дор хамаатуулан утга учиртай нэрлэх боломж олгодог юм.  
Том, жижиг сг д
C# хэлэнд нэрний үсгийн том, жижиг нь ялгаатай, ө.х writeLine ба WriteLine нь 
ялгаатай  юм.  Тиймээс  програмын  код  дахь  хувьсагч,  функц,  тогтмолын 
нэрсүүдийг тодорхой дүрмийн дагуу нэршиж занших нь зүйтэй.  
                                                 
6 namespace 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐8‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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 
файлын зөвхөн‐уншигдах хэсэгт оруулдаг. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐9‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Лекц 2.3 
 C# хэлний үндэсүүд 
Дэд сэдвүүд:
• Үндсэн төрлүүд (тогтмол,хувьсагч, илэрхийлэл) 
• Үйлдлүүд (энгийн, арифметик, жиших, нөхцөлт, логик үйлдэл, үйлдлийн
зэрэглэл) 
• Заавар 
 Үндсэн төрлүүд 
C# хэл нь хатуу төрөлтэй хэл юм. Хатуу төрөлтэй хэлэнд үүсгэж байгаа объект 
бүрийн  төрлийг  заавал  тодорхой  заах  ёстой.  Ингэснээр  хөрвүүлэгч  тухайн 
объектод  тохирсон  утгыг  оноохыг  шаарддаг,  энэ  нь  мөн  алдаа  гаргахаас 
сэргийлдэг.  Өгөгдлийн төрөл нь хөрвүүлэгчид тухайн объектын хэмжээ (жнь, 
int төрөл нь 4 байт объектыг заана), авируудыг мэдээлдэг (жнь, Button нь зурах, 
дарах гэх мэт авиртай). 
 
C#‐ийн төрлүүдийг хоёр ангилалд хуваана: үндсэн төрөл (value type), заалт төрөл 
(reference type). Үндсэн төрөл болон заалт төрлийн хоорондох  ялгаа бол санах 
ойд  утгуудаа  яаж  хадгалж  байгаа  арга  юм.  Үндсэн  төрөл  нь  өгөгдлөө  стект 
хадгалдаг.  Заалт  төрлийн  хувьсагчийн  хаяг  нь  стект  байрлана,  харин  жинхэнэ 
объект нь хийпэд7 байрладаг. 
 
Стек ба Хийп 
 
Стек гэдэг нь “эхэлж орсон нь сүүлд гарах“ зарчмаар элементүүдийг хадгалдаг 
өгөгдлийн  бүтэц  юм.  Энд  дурдсан  стек  нь  локаль  хувсагчидыг  хадгалах  санах 
ойн мужийг хэлж байна. 
 
C#  хэлэнд  үндсэн  төрлүүд  нь,  жишээ  нь  integer,  стект  хувиарлагдах  бөгөөд 
хувьсагчийн нэр нь санах ойн хаягаа илэрхийлж байдаг. 
 
Заалт  төрлүүд  нь  (жнь,  object)  хийпэд  хувиарлагддаг.  Объект  хийпэд 
хувиарлагдах  үед  түүний  хаяг  нь  буцаагдах  ба  энэхүү  хаяг  нь  заалт  болон 
хувьсагчид оноогддог. 
 
Хог цуглуулагч8  нь  объектын  зарлагдсан  стек  хүрээ  дууссанаас  хойш  хэсэг 
хугацааны  дараа  тэрхүү  объектыг  санах  ойгоос  устгадаг.  Стек  хүрээ  гэдэг  нь 
үндсэндээ  функцүүдээр тогтоогддог. Тухайлбал, функц дотор локаль хувьсагч 
зарлавал уг функ ажиллаж дууссаны дараа үлдэгдэл цуглуулагч түүнийг устгах 
ёстой гэдгийг ойлгох болно. 
 
Хийп  дэх  объектуудын  хувьд  түүнийг  зааж  байгаа  хамгийн  сүүлийн  заалт 
                                                 
7
Heap – санах ойн нэг төрлий н муж
8
Garbage collector 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐10‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
устсанаас  хойш  хэсэг  хугацааны  дараа  уг  объект    үлдэгдэл  цуглуулагчаар 
устгагддаг.  
 
 
C# хэлэнд орчин үеийн хэлэнд байвал зохих бүх үндсэн төрлүүд байдаг бөгөөд 
эдгээр нь харгалзан .NET CLS төрөл рүүгээ бууж байдаг. C# төрлийг .NET рүү 
харгалзуулсан  буулгалт  нь  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 төрлийг ихэнх 
тохиолдолд хэрэглэх нь зүйтэй.  
Тогтмол ба Хувьсагч
Хувьсагч гэдэг нь тодорхой төрөл бүхий санах ойн хадгалах үүр юм. Хувьсагчид 
утга оноож болно мөн тэрхүү утга нь програмын ажиллах үед өөрчлөдөнө. 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐11‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Хувсагчийг зарлахдаа түүний төрөл, нэрийг зааж өгөх ёстой. Хувьсагчийг зарлах 
үед түүнд анхны утгыг оноож өгч болно. 
 
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 гэсэн утгыг дахин оноож 
дахин хэвлэж байна. 
 
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'
 
Тэгэхээр програм дахь хувьсагч бүрийг зарлахдаа анхны утга оноох ёстой юу? 
Үгүй,  заавал  анхны  утга  оноох  хэрэггүй,  гэхдээ  заавал  ашиглахын  өмнө  утга 
оноосон байх хэрэгтэй гэсэн үг. 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐12‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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) ашигладаг. 
 
Камель  ба  Паскаль  тэмдэглээний  ялгаа  гэвэл  Паскаль  тэмдэглэгээнд  нэр  нь 
том үсгээр эхэлдэг. 
 
Нэр  нь  түлхүүр  үгтэй  адил  байж  болохгүй.  Ө.х  int  эсвэл  class  гэсэн  нэртэй 
хувьсагчид байж болохгүй.  
 
Тогтмол
Тогтмол  гэдэг  бол  түүний  утгыг  нь  өөрчлөх  боломжгүй  хувьсагч  юм.  Зарим 
тохиолдолд хувьсагчийн утга өөрчлөгдөхгүй байх хэрэгцээ гардаг.  
 
Тогтмол  нь  3  хэлбэрээр  байж  болно:  эх  хэлбэрээрээ,  нэрлэсэн  тогтмол,  тоочсон 
тогтмол.  
 
x = 32;
 
Энд 32 гэсэн тоо нь эх хэлбэрээрээ байгаа тогтмол юм. Ө.х 32‐н утга бол үргэлж 
32 байна, 32‐д шинэ утга оноож чадахгүй, өөрчилж чадахгүй. 
 
Нэрлэсэн тогтмол нь тогтмол утгад нэр оноосон хэлбэр юм. Дараахь байдлаар 
ийм тогтмолыг зарлаж болно. 
 
const type identifier = value;
 
Тогтмол нь зарлагдах үедээ анхны утга нь оноогдсон байх ёстой. 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐13‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
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;
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 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐14‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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;
 
Тэмдэгт мөр утга нь давхар хашилтад хийгдэж бичигдэнэ: 
 
“Hello World”
 
Анхны утга оноосон тэмдэгт мөр төрлийн хувьсагч: 
 
string myString = “Hello World”;
 
Илэрхийлэл
Үр  дүндээ  утга  гаргадаг  хувьсагч,  тогтмол,  объект,  үйлдлүүдийн  дараалсан 
нийлэмжийг илэрхийлэл гэдэг. Жишээлбэл,  myVariable = 57 нь илэрхийлэл юм. 
Учир нь энэ нь 57 гэсэн утгыг үр дүн болгон гаргаж байна.  Энд (=) тэмдэгт нь 
утга оноох үйлдэл юм (тэнцүүлэх үйлдэл биш!). 
 
myVariable  =  57  нь  илэрхийлэл  учраас  өөр  илэрхийлэл  дотор  мөн  оролцож 
болно. 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐15‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
mySecondVariable = myVariable = 57;
 
Энэ жишээнд  57 утга  myVariable хувьсагчид оноогдож байна, энэ олголтын  үр 
дүн нь дахиад хоёр дахь хувьсагч болох mySecondVariable‐д оноогдож байна.  
 
Илэрхийлэлд илүү сул зайнуудыг оруулж болно. Жишээлбэл, 
 
myVariable = 5;эсвэл:
myVariable = 5;
 
Хөрвүүлэгч  нь  дээрх  хоёр  зааврыг  адилхан  гэж  үзнэ.  Гэхдээ  энэ  дүрэм  нь 
тэмдэгт мөр тогтмолын хувьд буруу болох юм. Ө.х “Hello World” ба “Hello        World” 
тэмдэгт мөрүүд нь ялгаатай. 
 
Сул  зайг  ихэвчлэн  програмыг  уншихад  илүү  ойлгомжтой  болгох  зорилгоор 
ашигладаг, хөрвүүлэгчийн хувьд энэ нь ялгаагүй зүйл. 
йлдэл
Энгийн  тооцоолол  хийхэд  олгох,  нэмэх,  хасах  гэх  мэт  олон  үйлдлүүдийг 
ашигладаг.  
Олгох йлдэл (=)
Энэ тэмдэгт нь олгох үйлдлийг төлөөлөх ба зүүн талд байгаа хувьсагчид баруун 
талд байгаа утгыг олгоход хэрэглэгддэг. 
Арифметик йлдл д
C#  нь  нэмэх  (+),  хасах  (‐),  үржих  (*),  хуваах  (/),  үлдэгдэл  олох  (%)  арифметик 
үйлдлүүдийг ашигладаг.  
 
Хуваах үйлдлийн хувьд бүхэл 2 тоог хуваах үед ногдворын бүхэл хэсэг нь үр дүн 
болж  гарна.  Жишээ  нь,  17‐г  4‐д  хуваахад  үр  дүн  нь  4  болно  (17/4=4  ба  1 
үлдэгдэлтэй).  Харин бодит тоог хуваах үед үр дүн нь бутархай тоо гарна. 
Үлдэгдэл  олох  үйлдэл  нь  мөн тоог  ямар  нэг  тоо  өөр тоонд  бүхлээр  хуваагддаг 
эсэхийг  шалгахад  хэрэглэгдэж  болно.    80  %  10  =  0  учраас  80  нь  10‐д  бүхлээр 
хуваагдана. 
Тооцоолоод олгох йлдэл
mySalary хувьсагчийн утгыг 5000‐аар нэмэгдүүлэх хэрэгтэй гэж бодоё. Үүнийг  
 
mySalary = mySalary + 5000;
 
эсвэл  
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐16‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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
Н хц лт йлдэл
Ихэнх үйлдэл нэг юмуу хоёр илэрхийллийг холбогддог. Харин нөхцөлт үйлдэл нь 
(?:) гурван илэрхийллийг холбодог. 
 
cond-expr ? expr1 : expr2
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐17‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
Энэ үйлдэл нь 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 үнэн эсвэл худал утга гаргадаг илэрхийлэл 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐18‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
Дараахь кодыг авч үзэе. 
 
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  ^ 
Бит Буюу  | 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐19‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Логик Ба  && 
Логик Буюу  || 
Гурван байрт  ?: 
Олгох  = *= /= %= += ‐= <<= >>= &= ^= |= 
 
3. Заавар
Зааварууд нь ямар боловсруулалт хийхийг компьютерт зааварлана. Заавруудын 
олонлогоос програм нь тогтоно.  Заавар бүр цэгтэй таслалаар (;) төгсөх ёстой. 
Жишээлбэл,  
 
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( ).
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐20‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
Хоёр  дахь  зам  нь  нөхцөлт  бус  салаалах  түлхүүр  үгүүдийг  ашиглах:  goto,  break, 
continue, return, throw.  Эдгээрийн тухай дараа дэлгэрүүлэн судлана. 
 
3.2 Н хц лт салаалах заавар
Нөхцөлт  салаалалт  нь  if,  else,  switch  зэрэг  түлхүүр  үгүүдийн  тусламжтай 
хийгдэнэ. Өгөгдсөн нөхцөлөөс хамааран салаалалт хийгдэнэ. 
 
3.2.1 If..else заавар
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;
}
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐21‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
гэж бичиж болно. 
 
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.");
}
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) {
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐22‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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;
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.");
}
}
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐23‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Энэ  жишээнд  улс  төрийн  бүлгүүдийг  төлөөлсөн  тогтмолууд  тодорхойлсон 
байна.  Дараа  нь  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”:
 
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;
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐24‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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++;
}
return 0;
}
}
 
Энэ  код  нь  өмнөх  goto‐н  жишээн  дэх  кодтой  ижил  үйлдэл  хийнэ.    Гэхдээ 
програмын  логик  нь  илүү  ойлгожтой  харагдаж  байна.  while  заавар  нөхцөл 
худал үед нэг ч удаа биелэхгүй. 
 
3.3.3 do..while давталт
Зарим  тохиолдолд  “үнэн  үед  үүнийг  гүйцэтгэ”  гэсэн  өгүүлбэрээ  “үүнийг 
гүйцэтгэ, үнэн байх үед давт” гэж өөрчлөх хэрэг гарч болно. Ө.х үйлдэл эхлээд 
хийгдэнэ,  үүний  дараа  шалгалт  хийгдэнэ.  Энэ  зорилгоор  do..while  давталтыг 
ашиглаж болно. 
 
do expression while statement
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐25‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Жишээ нь, 
 
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);
if (i%10 == 0) {
Console.WriteLine("t{0}", i);
}
}
return 0;
}
}
 
Энэ  жишээнд  10‐д  үлдэгдэлгүй  хуваагдах  тоонуудыг  хэвлэж  байна.  Хэвлэхдээ 
Console.Write  методыг  ашигласан  байна,  энэ  нь  WriteLine  –тай  адил  боловч 
шинэ мөрөнд шилжихгүй үргэлжлүүлж хэвлэдэгээрээ ялгаатай.  
 
Энд  зарласан  i  хувьсагч  нь  for  давталтын  хүрээн  дотроо  л  үйлчлэх  юм.  Ө.х 
дараахь мөрийг нэмбэл хөрвүүлэгч алдаа заах болно. 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐26‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
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);
}
}
 
Энэ нь илүү уншихад ойлгомжтой  бичиглэл юм. 
 
3.3.5 foreach давталт
Энэ  давталт  нь  C  төрлийн  програм  зохиогчдын  хувьд  шинэ  зүйл  юм,  гэхдээ 
Visual Basic програм зохиогчдын хувьд танил байх. Энэ давталт нь массив болон 
бусад өгөгдлийн бүтцийн бүх элементүүдээр давталт хийхэд хэрэглэгддэг. 
 
foreach (type identifier in expression) statement
 
Жишээ: 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐27‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
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( ) {
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
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐28‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
// 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‐н хооронд бичигдээгүй бусад кодын хувьд препроцессорт хамаагүй 
бөгөөд програм руу хөрвүүлэгдэх болно. 
 
Үүсгэсэн нэрийг #undefine заавраар хасаж болно. Жишээ нь: 
 
#define DEBUG
#if DEBUG
// энэ код хөвүүлэгдэнэ
#endif
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐29‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
#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  гэх  мэт  хэрэгсэл  ашиглах  үед  програмын  кодын  зарим  хэсгийг 
эвхэж  зөвхөн  тайлбарыг  нь  харуулахад  хэрэглэгддэг.  Жишээлбэл,  доорх 
жишээнд ийм кодын муж тодорхойлсон ба муж нь дэлгэгдсэн харагаж байна. 
 
 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐30‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Энд  муж  нь  #region  ба  #endregion  зааврын  хооронд  бичигдсэн  байна.  Энэ 
мужийг эвхсэн үед зөвхөн тайлбар нь харагдана. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐31‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Лекц №4.5.6 
      Сэдэв: Класс ба Объектууд 
Дэд сэдвүүд:
 
• Класс тодорхойлох 
• Объект үүсгэх 
• Статик гишүүд 
• Объектыг устгах 
• Параметер дамжуулах 
• Метод болон байгуулагчыг дахин тодорхойлох 
• Операторыг дахин тодорхойлох 
• Өгөгдлийг далдлах – Проперти 
 
Бид  int,  long,  char  гэх  мэт  үндсэн  төрлүүдийг  мэднэ.  Програмчлалын  хэл  нь 
програм  зохиогчид  шинэ,  илүү  нийлмэл  төрлүүдийг  үүсгэх  боломжийг  олгох 
ёстой. C#‐д класс үүсгэж шинэ төрлүүдийг бий болгож болно.  
 
Классын төлийг объект гэж хэлдэг. Програм ажиллаж байх үед объект нь санах 
ойд  үүсдэг.  Класс  ба  Объектын  хоорондох  ялгаа  бол  нохойны  тухай  дүрслэл, 
төсөөлөл ба жинхэнэ таны өмнө сууж байгаа нохой хоёрын хоорондох ялгаатай 
болон  ижил  зүйл  юм.  Та  нохойны  дүрслэлтэй  тоглож  чадахгүй,  зөвхөн  бодит 
нохойтой л чадна. 
 
Dog класс нь “нохой ямар байдаг вэ” гэдгийг тодорхойлно: жин, өндөр, нүдний 
өнгө, үсний өнгө гэх мэт. Тэд мөн идэх, явах, хуцах, унтах гэх мэт хийж чаддаг 
авируудтай.  Тодорхой  нэг  нохой,  жишээ  нь  миний  нохой,  тодорхой  жин  (62 
pounds), өндөр (22 inches), нүдний өнгө (black), үсний өнгөтэй (yellow). Тэр мөн 
нохойнуудын хийж чаддаг бүх л зүйлийг хийж чадна. 
 
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐32‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
 
 
Объект хандлагат прорамчлалын том давуу тал нь програмын элементүүдийн 
боломж, шинжүүдийг нэгэн дан, биеэ даасан нэгжид далдлан кодлох боломж 
олгодогт  оршдог.  Өгөгдлийн  далдлалт,  удамшил,  полиморфизм  нь  объект 
хандлагат програмчлалын гурван тулгуур ухагдахуун юм. 
 
 / Хуучны програм зохиогчид нэгэн хошин асуултыг тавьдаг. Объект хандлагат 
програм  зохиогчийн  хувьд  гэрлийг  унтраахад  хэдэн  үйлдэл  хэрэгтэй  вэ? 
Хариулт нь: нэг ч үйлдэл хийхгүй, зүгээр гэрлийн лампад өөрийгөө унтраа гэж 
хэлэхэд хангалттай. / 
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( ) {
//...
}
}
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐33‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Класс үүсгэх үед түүний бүх шинжүүд, авируудыг тодорхойлох ёстой.  Дараахь 
цаг  хадгалах,  хэвлэх  жишээнд  анхаарал  хандуулая.  Классын  дотоод  төлөв  нь 
одоогийн он, сар, өдөр, цаг, минут, секундыг дүрслэх чадвартай байх ёстой. Мөн 
энэ  класс  нь  цагыг  хэвлэн  харуулах  чадвартай  байх  хэрэгтэй.  Ийм  классыг  6 
хувьсагч, 1 методтойгоор тодорхойлоё. 
 
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  Ассемблай  доторх  бүх  классуудаас  хандахаас  гадна  тухайн  классаас 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐34‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
удамшсан классын методууд хандана.  
 
Ерөнхийдөө классын гишүүд нь private хандалттай байдаг. Гишүүний хандалтыг 
нь заагаагүй бол private гэж ойлгоно. Тиймээс өмнөх жишээн дэх Time классын 
гишүүд нь private хандалттай гэсэн үг. 
 
private int Year;
private int Month;
private int Date;
private int Hour;
private int Minute;
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  объектыг  үүсгэж  байгаа  бичиглэл  нь  метод  дуудах  бичиглэлтэй 
төстэй харагдаж байна.  
 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐35‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
Time t = new Time();
 
Үнэндээ, объектыг үүсгэх үед метод дуудагддаг юм. Энэ дуудагдах методыг нь 
байгуулагч  гэж  нэрлэдэг.  Байгуулагчыг  нь  класс  дотор  тодорхойлж  өгөх  ёстой, 
эсвэл  CLR  үүнийг  орлуулж  хийж  өгдөг.  Байгуулагчын  үүрэг  бол  классаар 
заагдсан  объектыг  үүсгэх,  түүнийгээ  зөв  төлөвт  оруулах  юм.  Байгуулагч 
ажиллахын  өмнө  объект  нь  тодорхой  бус  санах  ойн  муж  байдаг,  байгуулагч 
ажилласны дараа зөв болж санах ойн муж эзэлдэг. 
 
Байгуулагчийг  тодорхойлохдоо  классын  нэртэй  ижил  медотыг  тодорхойлдог. 
Байгуулагч  нь  буцаах  утгагүй  байдаг  ба  ихэнхдээ  public  хандалттай  байдаг. 
Хэрэв аргумент авах шаардлагатай бол аргументуудыг зааж өгөх ёстой. 
 
Time класс нь байгуулагч тодорхойлогдоогүй байна. Хэрэв байгуулагч байхгүй 
бол хөрвүүлэгч  default байгуулагчийг санал болгох ба энэ нь объектыг санах ойд 
үүсгэнэ,  гэхдээ  өөр  ямар  нэг  үйлдэл  хийхгүй.  Гишүүн  хувьсагчдад  нь  тогтсон 
(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; 
“.NET програмчлал” хичээлийн лекцийн хураангуй 
 
‐36‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,  
магистр Б.Болормаа 
  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#‐д  хуулагч  байгуулагч  байхгүй,  тиймээс  үүнийг  өөрөө  хийх  хэрэгтэй. 
Тухайлбал дараахь байгуулагчийг үүсгэж болно. 
 
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 заалт нь классын статик 
биш гишүүд рүү хандах “нууц” заалт юм.  
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts
Dotnet lekts

More Related Content

What's hot (20)

Sw203 Lecture8 Interface
Sw203 Lecture8 InterfaceSw203 Lecture8 Interface
Sw203 Lecture8 Interface
 
5 & 6
5 & 65 & 6
5 & 6
 
CS203 Лекц02 Oop
CS203 Лекц02  OopCS203 Лекц02  Oop
CS203 Лекц02 Oop
 
Лекц-3
Лекц-3Лекц-3
Лекц-3
 
U.cs101 алгоритм программчлал-12
U.cs101   алгоритм программчлал-12U.cs101   алгоритм программчлал-12
U.cs101 алгоритм программчлал-12
 
Java лекц1
Java лекц1Java лекц1
Java лекц1
 
класс диаграм
класс диаграмкласс диаграм
класс диаграм
 
Programchlaliin c hel
Programchlaliin c helProgramchlaliin c hel
Programchlaliin c hel
 
It101 lect9
It101 lect9It101 lect9
It101 lect9
 
Sw203 Lecture5 Class Acess Modifiers
Sw203 Lecture5 Class Acess ModifiersSw203 Lecture5 Class Acess Modifiers
Sw203 Lecture5 Class Acess Modifiers
 
Lects 12
Lects 12Lects 12
Lects 12
 
C++ vndsen oilgolt хичээл 1
C++ vndsen oilgolt хичээл 1C++ vndsen oilgolt хичээл 1
C++ vndsen oilgolt хичээл 1
 
CS203 Лекц01 Prefeace
CS203 Лекц01  PrefeaceCS203 Лекц01  Prefeace
CS203 Лекц01 Prefeace
 
Java programchlal s.uuganbayr
Java programchlal s.uuganbayrJava programchlal s.uuganbayr
Java programchlal s.uuganbayr
 
копьютерийн үүсэл хөгжил
копьютерийн үүсэл хөгжилкопьютерийн үүсэл хөгжил
копьютерийн үүсэл хөгжил
 
үйлдлийн систем
үйлдлийн системүйлдлийн систем
үйлдлийн систем
 
Sw203 Lecture6 Inheritance
Sw203 Lecture6 InheritanceSw203 Lecture6 Inheritance
Sw203 Lecture6 Inheritance
 
санах ой
санах ойсанах ой
санах ой
 
C cons
C consC cons
C cons
 
u.cs101 "Алгоритм ба програмчлал" Лекц №1
u.cs101 "Алгоритм ба програмчлал" Лекц №1u.cs101 "Алгоритм ба програмчлал" Лекц №1
u.cs101 "Алгоритм ба програмчлал" Лекц №1
 

Viewers also liked

10000 доторх нэмэх,хасахын бататгал
10000 доторх нэмэх,хасахын бататгал10000 доторх нэмэх,хасахын бататгал
10000 доторх нэмэх,хасахын бататгалjobshig
 
Дээд эрэмбийн дифференциал тэгшитгэл
Дээд эрэмбийн дифференциал тэгшитгэлДээд эрэмбийн дифференциал тэгшитгэл
Дээд эрэмбийн дифференциал тэгшитгэлBattur
 
математик анализ лекц№9
математик анализ лекц№9математик анализ лекц№9
математик анализ лекц№9narangerelodon
 
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэл
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэлХялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэл
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэлBattur
 
Ердийн дифференциал тэгшитгэл
Ердийн дифференциал тэгшитгэлЕрдийн дифференциал тэгшитгэл
Ердийн дифференциал тэгшитгэлBattur
 
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Nael Narantsengel
 
математик анализ лекц№1
математик анализ лекц№1математик анализ лекц№1
математик анализ лекц№1narangerelodon
 
Натурал тоо сэдэвтэй холбоотой бодлогууд
Натурал тоо сэдэвтэй холбоотой бодлогуудНатурал тоо сэдэвтэй холбоотой бодлогууд
Натурал тоо сэдэвтэй холбоотой бодлогуудTse Ganaa
 
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Nael Narantsengel
 

Viewers also liked (10)

10000 доторх нэмэх,хасахын бататгал
10000 доторх нэмэх,хасахын бататгал10000 доторх нэмэх,хасахын бататгал
10000 доторх нэмэх,хасахын бататгал
 
Дээд эрэмбийн дифференциал тэгшитгэл
Дээд эрэмбийн дифференциал тэгшитгэлДээд эрэмбийн дифференциал тэгшитгэл
Дээд эрэмбийн дифференциал тэгшитгэл
 
математик анализ лекц№9
математик анализ лекц№9математик анализ лекц№9
математик анализ лекц№9
 
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэл
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэлХялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэл
Хялбар интегралчлагдах 1-р эрэмбийн дифференциал тэгшитгэл
 
Ердийн дифференциал тэгшитгэл
Ердийн дифференциал тэгшитгэлЕрдийн дифференциал тэгшитгэл
Ердийн дифференциал тэгшитгэл
 
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
 
математик анализ лекц№1
математик анализ лекц№1математик анализ лекц№1
математик анализ лекц№1
 
Натурал тоо сэдэвтэй холбоотой бодлогууд
Натурал тоо сэдэвтэй холбоотой бодлогуудНатурал тоо сэдэвтэй холбоотой бодлогууд
Натурал тоо сэдэвтэй холбоотой бодлогууд
 
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
Дипломын ажил /Шинэ яармаг хорооллыг цахилгаанаар хангах хөрөнгө оруулалт үр ...
 
Proj Example1
Proj Example1Proj Example1
Proj Example1
 

Similar to Dotnet lekts (20)

Лекц 1
Лекц 1Лекц 1
Лекц 1
 
1
11
1
 
Tutorial of python
Tutorial of pythonTutorial of python
Tutorial of python
 
Tutorial of python
Tutorial of pythonTutorial of python
Tutorial of python
 
Tutorial of python
Tutorial of pythonTutorial of python
Tutorial of python
 
It glossary
It glossaryIt glossary
It glossary
 
си хэлний ойлголт
си хэлний ойлголтси хэлний ойлголт
си хэлний ойлголт
 
Gosexem asuult 09
Gosexem asuult 09Gosexem asuult 09
Gosexem asuult 09
 
2014 is101 lec7
2014 is101 lec72014 is101 lec7
2014 is101 lec7
 
Лекц №5
Лекц №5Лекц №5
Лекц №5
 
Diplomnii etsii huvilbar
Diplomnii etsii huvilbarDiplomnii etsii huvilbar
Diplomnii etsii huvilbar
 
203lab1
203lab1203lab1
203lab1
 
Delphi7 oyutnii garin awlaga 2006 muis
Delphi7 oyutnii garin awlaga 2006 muisDelphi7 oyutnii garin awlaga 2006 muis
Delphi7 oyutnii garin awlaga 2006 muis
 
Lecture1
Lecture1Lecture1
Lecture1
 
Lecture1
Lecture1Lecture1
Lecture1
 
Лекц №6
Лекц №6Лекц №6
Лекц №6
 
Lecture2
Lecture2Lecture2
Lecture2
 
Lec1
Lec1Lec1
Lec1
 
Lab 8
Lab 8Lab 8
Lab 8
 
PL Lecture1
PL Lecture1PL Lecture1
PL Lecture1
 

More from E-Gazarchin Online University

More from E-Gazarchin Online University (20)

ESON101-Хичээл 11 /20190325/
ESON101-Хичээл 11 /20190325/ESON101-Хичээл 11 /20190325/
ESON101-Хичээл 11 /20190325/
 
ECON302-хичээл 10 /20190319/
ECON302-хичээл 10 /20190319/ECON302-хичээл 10 /20190319/
ECON302-хичээл 10 /20190319/
 
ECON302-хичээл 9 /20190312/
ECON302-хичээл 9 /20190312/ECON302-хичээл 9 /20190312/
ECON302-хичээл 9 /20190312/
 
ESON101-Хичээл 8 /20190306/
ESON101-Хичээл 8 /20190306/ESON101-Хичээл 8 /20190306/
ESON101-Хичээл 8 /20190306/
 
ESON101-Хичээл 9 /20190313/
ESON101-Хичээл 9 /20190313/ESON101-Хичээл 9 /20190313/
ESON101-Хичээл 9 /20190313/
 
ECON303-Хичээл 9 /20190311/
ECON303-Хичээл 9 /20190311/ECON303-Хичээл 9 /20190311/
ECON303-Хичээл 9 /20190311/
 
ECON303-Хичээл 8 /20190304/
ECON303-Хичээл 8 /20190304/ECON303-Хичээл 8 /20190304/
ECON303-Хичээл 8 /20190304/
 
ECON303-Хичээл 6 /20190218/
ECON303-Хичээл 6 /20190218/ ECON303-Хичээл 6 /20190218/
ECON303-Хичээл 6 /20190218/
 
ECON303-Хичээл 10 /20190318/
ECON303-Хичээл 10 /20190318/ECON303-Хичээл 10 /20190318/
ECON303-Хичээл 10 /20190318/
 
ESON101-Хичээл 7 /20190227/
ESON101-Хичээл 7 /20190227/ESON101-Хичээл 7 /20190227/
ESON101-Хичээл 7 /20190227/
 
ESON101-Хичээл 6-1 /20190220/
 ESON101-Хичээл 6-1 /20190220/ ESON101-Хичээл 6-1 /20190220/
ESON101-Хичээл 6-1 /20190220/
 
ECON303-Хичээл 7 /20190225/
ECON303-Хичээл 7 /20190225/ECON303-Хичээл 7 /20190225/
ECON303-Хичээл 7 /20190225/
 
ESON101-Хичээл 5 /20190213/
ESON101-Хичээл 5 /20190213/ESON101-Хичээл 5 /20190213/
ESON101-Хичээл 5 /20190213/
 
KLON103-Хичээл-2 /20190125/
KLON103-Хичээл-2 /20190125/KLON103-Хичээл-2 /20190125/
KLON103-Хичээл-2 /20190125/
 
ECON302-хичээл 4 /20190129/
ECON302-хичээл 4 /20190129/ECON302-хичээл 4 /20190129/
ECON302-хичээл 4 /20190129/
 
ESON101-Хичээл 4 /20190130/
ESON101-Хичээл 4 /20190130/ESON101-Хичээл 4 /20190130/
ESON101-Хичээл 4 /20190130/
 
KLON102-Хичээл 3/20190122/
KLON102-Хичээл 3/20190122/KLON102-Хичээл 3/20190122/
KLON102-Хичээл 3/20190122/
 
ESON101-Хичээл 3 /20190123/
ESON101-Хичээл 3 /20190123/ ESON101-Хичээл 3 /20190123/
ESON101-Хичээл 3 /20190123/
 
CPON411-Хичээл-2-1 /20190122/
CPON411-Хичээл-2-1 /20190122/ CPON411-Хичээл-2-1 /20190122/
CPON411-Хичээл-2-1 /20190122/
 
KLON102-Хичээл 2 /2019015/
KLON102-Хичээл 2 /2019015/ KLON102-Хичээл 2 /2019015/
KLON102-Хичээл 2 /2019015/
 

Dotnet lekts

  • 1. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐1‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Лекц 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  систем  нь  онолын  хувьд  өөр  үйлдлийн  системүүд  дээр  ажиллах  боломжтой, 
  • 2. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐2‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  тухайлбал  Linux,  MAC,  Solaris    зэрэг.  Энэ  чиглэлээр  MONO  нэртэй  төсөл  амжилттай хийгдэж байна. Вэб хаяг нь http://www.mono‐project.com/Main_Page.       Зураг1‐1 .NET системийн архитектур        .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 нь хэлний эрх чөлөөнөөс гадна хэлний нэгдмэл байдлыг хангадаг. Энэ нь  өөр  өөр  хэл  дээр  бичигдсэн  классуудын  хооронд  удамшуулах,  алдаа  барих,                                                    1 Мөн CLR дээр ажиллах COBOL, Python, Fortran, Smalltalk зэрэг олон тооны хэлүүд бий болсон
  • 3. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐3‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  полиморф хийх давуу талтай юм. Энэ боломжийг Common Type System (CTS)  гэж нэрлэгдэх тодорхойлолтын тусламжтайгаар бий болгодог. Тухайлбал, .NET  дэх бүх зүйл нь System.Object гэж нэрлэгдэх язгуур классын объектууд юм. CTS  нь  класс,  интерфэйс,  төлөөлөгч2,  заалт  төрөл3,  үндсэн  төрөл  зэрэг  ерөнхий  ухагдахуунуудыг өөртөө агуулдаг.    Мөн .NET нь хэл хоорондын нэгдмэл байдлыг хангахад зориулагдсан Common  Language  Specification  (CLS)‐г  өөртөө  агуулдаг.  CLS  нь  .NET  хэл  байх  хамгийн  доод  шаардлагуудыг  тодорхойлсон  байдаг.    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                                                   2 delegate төрөл, C хэлний функцийн заагчтай төстэй 3 reference type – C# дахь бүх объектууд нь заалт төрөлд хамаарна  
  • 4. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐4‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  .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 байт кодтой төстэй
  • 5. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐5‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Ассемблай гэдэг нь 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# програм бичиж эхлэх    Уламжлалт  “Hello  World”  програмаа  бичиж  эхлэе.  Доорх  жижигхэн  програмаар C# хэлний түлхүүр онцлогуудыг гаргахыг оролдоё.    class HelloWorld {    static void Main() {      // системийн консоль объектыг ашиглаж байна      System.Console.WriteLine(“Hello World”);    }  }    HelloWorld –г хөрвүүлээд ажиллуулахад “Hello World” гэсэн текстийг консоль  (текст  командын  горимд  ажилладаг)  дээр  харуулна.  Энэ  жижигхэн  програм  дээр илүү дэлгэрэнгүй цааш авч үзэе.    1.5 Класс, Объект, Төрөл    Объект хандлагат програмчлалын үндэс суурь бол шинэ төрлүүдийн үүсэн бий  бололт  юм.    Төрөл  гэдэг  нь  нэг  зүйл  юм.  Зарим  тохиолдолд  зүйл  гэдэг  нь  өгөгдлийн  хүснэгт,  thread  гэх  мэт  хийсвэр,  зарим  тохиолдолд  цонхон  доторх  товчлуур гэх мэт бодитой байдаг. Төрөл нь зүйлүүдийн ерөнхий нийтлэг шинж  чанар (property), авирыг (behavior) тодорхойлдог.    
  • 6. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐6‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Жишээлбэл,  програмд  Help,  Ok,  Cancel  гэсэн  гурван  товчлууртай  гэж  бодоё.  Эдгээр  тус  бүрдээ  өөрийн  хэмжээ,  байрлал,  гарчигтай.  Мөн  бүгд  зурагдах,  идэвхжих, дарагдах гэх мэт нийтлэг авиртай. Иймээс хэдийгээр бие биенээсээ  ялгагдах боловч эд бүгдээрээ нэг төрлийнх юм.    Объект  хандлагат  прорамчлалын  хэлэнд  байдаг  шиг  C#  ‐д  төрөл  нь  классаар  тодорхойлогддог. Классын төлийг5 нь объект гэж нэрлэдэг.     “Hello  World”  програмд  нэг  төрөл  тодорхойлогдсон  байна,  тэр  нь  HelloWorld  класс  юм.  C#‐д  төрлийг  классаар  тодорхойлох  ба  class  гэсэн  түлхүүр  үгийг  ашигладаг, тэгээд нэр өгнө ‐ энэ тохиолдолд нэр нь HelloWorld, дараа нь түүний  шинжүүд, авируудыг тодорхойлдог.   Методууд Класс нь шинж чанар, авир хоёуланг өөртөө агуулдаг. Авир нь түүний гишүүн  методуудаар тодорхойлогддог. Шинж чанарыг дараагийн сэдвээр авч үзэе.    Метод гэдэг нь класс доторх функц юм. Заримдаа методыг гишүүн функц гэж  нэрлэдэг. Методууд WriteLine(), AddNumbers() гэх мэт нэртэй байна. Дээрх  жишээнд класс нь Main() гэж нэрлэгдэх тусгай нэртэй методыг агуулсан байна,  энэ тодорхойлолт нь классын үндсэн буюу эхний метод юм шүү гэдгийг CLR‐д  хэлж  өгдөг.  Програм  ажиллаж  эхлэхэд  CLR  нь  Main()  функцийг  дууддаг.  C#  програм болгон Main() методтой байх ёстой.     Зарчмын  хувьд  програмд  хэд  хэдэн  Main()  метод  байж  болох  ба  /main  директивыг ашиглан аль классын Main() метод нь тухайн програмын эхлэх цэг  болох вэ гэдгийг зааж болно.    Метод тодорхойлолт нь дараахь байдалтай.    int myMethod(int size);   Энэ  тодорхойлолт  нь  myMethod  нэртэй  метод  size  хувьсагчаар  дамжуулан  нэг  параметерийг  хүлээн  авах  ба  бүхэл  тоон  утгыг  үр  дүн  болгон  гаргана  гэдгийг  хэлж байна.     Зарим методууд үр дүн буцаадаггүй, энэ тохиолдолд түүнийг void буцааж байна  гэж хэлдэг. Жишээ нь:    void myVoidMethod( ); Тайлбар хийх                                                   5 Instance – Төл, нэг хувь, нэг хуулбар
  • 7. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐7‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  C# програм дотор мөн тайлбар бичигдэж болно.     // системийн консоль объектыг ашиглаж байна Хоёр налуу зураасаар эхэлсэн мөр нь тайлбар гэдгийг илэрхийлдэг. Тайлбар нь  програм зохиогчийн бичсэн тэмдэглэгээ бөгөөд програмын ажиллагаанд нөлөө  үзүүлэхгүй. C# хэлэнд тайлбарыг гурван янзаар хийж болно.    Эхнийх  нь,  //‐аар  эхлээд  тухайн  мөрийн төгсгөл  хүртэл  нэг  мөр  тайлбар  байж  болно.    Хоёр дахь нь, /*‐ээр эхлүүлж */ –ээр дуусгаж олон мөр тайлбар хийж болно.    Гурав  дахь  нь,  кодыг  XML  дээр  суурилсан  баримттай  холбож  тайлбар  хийх  боломжтой байдаг. Үүнийг дараа үзнэ.  Консоль програм “HelloWorld” програм нь консоль ангиллын програм юм. Консоль програм нь  товч,  сонголт  зэрэг  хэрэглэгчийн  график  интерфэйс  байхгүй,  зөвхөн  текст  өгөгдөл  оруулах,  гаргах  үйлдлүүд  хийгддэг  програм  юм  (MS‐DOS  програмуудтай төстэй).     Дээрх програмд консоль руу гаралт нь Console классаар хийгдэж байна, Console  класс  нь  стандарт  гаралт  рүү  текстийг  хэвлэх  WriteLine()  методтой  байдаг.  Методыг дуудахдаа (.) цэг үйлдлийг ашиглана.  Нэрмуж .NET  системийн  классын  санд  ArrayList,  Dictionary,  Event  гэх  мэт  хэдэн  арав,  хэдэн  зуун  мянган  нэрсүүд  байдаг.  Эдгээр  нэрсийг  ялгахад  асуудал  үүсдэг.  Програм  зохиогч  тэдгээр  нэрсийг  бүгдийг  нь  санаж  чадахгүй,  мөн  аль  нэг  нэртэй  нь  ижил  нэртэй  өөрийн  гэсэн  классыг  үүсгэх  үед  асуудал  гарна.   Тухайлбал, програм зохиогч өөрийн Dictionary нэртэй классыг үүсгэхийг хүсэж  болно,  гэтэл  энэ  нь  .NET‐д  байдаг  Dictionary  классын  нэртэй  зөрчил  үүсгэнэ,  учир нь класс бүр үл давхардах нэртэй байх ёстой байдаг.    Үүнийг шийдэх шийдэл нь нэрмуж6 юм. Нэрмуж нь тодорхой зүйлсийг нэгэн  нэрийн дор хамаатуулан утга учиртай нэрлэх боломж олгодог юм.   Том, жижиг сг д C# хэлэнд нэрний үсгийн том, жижиг нь ялгаатай, ө.х writeLine ба WriteLine нь  ялгаатай  юм.  Тиймээс  програмын  код  дахь  хувьсагч,  функц,  тогтмолын  нэрсүүдийг тодорхой дүрмийн дагуу нэршиж занших нь зүйтэй.                                                     6 namespace 
  • 8. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐8‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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  файлын зөвхөн‐уншигдах хэсэгт оруулдаг.                             
  • 9. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐9‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Лекц 2.3   C# хэлний үндэсүүд  Дэд сэдвүүд: • Үндсэн төрлүүд (тогтмол,хувьсагч, илэрхийлэл)  • Үйлдлүүд (энгийн, арифметик, жиших, нөхцөлт, логик үйлдэл, үйлдлийн зэрэглэл)  • Заавар   Үндсэн төрлүүд  C# хэл нь хатуу төрөлтэй хэл юм. Хатуу төрөлтэй хэлэнд үүсгэж байгаа объект  бүрийн  төрлийг  заавал  тодорхой  заах  ёстой.  Ингэснээр  хөрвүүлэгч  тухайн  объектод  тохирсон  утгыг  оноохыг  шаарддаг,  энэ  нь  мөн  алдаа  гаргахаас  сэргийлдэг.  Өгөгдлийн төрөл нь хөрвүүлэгчид тухайн объектын хэмжээ (жнь,  int төрөл нь 4 байт объектыг заана), авируудыг мэдээлдэг (жнь, Button нь зурах,  дарах гэх мэт авиртай).    C#‐ийн төрлүүдийг хоёр ангилалд хуваана: үндсэн төрөл (value type), заалт төрөл  (reference type). Үндсэн төрөл болон заалт төрлийн хоорондох  ялгаа бол санах  ойд  утгуудаа  яаж  хадгалж  байгаа  арга  юм.  Үндсэн  төрөл  нь  өгөгдлөө  стект  хадгалдаг.  Заалт  төрлийн  хувьсагчийн  хаяг  нь  стект  байрлана,  харин  жинхэнэ  объект нь хийпэд7 байрладаг.    Стек ба Хийп    Стек гэдэг нь “эхэлж орсон нь сүүлд гарах“ зарчмаар элементүүдийг хадгалдаг  өгөгдлийн  бүтэц  юм.  Энд  дурдсан  стек  нь  локаль  хувсагчидыг  хадгалах  санах  ойн мужийг хэлж байна.    C#  хэлэнд  үндсэн  төрлүүд  нь,  жишээ  нь  integer,  стект  хувиарлагдах  бөгөөд  хувьсагчийн нэр нь санах ойн хаягаа илэрхийлж байдаг.    Заалт  төрлүүд  нь  (жнь,  object)  хийпэд  хувиарлагддаг.  Объект  хийпэд  хувиарлагдах  үед  түүний  хаяг  нь  буцаагдах  ба  энэхүү  хаяг  нь  заалт  болон  хувьсагчид оноогддог.    Хог цуглуулагч8  нь  объектын  зарлагдсан  стек  хүрээ  дууссанаас  хойш  хэсэг  хугацааны  дараа  тэрхүү  объектыг  санах  ойгоос  устгадаг.  Стек  хүрээ  гэдэг  нь  үндсэндээ  функцүүдээр тогтоогддог. Тухайлбал, функц дотор локаль хувьсагч  зарлавал уг функ ажиллаж дууссаны дараа үлдэгдэл цуглуулагч түүнийг устгах  ёстой гэдгийг ойлгох болно.    Хийп  дэх  объектуудын  хувьд  түүнийг  зааж  байгаа  хамгийн  сүүлийн  заалт                                                    7 Heap – санах ойн нэг төрлий н муж 8 Garbage collector 
  • 10. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐10‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  устсанаас  хойш  хэсэг  хугацааны  дараа  уг  объект    үлдэгдэл  цуглуулагчаар  устгагддаг.       C# хэлэнд орчин үеийн хэлэнд байвал зохих бүх үндсэн төрлүүд байдаг бөгөөд  эдгээр нь харгалзан .NET CLS төрөл рүүгээ бууж байдаг. C# төрлийг .NET рүү  харгалзуулсан  буулгалт  нь  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 төрлийг ихэнх  тохиолдолд хэрэглэх нь зүйтэй.   Тогтмол ба Хувьсагч Хувьсагч гэдэг нь тодорхой төрөл бүхий санах ойн хадгалах үүр юм. Хувьсагчид  утга оноож болно мөн тэрхүү утга нь програмын ажиллах үед өөрчлөдөнө.   
  • 11. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐11‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Хувсагчийг зарлахдаа түүний төрөл, нэрийг зааж өгөх ёстой. Хувьсагчийг зарлах  үед түүнд анхны утгыг оноож өгч болно.    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 гэсэн утгыг дахин оноож  дахин хэвлэж байна.    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'   Тэгэхээр програм дахь хувьсагч бүрийг зарлахдаа анхны утга оноох ёстой юу?  Үгүй,  заавал  анхны  утга  оноох  хэрэггүй,  гэхдээ  заавал  ашиглахын  өмнө  утга  оноосон байх хэрэгтэй гэсэн үг.   
  • 12. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐12‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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) ашигладаг.    Камель  ба  Паскаль  тэмдэглээний  ялгаа  гэвэл  Паскаль  тэмдэглэгээнд  нэр  нь  том үсгээр эхэлдэг.    Нэр  нь  түлхүүр  үгтэй  адил  байж  болохгүй.  Ө.х  int  эсвэл  class  гэсэн  нэртэй  хувьсагчид байж болохгүй.     Тогтмол Тогтмол  гэдэг  бол  түүний  утгыг  нь  өөрчлөх  боломжгүй  хувьсагч  юм.  Зарим  тохиолдолд хувьсагчийн утга өөрчлөгдөхгүй байх хэрэгцээ гардаг.     Тогтмол  нь  3  хэлбэрээр  байж  болно:  эх  хэлбэрээрээ,  нэрлэсэн  тогтмол,  тоочсон  тогтмол.     x = 32;   Энд 32 гэсэн тоо нь эх хэлбэрээрээ байгаа тогтмол юм. Ө.х 32‐н утга бол үргэлж  32 байна, 32‐д шинэ утга оноож чадахгүй, өөрчилж чадахгүй.    Нэрлэсэн тогтмол нь тогтмол утгад нэр оноосон хэлбэр юм. Дараахь байдлаар  ийм тогтмолыг зарлаж болно.    const type identifier = value;   Тогтмол нь зарлагдах үедээ анхны утга нь оноогдсон байх ёстой. 
  • 13. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐13‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    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; 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   
  • 14. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐14‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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;   Тэмдэгт мөр утга нь давхар хашилтад хийгдэж бичигдэнэ:    “Hello World”   Анхны утга оноосон тэмдэгт мөр төрлийн хувьсагч:    string myString = “Hello World”;   Илэрхийлэл Үр  дүндээ  утга  гаргадаг  хувьсагч,  тогтмол,  объект,  үйлдлүүдийн  дараалсан  нийлэмжийг илэрхийлэл гэдэг. Жишээлбэл,  myVariable = 57 нь илэрхийлэл юм.  Учир нь энэ нь 57 гэсэн утгыг үр дүн болгон гаргаж байна.  Энд (=) тэмдэгт нь  утга оноох үйлдэл юм (тэнцүүлэх үйлдэл биш!).    myVariable  =  57  нь  илэрхийлэл  учраас  өөр  илэрхийлэл  дотор  мөн  оролцож  болно.   
  • 15. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐15‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  mySecondVariable = myVariable = 57;   Энэ жишээнд  57 утга  myVariable хувьсагчид оноогдож байна, энэ олголтын  үр  дүн нь дахиад хоёр дахь хувьсагч болох mySecondVariable‐д оноогдож байна.     Илэрхийлэлд илүү сул зайнуудыг оруулж болно. Жишээлбэл,    myVariable = 5;эсвэл: myVariable = 5;   Хөрвүүлэгч  нь  дээрх  хоёр  зааврыг  адилхан  гэж  үзнэ.  Гэхдээ  энэ  дүрэм  нь  тэмдэгт мөр тогтмолын хувьд буруу болох юм. Ө.х “Hello World” ба “Hello        World”  тэмдэгт мөрүүд нь ялгаатай.    Сул  зайг  ихэвчлэн  програмыг  уншихад  илүү  ойлгомжтой  болгох  зорилгоор  ашигладаг, хөрвүүлэгчийн хувьд энэ нь ялгаагүй зүйл.  йлдэл Энгийн  тооцоолол  хийхэд  олгох,  нэмэх,  хасах  гэх  мэт  олон  үйлдлүүдийг  ашигладаг.   Олгох йлдэл (=) Энэ тэмдэгт нь олгох үйлдлийг төлөөлөх ба зүүн талд байгаа хувьсагчид баруун  талд байгаа утгыг олгоход хэрэглэгддэг.  Арифметик йлдл д C#  нь  нэмэх  (+),  хасах  (‐),  үржих  (*),  хуваах  (/),  үлдэгдэл  олох  (%)  арифметик  үйлдлүүдийг ашигладаг.     Хуваах үйлдлийн хувьд бүхэл 2 тоог хуваах үед ногдворын бүхэл хэсэг нь үр дүн  болж  гарна.  Жишээ  нь,  17‐г  4‐д  хуваахад  үр  дүн  нь  4  болно  (17/4=4  ба  1  үлдэгдэлтэй).  Харин бодит тоог хуваах үед үр дүн нь бутархай тоо гарна.  Үлдэгдэл  олох  үйлдэл  нь  мөн тоог  ямар  нэг  тоо  өөр тоонд  бүхлээр  хуваагддаг  эсэхийг  шалгахад  хэрэглэгдэж  болно.    80  %  10  =  0  учраас  80  нь  10‐д  бүхлээр  хуваагдана.  Тооцоолоод олгох йлдэл mySalary хувьсагчийн утгыг 5000‐аар нэмэгдүүлэх хэрэгтэй гэж бодоё. Үүнийг     mySalary = mySalary + 5000;   эсвэл  
  • 16. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐16‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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 Н хц лт йлдэл Ихэнх үйлдэл нэг юмуу хоёр илэрхийллийг холбогддог. Харин нөхцөлт үйлдэл нь  (?:) гурван илэрхийллийг холбодог.    cond-expr ? expr1 : expr2
  • 17. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐17‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    Энэ үйлдэл нь 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 үнэн эсвэл худал утга гаргадаг илэрхийлэл 
  • 18. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐18‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    Дараахь кодыг авч үзэе.    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  ^  Бит Буюу  | 
  • 19. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐19‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Логик Ба  &&  Логик Буюу  ||  Гурван байрт  ?:  Олгох  = *= /= %= += ‐= <<= >>= &= ^= |=    3. Заавар Зааварууд нь ямар боловсруулалт хийхийг компьютерт зааварлана. Заавруудын  олонлогоос програм нь тогтоно.  Заавар бүр цэгтэй таслалаар (;) төгсөх ёстой.  Жишээлбэл,     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( ).
  • 20. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐20‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    Хоёр  дахь  зам  нь  нөхцөлт  бус  салаалах  түлхүүр  үгүүдийг  ашиглах:  goto,  break,  continue, return, throw.  Эдгээрийн тухай дараа дэлгэрүүлэн судлана.    3.2 Н хц лт салаалах заавар Нөхцөлт  салаалалт  нь  if,  else,  switch  зэрэг  түлхүүр  үгүүдийн  тусламжтай  хийгдэнэ. Өгөгдсөн нөхцөлөөс хамааран салаалалт хийгдэнэ.    3.2.1 If..else заавар 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; }
  • 21. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐21‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    гэж бичиж болно.    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."); } 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) {
  • 22. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐22‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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; 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."); } }  
  • 23. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐23‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Энэ  жишээнд  улс  төрийн  бүлгүүдийг  төлөөлсөн  тогтмолууд  тодорхойлсон  байна.  Дараа  нь  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”:   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;
  • 24. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐24‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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++; } return 0; } }   Энэ  код  нь  өмнөх  goto‐н  жишээн  дэх  кодтой  ижил  үйлдэл  хийнэ.    Гэхдээ  програмын  логик  нь  илүү  ойлгожтой  харагдаж  байна.  while  заавар  нөхцөл  худал үед нэг ч удаа биелэхгүй.    3.3.3 do..while давталт Зарим  тохиолдолд  “үнэн  үед  үүнийг  гүйцэтгэ”  гэсэн  өгүүлбэрээ  “үүнийг  гүйцэтгэ, үнэн байх үед давт” гэж өөрчлөх хэрэг гарч болно. Ө.х үйлдэл эхлээд  хийгдэнэ,  үүний  дараа  шалгалт  хийгдэнэ.  Энэ  зорилгоор  do..while  давталтыг  ашиглаж болно.    do expression while statement  
  • 25. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐25‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Жишээ нь,    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); if (i%10 == 0) { Console.WriteLine("t{0}", i); } } return 0; } }   Энэ  жишээнд  10‐д  үлдэгдэлгүй  хуваагдах  тоонуудыг  хэвлэж  байна.  Хэвлэхдээ  Console.Write  методыг  ашигласан  байна,  энэ  нь  WriteLine  –тай  адил  боловч  шинэ мөрөнд шилжихгүй үргэлжлүүлж хэвлэдэгээрээ ялгаатай.     Энд  зарласан  i  хувьсагч  нь  for  давталтын  хүрээн  дотроо  л  үйлчлэх  юм.  Ө.х  дараахь мөрийг нэмбэл хөрвүүлэгч алдаа заах болно.   
  • 26. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐26‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  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); } }   Энэ нь илүү уншихад ойлгомжтой  бичиглэл юм.    3.3.5 foreach давталт Энэ  давталт  нь  C  төрлийн  програм  зохиогчдын  хувьд  шинэ  зүйл  юм,  гэхдээ  Visual Basic програм зохиогчдын хувьд танил байх. Энэ давталт нь массив болон  бусад өгөгдлийн бүтцийн бүх элементүүдээр давталт хийхэд хэрэглэгддэг.    foreach (type identifier in expression) statement   Жишээ: 
  • 27. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐27‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    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( ) { 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
  • 28. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐28‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  // 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‐н хооронд бичигдээгүй бусад кодын хувьд препроцессорт хамаагүй  бөгөөд програм руу хөрвүүлэгдэх болно.    Үүсгэсэн нэрийг #undefine заавраар хасаж болно. Жишээ нь:    #define DEBUG #if DEBUG // энэ код хөвүүлэгдэнэ #endif
  • 29. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐29‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    #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  гэх  мэт  хэрэгсэл  ашиглах  үед  програмын  кодын  зарим  хэсгийг  эвхэж  зөвхөн  тайлбарыг  нь  харуулахад  хэрэглэгддэг.  Жишээлбэл,  доорх  жишээнд ийм кодын муж тодорхойлсон ба муж нь дэлгэгдсэн харагаж байна.       
  • 30. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐30‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Энд  муж  нь  #region  ба  #endregion  зааврын  хооронд  бичигдсэн  байна.  Энэ  мужийг эвхсэн үед зөвхөн тайлбар нь харагдана.                                                     
  • 31. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐31‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Лекц №4.5.6        Сэдэв: Класс ба Объектууд  Дэд сэдвүүд:   • Класс тодорхойлох  • Объект үүсгэх  • Статик гишүүд  • Объектыг устгах  • Параметер дамжуулах  • Метод болон байгуулагчыг дахин тодорхойлох  • Операторыг дахин тодорхойлох  • Өгөгдлийг далдлах – Проперти    Бид  int,  long,  char  гэх  мэт  үндсэн  төрлүүдийг  мэднэ.  Програмчлалын  хэл  нь  програм  зохиогчид  шинэ,  илүү  нийлмэл  төрлүүдийг  үүсгэх  боломжийг  олгох  ёстой. C#‐д класс үүсгэж шинэ төрлүүдийг бий болгож болно.     Классын төлийг объект гэж хэлдэг. Програм ажиллаж байх үед объект нь санах  ойд  үүсдэг.  Класс  ба  Объектын  хоорондох  ялгаа  бол  нохойны  тухай  дүрслэл,  төсөөлөл ба жинхэнэ таны өмнө сууж байгаа нохой хоёрын хоорондох ялгаатай  болон  ижил  зүйл  юм.  Та  нохойны  дүрслэлтэй  тоглож  чадахгүй,  зөвхөн  бодит  нохойтой л чадна.    Dog класс нь “нохой ямар байдаг вэ” гэдгийг тодорхойлно: жин, өндөр, нүдний  өнгө, үсний өнгө гэх мэт. Тэд мөн идэх, явах, хуцах, унтах гэх мэт хийж чаддаг  авируудтай.  Тодорхой  нэг  нохой,  жишээ  нь  миний  нохой,  тодорхой  жин  (62  pounds), өндөр (22 inches), нүдний өнгө (black), үсний өнгөтэй (yellow). Тэр мөн  нохойнуудын хийж чаддаг бүх л зүйлийг хийж чадна.     
  • 32. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐32‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа      Объект хандлагат прорамчлалын том давуу тал нь програмын элементүүдийн  боломж, шинжүүдийг нэгэн дан, биеэ даасан нэгжид далдлан кодлох боломж  олгодогт  оршдог.  Өгөгдлийн  далдлалт,  удамшил,  полиморфизм  нь  объект  хандлагат програмчлалын гурван тулгуур ухагдахуун юм.     / Хуучны програм зохиогчид нэгэн хошин асуултыг тавьдаг. Объект хандлагат  програм  зохиогчийн  хувьд  гэрлийг  унтраахад  хэдэн  үйлдэл  хэрэгтэй  вэ?  Хариулт нь: нэг ч үйлдэл хийхгүй, зүгээр гэрлийн лампад өөрийгөө унтраа гэж  хэлэхэд хангалттай. /  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( ) { //... } }  
  • 33. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐33‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Класс үүсгэх үед түүний бүх шинжүүд, авируудыг тодорхойлох ёстой.  Дараахь  цаг  хадгалах,  хэвлэх  жишээнд  анхаарал  хандуулая.  Классын  дотоод  төлөв  нь  одоогийн он, сар, өдөр, цаг, минут, секундыг дүрслэх чадвартай байх ёстой. Мөн  энэ  класс  нь  цагыг  хэвлэн  харуулах  чадвартай  байх  хэрэгтэй.  Ийм  классыг  6  хувьсагч, 1 методтойгоор тодорхойлоё.    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  Ассемблай  доторх  бүх  классуудаас  хандахаас  гадна  тухайн  классаас 
  • 34. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐34‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  удамшсан классын методууд хандана.     Ерөнхийдөө классын гишүүд нь private хандалттай байдаг. Гишүүний хандалтыг  нь заагаагүй бол private гэж ойлгоно. Тиймээс өмнөх жишээн дэх Time классын  гишүүд нь private хандалттай гэсэн үг.    private int Year; private int Month; private int Date; private int Hour; private int Minute; 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  объектыг  үүсгэж  байгаа  бичиглэл  нь  метод  дуудах  бичиглэлтэй  төстэй харагдаж байна.    
  • 35. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐35‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа  Time t = new Time();   Үнэндээ, объектыг үүсгэх үед метод дуудагддаг юм. Энэ дуудагдах методыг нь  байгуулагч  гэж  нэрлэдэг.  Байгуулагчыг  нь  класс  дотор  тодорхойлж  өгөх  ёстой,  эсвэл  CLR  үүнийг  орлуулж  хийж  өгдөг.  Байгуулагчын  үүрэг  бол  классаар  заагдсан  объектыг  үүсгэх,  түүнийгээ  зөв  төлөвт  оруулах  юм.  Байгуулагч  ажиллахын  өмнө  объект  нь  тодорхой  бус  санах  ойн  муж  байдаг,  байгуулагч  ажилласны дараа зөв болж санах ойн муж эзэлдэг.    Байгуулагчийг  тодорхойлохдоо  классын  нэртэй  ижил  медотыг  тодорхойлдог.  Байгуулагч  нь  буцаах  утгагүй  байдаг  ба  ихэнхдээ  public  хандалттай  байдаг.  Хэрэв аргумент авах шаардлагатай бол аргументуудыг зааж өгөх ёстой.    Time класс нь байгуулагч тодорхойлогдоогүй байна. Хэрэв байгуулагч байхгүй  бол хөрвүүлэгч  default байгуулагчийг санал болгох ба энэ нь объектыг санах ойд  үүсгэнэ,  гэхдээ  өөр  ямар  нэг  үйлдэл  хийхгүй.  Гишүүн  хувьсагчдад  нь  тогтсон  (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; 
  • 36. “.NET програмчлал” хичээлийн лекцийн хураангуй    ‐36‐                 Боловсруулсан багш ММЗТэнхимийн ахлах багш,   магистр Б.Болормаа    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#‐д  хуулагч  байгуулагч  байхгүй,  тиймээс  үүнийг  өөрөө  хийх  хэрэгтэй.  Тухайлбал дараахь байгуулагчийг үүсгэж болно.    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 заалт нь классын статик  биш гишүүд рүү хандах “нууц” заалт юм.