Lecture vcp413

9,990 views

Published on

3 Comments
11 Likes
Statistics
Notes
  • mash ih taalagdlaa tnks.Ajliin amjilt husie
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • goy lecture bna bayrlalaa heregtei medeelel ihiig olj avlaa
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • asd
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
9,990
On SlideShare
0
From Embeds
0
Number of Embeds
104
Actions
Shares
0
Downloads
576
Comments
3
Likes
11
Embeds 0
No embeds

No notes for slide

Lecture vcp413

  1. 1. VCP413 Лекцийн материал Лекц №1 Сэдэв: .NET ба С# хэлний тухай. Оршил Програм хангамжийн инженерүүд одоо цагт өөр өөрсдийнхөө онцлогоос шалтгаалан янз бүрийн өөрсдөд нь тохирох програмчлалын хэлийг сонгон дагнан, хэзээ ч дуусашгүй мэдээлэлийн технологийн салбарт ажиллаж байна. Анхны програм хангамжийн инженерүүд паскал, турба С гэх мэт доод шатний програм хамгамжийн хэлийг ашиглаж байсан. Одоо ч гэсэн зарим програм хангамжийн инженерүүд эдгээр програм хангамжийн хэлийг ашигладаг хэвээрээ. Турба С хэл хөгжин дэвшиж С++ буюу объект хандлагат хэл үүссэн, харин одоо C# болтлоо хөгжөөд байна. Өөрөөр хэлбэл C# хэлний өвөг дээдэс нь C гэж хэлж болно. C дээр бичиж чаддаг хүмүүс C# дээр бичиж чаддаг, хурдан ч сурдаг. Яагаад гэвэл C# хэлний бичигдэх хэлбэр нь C хэлтэй төстэй. Бичигдэх хэлбэрээрээ төстэй гэхээрээ үр дүн нь адилхан гэж ойлгож болохгүй. Ихэнх хүмүүс жава хэл, болон C# хэлүүдийг цэвэр обьект хандлагат хэл гэж үздэг. C# хэл дээр чадварын хувь бусдаас давуу болон тутагдалтай талууд бий. C бол windows -н доод түвшин болон техник хангамжтай харьцахдаа маш сайн байдаг ба маш нарийн бичиглэл ихтэй бол C# visual орчинд сайн байх жишээтэй. Гэхдээ энэ тутагдлууд нь нөгөөд нь огт байдаггүй гэсэн үг биш харин төвөгтэй гэх нь зөв байх. Та ямар нэг програм хангамжийн хэл мэддэг байхад л хангалттай. Програм хангамжийн хэлүүдэд ихэнхдээ нэмэлт сангууд нэмэгдсэнээр л өөрчлөгдөг. Тэдгээрийг л сайн мэдээд авчихвал цаг үеээсээ хоцрохгүй, сайн програм хангамжийн инженер болж чадна. Та хэрэв програмчлалын хэл сурах гэж байгаа бол би танд С болон C# санал болгож байна яагаад гэвэл би анх эхэлж эдгээр хэлийг сурсан ба энэ хэл бол бусад хэлүүдийг бодвол маш чадварлаг бас чадвар шаардсан хэл. Өнөөдөр дэлхийн програм хангамжийн инженерүүдийн 65% нь C болон түүний visual хэлэндээр бичдэг. Америкийн програмистуудын ихэнх хувь .NET ашиглаж байхад манай Зүүн Азийн зарим орон DELPНI ашигладаг. Мөн Орос, Япончуудын ихэнх нь Java,C# visual ашигладаг. Тэгхээр C# хэл хэр түгээмэл гэдэг нь мэдэгдэж байна. 1.1. .NET фреймворкын тойм. Microsoft .NET платформ нь Application хөгжvvлэх шинэ хэлбэрийг тодорхойлж байна. Microsoft-ийн зорилго бол ямар хэл хэрэглэж байгаа нь гол биш, хамгийн гол нь Интернэт болон Windows application-ийг хурдан, хялбар хөгжvvлэх юм. .NET нь системийн vйлчилгээ, ажиллагааны хөдөлгvvр (Runtime engine), ажлын хvрээ (Framework), контрол (багаж)-ыг тvлхvv анхаарч, тэдгээрийг маш өргөн сонголттойгоор хэрэглэх боломжийг Windows ба Интернэт application бvтээхэд олгож байгаа явдал юм. .NET-ийн зарим чанарыг дурдахад:  .NET–ийн аль ч хэлэнд vvсгэсэн классыг бусад программчлалын хэлнvvд удамшуулан ашиглах боломжтой.  .NET нь нийтлэг өгөгдлийн төрлvvдээс бvрддэг. Өөрөөр хэлбэл нийтлэг өгөгдлийн төрлөөс .NET–ийн аль ч хэл хэрэглэж байдаг. 1
  2. 2. VCP413 Лекцийн материал  Common Language Runtime–ийг хэрэглэдэг болсон. Ингэснээр ямар программчлалын хэл, ямар хувилбарыг ашиглаж байгаа нь гол бус болж байгаа юм.  Windows Application ба Web-based Application бvтээх өндөр тvвшний хэрэгсэлvvдээр бvрэн хангагдсан.  .NET–ийн ямар ч программчлалын хэлийг ашигласан эцсийн vр дvн нь ижил байна.  Программчлалын хэлнvvд хоорондоо харилцах боломжоор хангагдсан. Жишээ нь: C# буюу бусад хэл дээр vvсгэсэн application-ийг Visual Basic дээр debug (алдаа шалгах) хийх боломжтой.  .NET Framework-ийн бас нэг чанар нь интернэтийг бvтээмжтэй байхаар өөртөө нэвтрvvлсэн явдал юм. Internet application, сvлжээний энгийн программ хөгжvvлэхэд .NET Framework нь интернэтийг хэрэглэх бvрэн боломж олгоно.  Мөн объектуудыг зарлаж хэрэглэдэг болсон. .NET платформын хамгийн чухал нь Common Language Runtime (CLR)-ийг дууддаг явдал юм. Энэ ажиллагааны хөдөлгvvр (CLR) нь бvх нийтлэг өгөгдлийн төрлvvд, программчлалын хэлнvvдэд хэрэглэгдэх хэлний гол бvтцийг агуулж байдаг. Цаашдаа энэ CLR нь Windows vйлдлийн системийн нэг бvрэлдэхvvн хэсэг нь болон гарах юм. CLR бол хөгжvvлэх ажлын талбар, design-time ба run-time vеийн vйлчилгээнvvдийг агуулсан байдаг. Design-time vйлчилгээ нь Integrated Development Environment (IDE) ба маш нарийн debugger-уудыг агуулсан байдаг. Та бvхэнд .NET –ийн салангад хэсгvvд хэрхэн бие биетэйгээ холбогдгийг харуулая. Зураг 1. .NET Platform .NET платформын ажиллах хамгийн бага vзvvлэлт нь Windows 32-bit–ийн vйлдлийн систем. 2
  3. 3. VCP413 Лекцийн материал Message Queuing services, COM+transactions, Internet Information Server (IIS) ба Windows Management Instrumentation (WMI) зэрэг vйлчилгээний программуудийг vйлдлийн системдээ суулгаснаар бvх хэл тэдгээрийг ашиглах боломжтой болох юм. CLR нь гол классууд ба ADO.NET, ASP.NET–vvдийг агуулж байдаг. ADO.NET нь WinForm ба WebForm–ийн аль алинд хэрэглэгддэг. CLR–лд тохирохоор бичигдсэн программууд нь одоогийн байдлаар Visual Basic, VC++, C# (шинэ хэл), Perl, Python, Eiffel г.м 1.2. Нийтлэг тєрлийн систем (Common Type System) .NET–д өгөгдлийн төрлvvд нь тухайн хэлэндээ тодорхойлогддоггvй харин CLR–н гол хэсэг болон тодорхойлогдоно. Өгөгдлийн төрөл болгон объект байдаг. Common Type System (CTS)-д тулгуурладаг 2 Type байдаг: Value Type (утга ) & Reference Type (мэдээлэл) Энэ 2 нь санах ойд яаж хадгалагддагаараа ялгаатай юм. Value Type нь яг тэр мэдээлэл, утгатай өөртэй нь харицана. Харин Reference Type нь заагчийн адил санах ойн хаана нэгэн газар байгаа объектыг мэдээллэнэ. CTS нь төрөл бvрийн олон Type-г агуулсан бөгөөд эдгээр нь тус бvрдээ утга юмуу reference-р нь янз бvрийн өгөгдлийг тодорхойлоход хэрэглэгдэнэ. Intrinsic буюу Built in өгөгдлийн төрөл нь тус тус value type юм. Учир нь тэд өгөгдлийг хадгална. Зарим төрлvvдийг дурьдвал:  Class төрөл  Structure төрөл  Interface төрөл  Enumeration төрөл  Delegation төрөл Техникийн талаас нь авч vзвэл класс бvхэн нь type юм. Та vvнийг цаашид vзэх болно. Энэ хvснэгт vндсэн төрлийн системийн Intrinsic буюу Built in өгөгдлийн төрлийн талаар мэдээлэл өгнө. Єгєгдлийн Тайлбар Хэл хэрэглэх нь тєрєл Byte 8 bit тэмдэггvй бvхэл тоо Visual Basic – byte; C# - byte; VC++ - Char; Visual Basic – NA; C# - sbyte; VC++ - Signed Sbyte 8 bit бvхэл тоо char; Int16 16 bit бvхэл тоо Visual Basic – Short; C# - short; VC++ - short; Visual Basic – Integer; C# - int; C++ - int эсвэл Int32 32 bit бvэл тоо long Int64 64 bit бvхэл тоо Visual Basic – Long; C# - long; VC++ - int64 Visual Basic – NA; C# - ushort; VC++ - Unint16 16 bit тэмдэггvй бvхэл тоо unsigned short; Visual Basic – NA; C# - uint; VC++ - unsigned Uint32 32 bit тэмдэггvй бvхэл тоо int эсвэл unsignned long; Visual Basic – NA; C# - ulong; VC++ - unsigned Uint64 64 bit тэмдэггvй бvхэл тоо int64; Single 32 bit бутархай тоо Visual Basic – Single; C# - float; VC++ - float; Visual Basic – Double; C# - double; VC++ - Double 64 bit бутархай тоо double; 3
  4. 4. VCP413 Лекцийн материал Boolean True (1) эсвэл False (0) Visual Basic – Boolean; C# - bool; VC++ - bool; класс буюу өгөгдлийн төрөл авч Visual Basic – Object; C# - object; VC++ - Object чадах vндсэн төрөл. Object; Visual Basic – Char; C# - Char; VC++ - Char Unicode тэмдэгт (16 bit) _wchar_t; Visual Basic – String; C# - string; VC++ - String Unicode тэмдэгтvvдийн дараалал String; Visual Basic – Decimal; C# - decimal; VC++ - Decimal 96 bit–ийн аравтийн утга Decimal; NA-хэрэглэдэггүй. Хvснэгт 1: Өгөгдлийн төрөл .Net нь byte, integer г.м. төрөл бvрийн Type-г тодорхойлох бөгөөд бvх ялгаатай хэлvvд эдгээр Type-vvдийг өөртөө хамаарах keyword юмуу identifier ашиглан хэрэглэж болно . Жишээлбэл: System.Byte-.Net-ийн дор орших өгөгдлийн төрөл нь VB.Net болон C #-н али алинд нь ашиглагдана. System.Sbyte нь тэмдэгт байт өгөгдлийн төрлийг VB.Net нь дэмждэггvй бол, C#-д хvчинтэй байдаг. Класс нь доорх хэсгvvдээс бvрддэг: o Property o Fields o Methods o Events Kлассыг тодорхойлохдоо, scoping, instantiation specification-уудыг (хаана харагдах болон, яаж тухайн класс type-тай объектыг vvсгэх, өвлөгдсөн (derived) класс vvсгэж болох эсэх зэргийг тодорхойлж өгөхөд хэрэглэгдэх) хамтад нь тодорхойлдог. 1.3. Compilers, Assemblies болон Microsoft Intermediate Language Vндсэндээ .Net комплярын vр дvнд vvсэх binary (хоѐртын) нь assembly болно. Бинари нь .EXE болон .DLL өргөтгөлтэй файл болж vvсгэгдэнэ. Энэ 2-н аль нь ч бай хамаагvй, бинари нь MSIL Instruction-уудын нийлбэр юм. Ингэхлээр, та .Net дээр application хийхдээ, assembly-гаа бас давхар хийж байгаа гэсэн vг болох нь. Assembly нь MSIL-г дотроо агуулж байдаг юм. Бvх .Net хэлнvvд нь, ямар compiler ашиглаж байгаагаас vл хамааран, адилхан Intermediate Language-д хөрвvvлэгдэнэ. Intermediate Language -д хөрвvvлэгдсний дараа, Common Language Runtime undefined (CLR)-н тусламжтайгаар машины кодод хөрвvvлэгддэг. Intermediate Language нь Java-гийн ByteCode-той төстэй боловч, 1 том ялгаа нь .Net нь зөвхөн Windows дээр ажилладагт оршино. Java-гийн ByteCode нь төрөл бvрийн систэм дээр ажилллах чадвартай. Бас нэг ялгаа нь, Java-н byteCode нь зөвхөн Java хэл дээр бичигдсэн байх ѐстой байдаг бол, .Net нь төрөл бvрийн хэл дээр бичигдэн, хоорондоо хамтран нэгдэж undefined (interoperability) ажиллаж чаддаг юм. vvгээрээ .Net нь давуу юм. Namespaces Framework-н бvхий л vндсэн суурь (base) классууд нь NameSpace дотор байрлана. Энэ нь танд эдгээр классуудад хандаж, vр дvнтэйгээр хэрэглэхэд зориулагдана. Мөн та өөрийн классуудыг vvсгэхдээ өөрийн Namespace-г vvсгэж болно. Ингэснээр та хоорондоо харилцан холбоотой классуудын бvлгийг бий болгоно. Жишээ дурьдвал, та Account гэдэг класстай байжээ. Account класс олон 4
  5. 5. VCP413 Лекцийн материал төрлийн vvрэг гvйцэтгэх шаардлагатай байг. Төлбөрийн Account болон Орлогын Account-ууд байх хэрэгтэй бөгөөд эдгээр нь тус тусдаа өөр өөр vйлдэл гvйцэтгэх шаардлагатай vед, та энэ 2 классаа 2 өөр төрлийн Namespace-д байрлуулж болно. Ингэснээр хоѐулаа адилхан Account нэртэй боловч 2 ондоо класс бий болох юм. .Net framework-ийн vндсэн зарим namespace-vvд нь: o System o System.IO o System.Security o System.Threading o System.Net o System.XML o System.Windows.Forms Тухайлбал, System namespace нь vндсэн системийн классуудыг тодорхойлоход ашиглагдана. .NET Application–ний тєрєл .NET платформыг ашиглан хэд хэдэн өөр төрлийн application хөгжvvлж болно. Yvнд:  Windows Applications  Windows Services  Web Applications  Web Services  Class Libraries  WinForms Custom Controls  WebForms Custom Controls Windows Applications Windows application нь Windows vйлдлийн системд ажиллах хэрэглээний программ vvсгэхэд зориулагдсан. Энэ нь WinForms–ийг ашиглан user interface (UI) vvсгэнэ. Мөн Windows application нь Client/Server өгөгдлийн бааз application, тоотой харьцах контрол, график программуудад маш тохирсон. WinForms Windows Forms–ийг CLR–ийн аль ч хэлэнд vvсгэх боломжтой ба тэдгээр WinForms нь хоорондоо хялбар холбогддог. Мөн WinForms нь маш олон төрлийн vндсэн контрол агуулсан ба хэрэглэгч өөрийн контролыг хялбар vvсгэх боломжтой. Windows Services Windows Service нь программ ба энэ нь Windows NT, Windows 2000 Server–vvд ба дээшхи хувилбарууд дээр ажиллана. Windows Service программууд нь хэрэглэгчтэй харилцахгvйгээр өөрөө vйлчилгээ явуулж байдаг ба vйлдлийн систэм ачаалагдахад хамт ачаалагддаг. .NET дээр та энэ төрлийн application-уудыг амархан vvсгэх боломжтой. Web Applications Web Application нь HTML хуудсуудыг агуулсан байдаг ба вэб сервер дээр ажилладаг, Энэ нь user interface–тэй ба мөн user interface–гvй байж болно. ASP.NET Та бvхэн ASP(Active Server Page)–ийr мэдэх биз ээ. ASP.NET нь тvvний сайжруулсан хувилбар юм. Хэрэв танд өмнөх ASP код байгаа бол тvvнийгээ 5
  6. 6. VCP413 Лекцийн материал ASP.NET–рvv хялбархан хөрвvvлж болно. ASP ба ASP.NET нь нэгэн IIS дээр зохицон ажиллаж чаддаг. ASP.NET сайжруулсан vйлчилгээнvvдээр хангагдсан. Жишээ нь:  Statement–ийн удирдлага сайжирсан.  Web байгуулалтыг илvv сайн хийдэг  ASP–гээс 2-3 дахин хурдан ажилладаг  Хөвvvлэгдсэн код хэрэглэдэг  Нөөцлөлийн техник нь сайжирсан. ASP.NET нь WebForms ба WebServices–ийн аль алинийг нь багтааж байдаг. Web Forms WebForms нь интернэтийн WinForms гэсэн vг юм. Интернэтэд байрлах UI (дэлгцэнд харагдах байдал)-г WebForms–ийн тусламжтайгаар бvтээнэ. Visual Studio IDE дээр HTML кодуудыг ашиглан бvтээсэн HTML контролуудыг WebForms– д хэрэглэдэг. Мөн HTML vvсгэх сервер талын контролуудыг хэрэглэж болно. Сервер талын контролууд нь маш уян хатан, өгөгдлийн баазтай холбогдох чадвартай ба гараар бичиж чадамгvй их HTML кодуудыг vvсгэж байдаг. Энэ сервер талын контролууд нь HTML 3.2 дээр vvсэж, UI-г сонгох боломжтой Internet explorer- ийн өргөтгөлvvдийг агуулж чаддаг. Web Service HTTP байрлалаас дуудагдсан vйлдлvvд нь Web Service–ийн тусламжтайгаар биелэгддэг. ХМL, SOAP нар нь тухайн vйлчилгээнvvдийг vзvvлдэг хэрэгсэлvvд юм. .NET–д XML буюу SOAP–г хэрэглэх эсвэл тvvний талаарх тодорхойлолтийг олж vзэхгvй. Харин байгуулах классуудийг хэрэглэх ба Web Service–ээ байгуулах л хэрэгцээ гарна. Web Service–ийн тусламжтайгаар хийж болох зарим зvйлс:  Кредит картан дээрх зөвшөөрлийг авах  Ачаа барааны төлөвийг авах  Баталгаатай захиалга авах  Хувьцааны коэффициент авах  Бараа каталогийн мэдээ авах ADO.NET .NET Framework-д нэмэгдсэн нэгэн шинэ vйлчилгээ бол өгөгдөлтэй харицах шинэ загвар юм. Энэ загвар нь ADO.NET юм. Өмнөх ADO ба ADO.NET хоѐр нь хоорондоо маш их ялгаатай. Энэ 2-ийн гол ялгаа нь өгөгдлийг баазаас уншсаны дараа санах ойд хэрхэн хадгалдагт байгаа юм. Өмнөх ADO нь recordset–ийг хоѐртын форматаар хадгалдаг байсан бол ADO.NET нь XML-ээр хадгалдаг. Мөн өөр нэг том ялгаа бол ADO.NET нь disconnected юм. Энэ нь ADO.NET нь өгөгдлийг уншсаны дараа connection (холболт)-г хадгалдаггvй гэсэн vг болно. Хэд хэдэн шинэ объектууд нэмэгдсэн. Yvнд: ADOCommand, ADODataSetCommand, ADODataReader ба DataSet орно. Recordset нь бичлэгvvдээ ADODataReader эсвэл DataSet-ээс уншдаг. DataSet нь хэд хэдэн хvснэгтийг нэг объект руу унших боломж олгодог. Ингэснээр санах ойд хvснэгтvvдийг хооронд нь холбох (Relationship), нэмэх, устгах, засварлах боломжтой болох ба өгөгдлийн бааз руу хадгалах боломжтой болно. ADO.NET нь XML–ээс уншиж, бичиж чадна. Мөн OLEDB буюу бусад provider–уудийг хэрэглэдэг. 6
  7. 7. VCP413 Лекцийн материал Лекц №2 Сэдэв: С# хэлний үндсэн ойлголт 1. Comment (тайлбар) Хэрэв XML таг хэрэглэгдэж байгаа бол мєрийн ємнє /// (3 ширхэг) тэмдэгтийг тавихад тэр мєр тайлбар болно. 1. Мєрийн эхэнд // (2 ширхэг) тавихад тэр мєр тэр чигээрээ тайлбар болно. // Энэ мєр кодыг тайлбар гэж vзэн Компляр энэ мєрийг алгасна :) 2. Мєн нэгээс олон мєртэй тайлбар бичих шаардлагатай болбол /* */ тэмдэгтийг хэрэглэнэ. Жишээ нь: 3. /* Тайлбар эндээс эхлээд дараагийн мєрєнд шилжээд энд дууслаа. */ 2. Єгєгдлийн тєрєл Дараах єгєгдлийн тєрлvvд Visual C# хэлэнд байдаг. Єгєгдлийн тєрєл Хэмжээ(byte) Хязгаар Byte 1 0 >> 255 Sbyte 1 -128 >> 127 Bool 1 True, false( vнэн, худал) Short 2 -32768 >> 32767 Ushort 2 0 >> 65535 Char 2 Unicode тэмдэгт İnt 4 -214748364 >> 14748363 Uint 4 0 >> 4294967295 Float 4 Энгийн бутархай Double 8 Давхар бутархай Decimal 8 Аравтын бутархай Long 8 +/- 9223372036854775808 Ulong 8 0 >> 0xffffffffffffffff ( 16f ) 3. Хувьсагч vvсгэх Ямар нэгэн хувьсагч зарлахдаа эхлээд тэр хувьсагч ямар тєрєлтэй байхыг зааж єгнє. Жишээ нь бид нар бvхэл тоон хувьсагч таниулах гэж буй бол дараах хэлбэрээр бичнэ. int btoo; Дээрх мєрєнд бидний таниулсанаар btoo гэдэг нэртэй бvхэл тоо авч болох нэгэн хувьсагчыг зарлаж байна гэсэн vг. Зарлахдаа бид утга єгч болно. 1
  8. 8. VCP413 Лекцийн материал int btoo = 15 ; єєрєєр хэлбэл btoo маань бvхэл тоо авах хувьсагч бєгєєд анхны утга нь 15 гэсэн vг. Нэгээс олон ижил тєрлийн хувьсагч зарлаж болно. int atoo, btoo; atoo, btoo –г зарлаж байгаа ба хоѐулаа адил шинж чанартай хувьсагч. 4. Арифметик vйлдэл болон бvтэцvvд Доорх vйлдэл болон тэгшитгэлvvд C#-д хэрэглэгддэг. 1. = = - тэнцvv тэмдэг. 13. ++ - нэгээр нэмэх 2. ! = - тэнцvv биш Жишээ: 3. > - их x=15; 4. < - бага x++; // одоо x-ийн утга 16 5. >= - их буюу тэнцvv болсон 6. <= - бага буюу тэнцvv 14. -- - нэгээр багасах 7. &&, &, AND - ба (Logic) 15. += - аар нэмэх 8. ||, |, OR - буюу (Logic) 16. -= - ийг хасах 9. + - нэмэх 17. *= - аар vржих 10. - - хасах 18. /= - д хуваах 11. * - vржих 19. % - vлдэгдэл авах. 12. / - хуваах Жишээ: x=15; x+=5; // одоо x-ийн утга 20 болсон гэсэн vг x*=2; // одоо x-ийн утга 40 болсон гэсэн vг x/=10; // одоо x-ийн утга 4 болсон гэсэн vг x==4 ? x++ : x-- ; // Дээрх vйлдэл юу гэсэн vг вэ гэхээр. Хэрэв x маань 4-тэй тэнцvv бол x-ийг нэгээр нэм vгvй бол x-ээс нэгийг хас гэсэн vг юм. 5. Єгєгдлийн тєрлийг єєрчлєх ба шинэчлэх (Casting, conversion) єгєгдлийн тєрлийг єєрчилнє гэдэг маань нэг тєрлєєс єєр нэгэн тєрєл рvv шилжvvлэх гэсэн vг. Жишээ нь нэгэн жинхэнэ энгийн бутархай тоог бутархайнаас салгаж бvхэл тоо руу шилжvvлэх, эсвэл эсрэг vйлдлийг хийх. long atoo = 3.2 , btoo=2.9 ; int ctoo; ctoo = (int) (atoo + btoo); Ингэхэд манай ctoo-ны утга нь 6 болох юм. Уул нь (atoo + ctoo)-ны vр дvн нь 6,1 болох ѐстой. Гэвч (int) гэсэн тэмдэгээр би энэ vр дvнгийн бvхэл хэсгийг нь авч ctoo- нд єгч байна. vvнийг программчлалын хэллэгт “casting” гэдэг. Хэрэв дээрх тохиолдолд (int) гэсэн хэсэг байхгvй байсан бол єгєгдлийн тєрлvvд ялгаатай байна гэсэн алдааны мэдэгдэл єгєх байсан. Та System.Convert namespace-ээс харгалзах хєрвvvлэлтийн функцvvдийг хэрэглээрэй. Жишээ нь: 2
  9. 9. VCP413 Лекцийн материал bool System.Convert.ToBoolean(value ) ; //value-ийн тєрлийг bool тєрєл рvv хєрвvvлнэ char System.Convert.ToChar(value); //value-ийн тєрлийг char тєрєл рvv хєрвvvлнэ string System.Convert.ToString(value [, provider]); //value-ийн тєрлийг string тєрєл рvv хєрвvvлнэ 6. Enumaration бvтээх нь (ємнє таниулсан утгатай хувьсагчид) Enumaration гэдэг маань тоолоход, тэмдэглэхэд хэцvv зvйлvvдийг дараалуулан тус бvрд нь дугаар эсвэл утга єгч тvvнийгээ бидэнд ойлгогдох хэлбэрээр программдаа ашиглаж болох хувьсагчуудыг хэлнэ. Нэгэн хувьсагч таниулахдаа тvvнийхээ зєвхєн авч болох утгуудыг зарласнаар программч єєрийн гэсэн шинэ єгєгдлийн тєрлийг бий болгож байгаа гэсэн vг юм. vvнийг C#-д доорх хэлбэрээр зарлана. Жишээ: enum Mergejil { zahiral, udirdagch, tseverlegch } Дээр таниулсан enumaration жишээнд мэргэжил маань 3-н янзын утгатай болж байна. єєр ямар нэгэн утгыг танихгvй гэсэн vг. Дээрх жишээг ашигласан программын хэсэг (класс) бичье. class EnumClass { static void Main( String[] args ) { Respond(Mergejil.zahiral); } static void Respond(Mergejil mer) { if( mer == Mergejil.zahiral ) { System.Console.WriteLine(“Захирал болох сайхан?”); } else if( mer == Mergejil.udirdagch ) { System.Console.WriteLine(“Захиралын дараах удирдах ажил ?”); } else { System.Console.WriteLine(“Kоридорыг сайн цэвэрлээрэй...!”); } } } Дээрх жишээнд би Mergejiliin авсан утгаас нь харгалзаж дэлгэцэнд янз янзын мэдээ бичиж байна. Жишээ нь: Mergejil тєрєлтэй mer гэсэн хувьсагч маань tseverlegch утгатай бол “Kоридорыг сайн цэвэрлээрэй...!” гэсэн бичгийг vр дvн болгож бичнэ. 7. Удирдах мэдэгдлvvд (statement) Бидний хийж буй vйлдэл маань нэгээс их бол vvнийг бид { } хаалтаар хаах хэрэгтэй. Ингэснээр бид энэ хаалтан доторх бvх vйлдэл нэг vйлдэл мэт авч vзнэ. Жишээ нь: if ( нєхцєл_1 ) vйлдэл_1 else if( нєхцєл_2 ) vйлдэл_2 3
  10. 10. VCP413 Лекцийн материал else { //Блок эхэлж байна vйлдэл_3 vйлдэл_4 vйлдэл_5 //блок дуусаж байна } Дээрх жишээнд хэрэв нєхцєл_1 vнэн байна уу гэж шалгана. Хэрэв vнэн байвал vйлдэл_1 хийгдэн дараагийн нєхцлvvд шалгагдахгvйгээр энэ блок маань дуусна. Хэрэв худал бол нєхцєл_2-ийг шалгах ба энэ биелээгvй vед хаалтанд доторх 3-н vйлдэл бvгд хийгдэн энэ блок маань дуусах болно. Хэрэв нєхцєл маань олон бол “if” хэрэглэх нь жаахан тєвєгтэй болж эхэлнэ. Ийм тохиолдолд ихэнхдээ “switch” ашигладаг. Switch ( x ) { case 1 : y = 1; break; case 2 : y = 10; break; default : y = 100; break; } Дээрх жишээнд x маань хэрэв 1-тэй тэнцvv бол y-гийн утга 1 болох ба 2-той тэнцvv y-гийн утга 10 болно. Аль аль нєхцєл биелээгvй тохиолдолд y-гийн утга 100 болно. Нэг тєрлийн vйлдлийг нэгээс олон удаа хийлгэхийн тулд бид давталтын операторуудыг хэрэглэнэ. Жишээ нь “while”: While( x<100) { System.Console.WriteLine(x); x+=10; } Дээрх жишээнд x маань 100-гаас бага байгаа тохиолдолд x-ийн утга дэлгэцэнд хэвлэгдээд дараа нь 10-р нэмэгдэнэ. Гэх мэтчилэн x нь 100-с их болтол давтагдана Тоолууртай давталтын операторуудн нэг болох “for” давталтыг авч vзье for ( int x=1; x<10; x++) { System.Console.WriteLine(x); } Дээрх жишээнд x-ийн утга 1-ээс эхлэн 10 хvртэл нэг нэгээр нэмэгдэж тэр болгонд хаалтан доторх {} vйлдэл давтагдан ажиллах болно. єєрєєр хэлбэл энэ хэсэг кодын vр дvн нь дэлгэцэнд 1-10 хvртэл тоог хэвлэнэ гэсэн vг. 4
  11. 11. VCP413 Лекцийн материал Лекц №3 Сэдэв: Классын зохиомж 1. ОХП-ийн ухагдахуунууд Method Method нь классын функц, процедур юм. Классын функцийг тодорхойлж өгдөг. Класст объектыг үүсгэдэг; устгадаг үүрэгтэй байгуулагч(constructor), устгагч(destructor) гэсэн 2 method(функц) зайлшгүй байх ѐстой. method-ууд нээлттэй, хаалттай, статик, виртуаль гэх мэт байж болно. Талбар Талбар нь тухайн класстай холбоотой хувсагч юм. Нээлттэй, хаалттай, статик, зөвхөн унших гэх мэт байж болно. С# хэлний синтакс (бичлэг) -тай танилцсаны дараа тааралдах болно. Шинж чанар Шинж чанар нь талбарын боломжийг өргөтгөдөг. Шинж чанарын тусламжтайгаар хаалттай талбараас унших, бичих гэх мэтээр хандаж хэрэглэгчийн гэнэтийн болон санаатай халдлага ас хамгаалдаг. С# классын төрөл Класс бол объектуудын ерөнхий шинж чанаруудыг агуулсан функц, хувьсагчдын цогц юм. Жишээ нь» : ажилчны нэр, ID, цалин зэрэг мэдээллийг, мөн цалинг тодорхой хэмжээгээр өсгөдөг GiveBonus(), мэдээлэл хэвлэж харуулдаг DisplayStats() функцуудыг агуулсан Emploуее класс тодорхойлъѐ. Зураг 1 Етрloyee C#-ийн класс хэрэлэгчийн тодорхойлсон хэд хэдэн байгуулагчтай байж болох ба класс бүр утга авдггүй анхдагч байгуулагчтай байдаг. using System; namespace Employees { public class Employee 1
  12. 12. VCP413 Лекцийн материал { private string fullName; private int empID; private float currPay; // áàéãóóëàã÷èä public Employee(){ } public Employee(string fullName, int empID, float currPay) { this.fullName = fullName; this.empID = empID; this.currPay = currPay; } public void GiveBonus(float amount) { currPay += amount; } public void DisplayStats() { Console.WriteLine(“Name: {0} “, fullName); Console.WriteLine(“Pay: {0} “, currPay); Console.WriteLine(“ID: {0} “, empID); } //Employee êëàññûí àíõäàã÷ áàéãóóëàã÷ õîîñîí áàéíà: /*public class Employee { //... public Employee(){ } //... }*/ // Õýðýâ òà êëàññ äîòîð õýðýãëýã÷èéí áàéãóóëàã÷èéã // òîäîðõîéëñîí ë áîë àíõäàã÷ áàéãóóëàã÷ óñòäàã. //Çà îäîî êëàññûí æèøýý ¿¿ñãýå: static void Main(string[] args) { // àíõäàã÷ áàéãóóëàã÷èéã äóóäíà Employee e = new Employee(); } } } Дараахь Main() функц хэрэглэгчийн тодорхойлсон 3 байгуулагч ашиглан хэд хэдэн Emplоуее объект үүсгэж байна: static void Main(string[] args) { Employee e = new Employee(“Joe”, 80, 30000); Employee e2; e2 = new Employee(“Beth”, 81, 50000); Console.ReadLine(); } 2
  13. 13. VCP413 Лекцийн материал Далд төрөлтэй дотоод хувьсагч (Implicitly Typed Local Variables) C# 2008-нд гарсан нэг шинэ зүйл далд төрөлтэй дотоод хувьсагч зарлах боломжтой болсын байна. Энэ скрипт (script)хэлүүдэд ихэвчлэн ашиглагддаг хувьсагч хэрэглэлтйин техникыг авч хэрэгжүүлсэн байна. Энэ хүснэгт-1 болон хүснэгт- 2дээрх жишээн дээр тулгуурлан тайлбарлъя. static void DeclareExplicitVars() { //Энгийн хувьсагчдын зарлалт; int myInt = 0; bool myBool = true; string myString = "Time, marches on..."; } Хүснэгт- 1. Энгийн төрөл зарлалттай функц Хүснэгт-1 функцад бидний мэдэх int, bool, string түлхүүр үгүүдийг ашиглаж хувьсагчийн зарлалтаа хийсэн байна. static void DeclareImplicitVars() { // Далд хувьсагчын зарлалт // var variableName = initialValue; var myInt = 0; var myBool = true; var myString = "Time, marches on..."; // Print out the underlying type. Console.WriteLine("myInt is a: {0}", myInt.GetType().Name); Console.WriteLine("myBool is a: {0}", myBool.GetType().Name); Console.WriteLine("myString is a: {0}", myString.GetType().Name); } Хүснэгт- 2. Далд төрлийг ашигласан функц Харин хүснэгт-2д var гэсэн шинэ түлхүүр үг гарч ирсэн байна. Энэ тохиолдолд компайлар автоматаар myInt, myBool, myString-д харгалзан System.Int32, System.Boolean, System.String санах ойн хувиарлалт хийдэг. Одоо массив, ерөнхий төрөл мөн хэрэглэгчийн тодорхойлсон төрөл дээр хэрхэн ашиглахыг хүснэгт-3д харууллаа. static void DeclareImplicitVars() { ... // Зарим далд өгөгдлын төрөлтэй дотоод хувьсагч var evenNumbers = new int[] { 2, 4, 6, 8 }; var myMinivans = new List(); var myCar = new SportsCar(); 3
  14. 14. VCP413 Лекцийн материал Console.WriteLine("evenNumbers is a: {0}", evenNumbers.GetType().Name); Console.WriteLine("myMinivans is a: {0}", myMinivans.GetType().Name); Console.WriteLine("myCar is a: {0}", myCar.GetType().Name); } Хүснэгт- 3. Далд хувьсагчийг бусад өгөгдлийн төрөлд ашиглах нь Уг жишээнд Системийн жагсаалт, массив өгөгдлийн төрөл болон хэрэглэгчийн тодорхойлж өгсөн SportsCar төрлийн зарлалт, болон утга оноолтыг харуулсан байна. Зураг-3 DeclareImplicitVars() функцыг ажиллуусан үр дүнг харууллаа. Зураг-3 DeclareImplicitVars() гаралтын үр дүн Foreach дэх var төрөлтэй хувьсагч Далд төрөл нь int массиван var төрлийн хувьсагчид дараалсан давталтанд хэрхэн хандахыг хүснэгт-4д харуулав. static void VarInForeachLoop() { var evenNumbers = new int[] { 2, 4, 6, 8 }; // “var” foreach давталданд ашиглах нь . foreach (var item in evenNumbers) { Console.WriteLine("Item value: {0}", item); } } Хүснэгт- 4. “var” foreach давталтанд ашиглах нь Мөн давталт дотроо хүснэгтийн төрлийг хатуугаар зааж өгч гүйх боломжтой хүснэгт-4 ийн кодыг ийм байдалд өөрчилснөөр харуулбал(Хүснэгт-5). static void VarInForeachLoop() { var evenNumbers = new int[] { 2, 4, 6, 8 }; // System.Int32 төрлийг хатуугаар заасан байна. foreach (int item in evenNumbers) { 4
  15. 15. VCP413 Лекцийн материал Console.WriteLine("Item value: {0}", item); } } Хүснэгт- 5. foreach давталтанд төрөл хатуугаар заах Далд төрөлтэй хувьсагч дахь хязгаарлагдмал байдал Бид уг хувьсагчийг method болон propterty-д зөвхөн дотоод хувьсагчын хүрээнд л ашиглаж болно. Мөн var түлхүүр үгийг функцийн буцаах утга, параметр, field – үүдэд хэрэглэвэл алдаатай(Хүснэгт-6). class ThisWillNeverCompile { //field өгөгдөлд ашигласан, алдаа! private var myInt = 10; // буцаах утга болон параметерт хэрэглэсэн, алдаа! public var MyMethod(var x, var y){} } Хүснэгт- 6. Алдаатай код Бусад хориглолт болон байж болох хувилбаруудыг хүснэгт-7д жишээгээр харууллаа. //Утга олгоогүй, алдаа! var myData; //Зарлалтын үед утга олгоогүй, алдаа! var myInt; myInt = 0; //Null утга олгосон, алдаа! var myObj = null; //Утга олголгдсоны дараа заалт төрөлтэй болох учир энд ямар нэгэн алдаа үүсэхгүй var myCar = new SportsCar(); myCar = null; // Зөв! var myInt = 0; var anotherInt = myInt; string myString = "Wake up!"; var myData = myString; //буцаах утгын төрөл нь int бөгөөд далд төрөл нь таарч байна, зөв! static int GetAnInt() { var retVal = 9; return retVal; } Хүснэгт- 7. Зарим алдаатай болон зөв бичлэг 5
  16. 16. VCP413 Лекцийн материал Далд төрөлтэй дотоод массив Хүснэгт-8 жишээгээр далд төрөлтэй массиван хувьсагчийн хэрхэн заралхыг харууллаа. static void DeclareImplicitArrays() { // int[]. var a = new[] { 1, 10, 100, 1000 }; Console.WriteLine("a is a: {0}", a.ToString()); // double[]. var b = new[] { 1, 1.5, 2, 2.5 }; Console.WriteLine("b is a: {0}", b.ToString()); // string[]. var c = new[] { "hello", null, "world" }; Console.WriteLine("c is a: {0}", c.ToString()); // SportsCar[]. var myCars = new[] { new SportsCar(), new SportsCar() }; Console.WriteLine("myCars is a: {0}", myCars.ToString()); Console.WriteLine(); //System.Object төрлийн массивыг үүсгэх боломжгүй. Хувьсагчийн төрөл холилдно, алдаа! //Компайларын алдаа гарна var d = new[] { 1, "one", 2, "two", false }; } Хүснэгт- 8. Далд төрөлтэй массив Далд төрөлтэй хувьсагчыг LINQ технолгид ашигладаг учир нь query илэрхийлэлийг буцаах утга нь тодорхойгүй байдаг бөгөөд үүнийг далд төрөлтэй хувьсагч ашиглан барьж авдаг. 6
  17. 17. VCP413 Лекцийн материал Лекц №4 Сэдэв: Классын зохиомж 4.1. Áàéãóóëàã÷ ôункц дахин тодорхойлох Класст ижил нэртэй ч дамжих параметрийн тоогоороо ялгаатай функцуудыг дахин дорхойлогдсон функц гэдэг. Emplоуее класст параметрийн тоогоороо ялгаатай kлассын байгуулагчийг дахин тодорхойллоо: //дахин тодорхойлсон байгуулагчид public Employee() { } public Employee(string fullname, int empID, float currPay) {...} Зөвхөн байгуулагчийг ч биш функцийг ч бас дахин тодорхойлж болно. Жишээ нь: Trangle класст оролтын параметрүүдээрээ ялгагдах Draw/() функцуудыг дахин тодорхойлбол: public class Triangle { public void Draw(int x, int y, int height, int width) {...} public void Draw(float x, float y, float height, float width) {...} public void Draw(Point upperLeft, Point bottomRight) {...} public void Draw(Rect r) {...} } Хэрэв дээрх 4 байгуулагч тодорхойлоогүй байсан бол 4 өөр функц бичих хэрэгтэй бaйх байлаа: public class Triangle { public void DrawWithInts(int x,int y,int height,int width) {...} public void DrawWIthFloats(float x,float y,float height,float width){..} public void DrawWithPoints(Point upperLeft,Point bottomRight){..} public void DrawWithRect(Rect r) {...} } Функц дахин тодорхойлоход буцаах утга нэг л төрөлтэй байх ѐстой. 4.2. This –ийн хэрэглээ this түлхүүр үг нь тухайн объектын гишүүд болон талбар(field))-ыг төлөөлж байдаг. Xэрэглэх гол шалтгаан нь гадаад ижил нэртэй параметрүүдээс дотоод хувьсагчийг ялгах байдаг. public Employee(string fullName, int empID, float currPay) { this.fullName = fullName; this.empID = empID; this.currPay = currPay; } Энэ тохиолдолд тухайн классын гишүүд функцээр орж ирэх параметрүүдтэй ижил нэртэй байна. Харин доорх тохиолдолд тэдгээр нь ялгаатай тул thi түлхүүр үгийг хэрэглэхгүй байж болдог. public Employee(string name, int id, float pay) 1
  18. 18. VCP413 Лекцийн материал { fullName = name; // this.fullName = name; empID = id; // this.empID = id; currPay = pay; // this.currPay = pay; } Доорх жишээгээр this түлхүүр үгийг байгуулагчтай хамт хэрэглэж үзүүлэв: public class Employee { ... public Employee(string fullName, int empID, float currPay) { this.fullName = fullName; this.empID = empID; this.currPay = currPay; } public Employee(string fullName):this(fullName, IDGenerator.GetNewEmpID(), 0.0F) {...} 4.3. Классын public интерфейс Объект руу "." оператороор дамжуулан хандах боломжтой гишүүн рublic хандалттай байх ѐстой. Бидний авч үзэж байгаа Emploуее класст GiveBonus(), DisplayStats() гэсэн 2 рublic функц тодорхойлогдож байна: namespace Employees { public class Employee { private string fullName; private int empID; private float currPay; // áàéãóóëàã÷èä public Employee(){ } public Employee(string fullName, int empID, float currPay) { this.fullName = fullName; this.empID = empID; this.currPay = currPay; } public void GiveBonus(float amount){ currPay += amount; } public void DisplayStats() { Console.WriteLine(“Name: {0} “, fullName); Console.WriteLine(“Pay: {0} “, currPay); Console.WriteLine(“ID: {0} “, empID); } static void Main(string[] args) 2
  19. 19. VCP413 Лекцийн материал { Console.WriteLine(“*The Employee Type at Work*n”); Employee e = new Employee(“Joe”, 80, 30000); e.GiveBonus(200); e.DisplayStats(); Employee e2; e2 = new Employee(“Beth”, 81, 50000); e2.GiveBonus(1000); e2.DisplayStats(); Console.ReadLine(); } } } Үр дүн: Зураг 2. Employee класс ажиллаж байгаа ньв Дээрх жишээнд public интерфэйстэй хамгийн энгийн класс харуулав. 4.4. Өгөгдлийн далдлалт (Encapsulation) ОХП-ын суурь ойлголтын нэг бол өгөгдлийн далдлалт юм. ОХП-ын бүх хэлэнд суурь 3 ойлголт хэрэглэгддэг:  Өгfгдлийн далдлалт.  Удамшил  Полиморфизм Объектын хэсгүүдийг гадаад хэрэглэгчээс нуух програмчлалын ойлголт юм. Програмын бусад кодоос зарим кодыг нууж өгдөг. Програм бичих үед програмист аль хэсгийг хэрэглэгчдэд харагдахаар, аль хэсгийг "дотоод хэрэглээ"-нд зориулахыг шиидэх ѐстой. Классын хэрэглэгчдэд харагдахгүй хэсгийг класст өгөгдлийн далдлалт хийгдсэн байна гэж хэлдэг. Классыг бичихэд классын аль болох олон хэсгийг нуух хэрэгтэй байдгийн учир нь:  Хэрэглэгч классын дотоод кодоос хамааралгүй болж, классын ажиллагаанд хутгалдах нь багасна. Хаалттай өгөгдлүүдэд класс дотроосоо л харьцах 3
  20. 20. VCP413 Лекцийн материал болно. Хэрэв хэрэглэгчийн код классын бүтцээс хамаардаг бол классын өөрчлөлт хэрэглэгчээс хамааралтай кодын ажиллагааг эвдэж болно.  Классын нээлттэй хэсэг дэх өөрчлөлт хийхэд өмнөх хэсгүүдийг зайлшгүй анхаарах хэрэгтэй. Хэрэглэгчдэд нээлттэй хэсэг их байх тусам хэрэглэгчийн кодыг өөрчлөлгүйгээр тухайн классын кодыг өөрчлөхөд хүндрэлтэй болҗ ирнэ.  Класст нээлттэй хэсэг их байх тусам олон хэсгийг хянах шаардлагатай болдог учраас програмыг хүндрүүлдэг. Жишээ нь: private string fullname; public Employee() { } 4.5. Удамшил (Inheritance) Удамшил бол ОХП-ын суурь ойлголтуудын нэг юм. Шинэ классыг эхнээс нь зохиохын оронд өмнө бичигдсэн классыг ашиглан дээр нь хэрэгтэй нэмэлтүүдийг хийнэ. Тодорхойлогдсон байгаа класс дээр үндэслээд шинэ класс үүсгэх боломжийг олгодог. Хуучин класс нь "эцэг класс", түүний үр дүнд үүссэн шинэ классыг "удамшсан" буюу "хүү класс" гэж нэрлэдэг. Удамших байдлаас хамаарч: * Энгийн удамшил * Нийлмэл удамшил гэж байдаг Онолын хувьд удамшил нь гол ойлголт тул практикт өргөн хэрэглэгддэг ч:  Бодит зүйлүүдийн харьцааг ашигладаг. Жишээ нь: "амьтан", "муур" классууд байвал муур нь амьтан учираас "муур" класс "амьтан" классаас удамшиж болно. Эцэг класс нь илүү ерөнхий шинж чанартай байх ѐстой, харин хүү класс нь өргөтгөсөн, нарийн шинж чанарыг агуулах ѐстой. Тэгвэл "муур” классын хувьд "тэжээгдэх" гэсэн шинж нэмэгдэж болох байна. Гэвч энэ нь оновчтой шийдэл биш ба иймэрхүү жишээ тэр бүр элбэг биш.  Эцэг класс нь удамшлыг тооцож үзсэний үндсэн дээр бичигдэх ѐстой. Энэ нь хэд хэдэн учир шалтгаантай. Хэрэв объект нь тохиромжгүй бүтэцтэй бол ажиллагаа муу байх нь ойлгомжтой. Мөн эцэг класс нь хүү классуудын бүх ерөнхий шинжийг агуулдаг учраас классуудын өөрчлөлтийг харж үзэх хэрэгтэй болдог. Үгүй бол, эцэг класс ямар нэг байдлаар өөрчлөгдөвөл удамшсан классууд "эвдэрч" болзошгүй. Програмын бүтцийг сайжруулах, ажиллагааг хурдасгах үед л удамшлыг хэрэглэх хэрэгтэй. .NЕТ-ийн орчинд бүх объектууд классаас удамшдаг ба зөвхөн нэг классаас л удамшихыг зөвшөөрнө. Ингэж хязгаарласнаар зарим нэгэн асуудал гардаг ч програмыг энгийн болгож өгдөг. Гэхдээ .NЕТ-ийн орчинд интерфейс ашиглаж олон удамшиж болно. Энэ зурагт 6 өнцөгт дүрс геометрийн хэлбэр болохынхоо хувьд Shaре классаас, Shаре класс нь С#-ын объектоос удамшиж байгааг харуулав. Зураг 4в Удамшил Жишээ: 4
  21. 21. VCP413 Лекцийн материал class A{ //ñóóðü êëàññ}; class B : public A{ //public óäàìøèë} class C : protected A{ //protected óäàìøèë} class Z : private A{ //private óäàìøèë} Машин класс нь Радио классыг агуулж "А Б-ийг агуулна" гэсэн харьцаагаар удамшиж байна. public class Radio { public void Power(bool turnOn) { Console.WriteLine(“Radio on: {0}”, turnOn);} } public class Car { // Машин радиог “агуулна” private Radio myRadio = new Radio(); public void TurnOnRadio(bool onOff) { myRadio.Power(onOff); } } 5
  22. 22. VCP413 Лекцийн материал Лекц №5 Сэдэв: C# объекттой ажиллах Объект үүсгэх Объект бол ямар нэгэн биет юм буюу түүний хийсвэрлэл юм. Өөрөөр хэлбэл харилцан холбоотой өгөгдлүүд болон тэдгээрийг боловсруулах хэрэгсэл юм. Зарим объектууд нь амьд ертөнц (жишээлбэл, "ажилчин"), зарим нь амьд буе биет (жишээлбэл, "дэлгэцийн цонх"), эсвэл хийсвэр ойлголтууд (жишээлбэл, "данс") байж болно. Объект нь шинж чанар бүхий өгегдлүүд, тэдгээр дээр гүйцэтгэгдэх үйлдлүүдээс тоггоно. Жишээ нь: "ажилчин" объектод ажилчин хүнийг илтгэх шинж чанарууд болох овог, нэр, хаяг, албан тушаал, цалин зэрэг байна. Гүйцэтгэгдэх үйлдлүүд нь цалингийн тодорхойлолт гаргах, ажилчныг шинэ албан тушаалд томилох зэрэг орж болно. Объект хандалттай програм зохиохын өмнө түүнд ашиглагдах объектуудыг тодорхойлох шаардлагатай. Бодит амьдрал дээр объектууд хялбархан мэт боловч програмчлалын ертөнцөд шууд, ил биш зүйл бишгүй тохиолддог шүү дээ! Жишээ нь: компьютерийг объект гэж үзэж болох ба дэлгэц, процессор, гар зэрэг нь туе тусдаа бас объект болно. Тусдаа хэсгүүд ч мән объектуудаас тоггоно гэх мэтээр хичнээн тооны объектууд програмд тусгах тоо хэмжээний асуудлыг шийдэх хэрэгтэй болдог нь нэг талаар програмчлах урлагийн асуудал ч байж мэднэ. Тиим болохоор сайн төсөл гаргадаг хүн эрэлт ихтэй байдаг. System.Object класс .NEТ-д өргән хэрэглэгддэг виртуаль функц, функц дахин тодорхойлох(override)--Д хэрэглэгддэг тул System.Object-ийг сайн судалж ойлгох хэрэггэй. .NEТ-д төрөл бүрийн System.Object суурь классаас удамшдаг. Хэрэвта классыг ямар нэг классаас удамшихгүй гээд шууд үүсгэсэн байлаа ч цаанаа System.Object(-оос удамшиж байдаг. Жишээ: System.Object:-оос удамшиж байгаа Class HelloClass Хэрэв програмист та өертөө илүү ойлгомжтой байлгая гэвэл дараахь байдлаар бичиж болно. Чанарын ялгаа байхгүй. class Shapelnfo : System.Object (...) class Shapelnfo : object Одоо Main() функц дотроо Реrson-ыг хэрэглэе: static void Main(string [] args) Console.WriteLine( Person fred = new Console.WriteLine( Console.WriteLine( Console.WriteLine( Type); Person p2 = fred; object o = p2; if (o.Equals(fred) Console.WriteLine( "***** Working with Object *****n"); Person("Fred", "Clark", "111-11-1111'20); fred.ToString: {0}", fred.ToString()); 1
  23. 23. VCP413 Лекцийн материал fred.GetHashCode:{0}",fred.GetHashCode() ); fred's base class : {0} ", fred.GetType () .Base S& p2 .Equals (o) ). fred,p2&o are referencing the same object!"' Console.ReadLine(); } 2. Ехсерtiоn Exception-ыг кодонд ямар нэгэн алдаа, доголдол гарах вий гэсэн үүднээс сэрэмжилж хийж өгдөг. Мән програмд доголдол гарсны дараа, эсвэл доголдол гартал ажиллуулахад зориулж кодыг нэг дор цуглуулж өгдөг. С# хэлэнд Exception нь класс байдлаар тодорхойлогдоно. Бух стандарт ехсерйоп класс нь ЕхсерИо" стандарт классаас удамших ба классын нэрэнд Exception уг агуулагдсан байдаг. Жишээ нь: SystemException - системийн Exception-ы суурь класс, АррlicationException - аррllication програмаар үүсдэг ехсерtion-ы суурь класс гм. Хэрэглэгч Exception бичихэд нэрэндээ Exception үг заавал оруулах шаардлагатай биш. Ерөнхийдөө нэг функцэд хоѐр блок л ордог, жишээ нь, try+finally эсвэл tгу+саtch байж болно. trу бЛОК try блокт exception агуулагдаж болох ба үүний дараа ажиллах боломж олгох, мән ге-source чөлөөлөх боломж олгодог. Finally блокт л resource чөлөөлөх код бичигдэнэ. Aжиллах чадварыг сэргээх кодыг нэг эсвэл хэд хэдэн catch блокт бичнэ. exception бүрт нэг нэг. catch блок бичиж егөх ѐстой. try блок дор хаяж нэг catch эсвэл finally- тай холбогдох ѐстой. catch блок catch блок дотор exception-ы үед ажиллах код байна. try блокт хэд хэдэн catch блок байж болно, эсвэл огт байхгүй ч байж болно. Хэрэв try блокоос exception дуудагдахгүй бол catch блокт хэзээ ч холбогдохгүй, finally блокт очиж доторх кодыг ажиллуулаад түүний ард байгаа кодонд шилждэг. catch үгийн ард хаалтанд байгааг exception-ы шүүлтүүр (filter) гэж нэрлэдэг. Exception-ы шүүлтүүрт System.Exception болон түүний хүу төрлүүд байх ѐстой. Хэрэв try блокоос exception хийгдэх шаардлага гарвал CLR шүүлтүүртэй catch блокийг хайж эхэлнэ. Доорх жишээгээр catch блокийн хэрэглээг харуулав: 'class Classl [STAThread] static void Main (string [] args) { int huvaagdagch = 0, huvaagch = 0, hariu = 0; try { hariu = huvaagdagch / huvaagch; } 2
  24. 24. VCP413 Лекцийн материал catch (System. DivideByZeroException ex) { Console. WriteLine ("{0} exception ajillav", ex) ; } Console . ReadLine ( ) ; finally блок Ýíä ихэвчлэн try блокийн үйлдлийн үр дүнд хийгдэх санах ой чөлөөлөх үйлдэл бичигдэнэ. Тухайлбал, хэрэв try блокт файл нээсэн бол finally-д энә файлын эзэлсэн санах ойг чөлөөлөх код бичигдэх ѐстой: ReadData (String pathname) FileStream fs = null; try fs = new FileStreairUpathname, FileMocle . Open) ; // файлын өгөгдөлтэй ажиллах Catch (OverflowException) { // энә catch блокт OverflowException (болон удамшсан // бусад терәл) төрлийн exception-ы // дараа ажиллах чадвар сэргээх код бичигдэнэ } finally { // файлаа заавал хаах if ( fs != null) fs. Close (); Хэрэв try блокоос exception дуудагдахгүй байсан ч файл хаагдаж л таарна. finally блокоос exception-ы код ажиллахад exception очсон эсэхээс үл хамааран файл хаагдах болно. Хэрэв finally-д файл хаах операторыг бичиж өгехгүй бол, exception ажиллах үед оператор биелэгдэхгүйд хүрч файл нээлттэй үлдэж алдаа гарна. try блоктой catch блок холбоотой байх албагүй ч хэрэв finally блок байгаа бол catch-ын дараа байрлах ѐстой. try блоктой нэгээс илүүгүй finally блок холбогдож болно. 3. Хэрэглэгчийн нэрийн муж тодорхойлох (namespace) Програм бичих явцад хэсэг бүлэг төрел, кодоо бүлэглэх нь бүтэц, агуулгын хувьд тустай байдаг. С#-т үүнийг namespace түлхүүр үгийг ашиглана. Квадрат, Тойрог, 6 өнцөгт гэсэн геометрийн классуудыг хөгжүүлэх ѐстой гэвэл тэдний ижил төстәй талуудыг нэгэн мужид оруулж бүлэглэж болох юм. Энд 2 үндсэн чиглэл байна. shapes-lib.cs гэсэн нэгфайлддоорх байдлаар класс бүрийгтодорхойлж болно: // shapes-lib.cs using System; namespace MyShapes // Circle class. class Circle{ /* Үйлдлүүд... */ } // Hexagon class. class Hexagon{ /* Үйлдлүүд... */ } // Square class. class Square{ /* Үйлдлүүд... */ } 3
  25. 25. VCP413 Лекцийн материал Лекц №6 Сэдэв: C# объекттой ажиллах 1. Öóãëóóëãà èнтерфейсòýé àæèëëàõ Интерфейсбол хийсвэр гишүүн болон функцуудыгтодорхойлсон програмын загвар гэж ойлгож болно. Өөрөөр хэлбэр их бие нь код байхгүйгээр зарласан класс юм. Ингэж кодгүй зарлахын ач холбогдол нь ñистемийн гол удирдагч нь кодоо өөрөө бичилгуй, ерөнхий загварыг нь гаргаад, доод програмистууд гаргасан тэр загварын дагуу код бичдэг. Хэрвээ системээ хөгжүүлэгч íü ãàíö бол интерфейсийг хэрэглэх шаардлага бараг гарахгүй. Интерфейсийг Interface түлхүүр үгээр зарлах ба public буc гишүүдтэй суурь классууд, System.Object-ийг хэзээ ч тусгах ѐсгүй. Интерфейсийн бүх гишүүд рublic байдаг. Интерфейс нь классаас удамшдаггүй. Харин олон интерфейсээс удамшиж болно. Интерфейсийн нэр болон доторх гишүүдийн нэрийн өмнө том I үсэг авдаг ч заавал ингэж тэмдэглэх албагүй. I үсгээр тэмдэглэх нь програмд ойлгомжтой байдлыг харуулдаг. Хэрэглэгч интерфейс зарласан жишээ: public interface IPointy { // public áºãººä õèéñâýð, çºâõºí óíøèãäàõààð òîäîðõîéëæ áàéíà byte Points{get;} } Суурь классыг интерфейс болгох гэж байгаа бол классын нэрийн өмнө I үсэг залгаж байна. 1Pointy интерфейс ганц функцтэй байна. .NET-ийн интерфейсийн дотор хэдэн ч ширхэг рroperties байж болно. Класс эсвэл бүтэц төрлийн интерфейсийг тодорхойлж болохгүй: static void Main(string[] args) { IPointy p = new IPointy(); // Àëäàà! } эсвэл бүтэц интерфейс төрөл авъя гэвэл төрел тодорхойлох хэсэгт босоо 2 öýã(:) тавьдаг. Хоѐр цэгийн дараа суурь классыг бичнэ. Хэрэв класс System.Object-îîñ øóóä удамших бол удамшиж байна гэж зааж өгөх хэрэггүй, С# өөрөө ойлгодог. Æèøээ нь: // ýíý êëàññ System.Object êëàññààñ óäàìøèæ Interface òîäîðõîéëæ áàéíà. public class SomeClass : ISomeInterface {...} //Дээрхтэй ижил public class MyClass : object, ISomeInterface {...} public class AnotherClass : MyBaseClass, ISomeInterface {...} public struct SomeStruct : ISomeInterface, IPointy {...} 1
  26. 26. VCP413 Лекцийн материал 2. System.Collections нэрийн мужийн интерфейс System.Collections нэрийн муж нь дотроо төрөл бүрийн вгөгдлийн цуглуулгатаé ажиллах классуудыг агуулдаг. Энгийн Array класс дээр эрэмбэлэх, цэвэрлэх дугаарлах зэрэг олон үйлдлийг хийж болох ч элемент нэмэх, хасахад хэмжээ; динамикаар өөрчилж болдоггүй. Хэрэв та тодорхойлсон төрлөө уян хатан байлга? гэвэл System.Collections дотор төрлөө тодорхойлж болно. Хүснэгт 5.3 System. Collections нэрийн муж нилээн хэдэн интерфейс òодорхойлдог System.Collections-btH Тайлбар интерфейс IColtection „Cdtectipn терлийн ерэнхий шинжүудийг тодорхойлдог lEcjuaiityComparer Объектуудыг ижил эсэхийг харьцуулахад ашиглагдах фүнкцыг агуулна"" ...... IDictionary Нэр/утгын хосыг хэрэглэж объект дотоцх а|ү- /лгыг_хар.ахыг зөвшөөрнө IDictionaryEnumerator IDictionary хэрэглэсэн тәрлийн доторх агуулгыг эрэмбэлнэ lEnumerable fa each давталтаар хангаж егнө IEnumerator Joreach давталтаар хангаж өгнө IHashCodeProvider Наsh кодыг IKeyComparer Еpөнхийд нь IComparer. IHashCodeProvider-ыг нэгтгэнэ IList иоъектын жагсаалтанд нэмэх. хасах. индекс олгоно. Мән тухàéí collection-ы төрөл read-only байна vy. Хэмжээ тодорхойлогдсон байна уу ãýäãéèã òîîëдог Эдгээр интерфейсийн олонх нь интерфейсийн шатчиллаар холбоотой Çóðàã. System. Collections хоорондын холбоос Дооð System.Collections-ын зарим интерфейсийг сонирхъѐ. ICollection |Collection интерфейс бол System.Collections нэрийн мужийн хамгийн энгийн èíòåðôейс юм. System.Collections нэрийн мужын бух классууд энә интерфейсээс удамшсан байдаг. Дотроо хэдэн тооны гишүүн агуулсныг, System. Array төрел рүү хуулагдах боломжтой эсэхийгтодорхойлох хэдэн properties агуулсан байдаг: public interface ICollection : lEnumerable 2
  27. 27. VCP413 Лекцийн материал { // lEnumerable гишүүн. . . int Count { get; } // Элементийн тоог буцаана // thread-safe эсэхийг тодорхойлно bool IsSynchronized { get; }// Олон thread рүү зэрэг хандах хандалтыг эохицуулна object SyncRoot { get; } // Массив болгон хуваана. void CopyTo (Array array, int index); 3. IDictionary Dictionary бол энгийндээ нэр/утгын хосыг засаж өөрчилдөг collection. Жишээ нь, ID болон оноосон нэр өөрчлөгдех Car терлийг агуулсан IDictionary-ыг хэрэглэдэг хэрэглэгчийн төрел тодорхойллоо гэвэл IDictionary интерфейс Add(), RemoveQ, Contains() функцуудээр Keys, Values-ыг тодорхойлж болно: public interface IDictionary : ICollection, lEnumerable { bool IsFixedSize { get; } // Тогтмол хэмжээтэй эсэхийг заана bool IsReadOnly { get; } //Элементүүдийг зөвхөн уншина засаж болохгүй object this [ object key ] { get; set; } ICollection Keys { get; } //Түлхүүрийг авна ICollection Values { get; }//Утгыг авна void Addfobject key, object value); //Түлхүүр, ут-га нэмнэ void Clear (); //Бүх элементийг устгах bool Contains (object key); //Өгөгдсөн элемент байгаа эсэхийг шалгана IDictionaryEnumerator GetEnumerator ( ) ; // fosearch хийхэд IDictionaryEnumerator төрлийн объектыг гаргана. void Remove (object key) ; // Тухайн түлхүүрээр элемент хасах } 4. IDictionaryEnumerator IDictionary. GetEnumeratorQ нь IDictionaryEnumerator төрлийн объектыг буцаана. ID-ictionaryEnumerator бол ерөнхийдөө IEnumerator-ын өргөтгөсвн дугаарлагч болно: public interface IDictionaryEnumerator : lEnumerator { // lEnumerator функц. . . DictionaryEntry Entry { get; } // Entry объектоор дамжуулан түлхүүр, утга авна object Key { get; } // Түлхүүрийг авна object Value { get; }// Утгыг авна } удамшсан байдаг. Дотроо хэдэн тооны гишүүн агуулсныг, System. Array төрел рүү хуулагдах боломжтой эсэхийгтодорхойлох хэдэн properties агуулсан байдаг: public interface ICollection : lEnumerable f // lEnumerable гишүүн. . . int Count { get; } // Элементийн тоог буцаана 3
  28. 28. VCP413 Лекцийн материал // thread-safe эсэхийг тодорхойлно bool IsSynchronized { get; } // Олон thread рүү зэрэг хандах хандалтыг эохицуулна object SyncRoot { get; } // Массив болгон хуваана. void CopyTo (Array array, int index); 5. IDictionary Dictionary бол энгийндээ нэр/утгын хосыг засаж өөрчилдөг collection. Жишээ нь, ID болон оноосон нэр өөрчлөгдех Car терлийг агуулсан IDictionary-ыг хэрэглэдэг хэрэглэгчийн төрел тодорхойллоо гэвэл IDictionary интерфейс Add(), RemoveQ, Contains() функцуудээр Keys, Values-ыг тодорхойлж болно: public interface IDictionary : ICollection, lEnumerable { bool IsFixedSize { get; } // Тогтмол хэмжээтэй эсэхийг заана bool IsReadOnly { get; } //Элементүүдийг зөвхөн уншина засаж болохгүй object this [ object key ] { get; set; } ICollection Keys { get; } //Түлхүүрийг авна ICollection Values { get; }//Утгыг авна void Addfobject key, object value); //Түлхүүр, ут-га нэмнэ void Clear (); //Бүх элементийг устгах bool Contains (object key); //Өгөгдсөн элемент байгаа эсэхийг шалгана IDictionaryEnumerator GetEnumerator ( ) ; // fosearch хийхэд IDictionaryEnumerator төрлийн объектыг гаргана. void Remove (object key) ; // Тухайн түлхүүрээр элемент хасах } 6. IDictionaryEnumerator IDictionary. GetEnumeratorQ нь IDictionaryEnumerator төрлийн объектыг буцаана. ID-ictionaryEnumerator бол ерөнхийдөө IEnumerator-ын өргөтгөсвн дугаарлагч болно: public interface IDictionaryEnumerator : lEnumerator { // lEnumerator функц. . . DictionaryEntry Entry { get; } // Entry объектоор дамжуулан түлхүүр, утга авна object Key { get; } // Түлхүүрийг авна object Value { get; }// Утгыг авна 7. IList IList интерфейс нь объект төрлийн өгегдөлтэй ажилладаг-IList интерфейс нь устгах, нэмэх, индекс олгох чадвартай: public interface IList : ICollection, lEnumerable ( bool IsFixedSize { get; } // Элементийн TOO тогтмол зсэхийг тогтооно bool IsReadOnly { get; } 4
  29. 29. VCP413 Лекцийн материал // Элементүүдийг зөвхөн уншина object this[ int index ] { get; set; } int Add(object value); // Жагсаалтын сүүлд элемент нэмнэ. void Clear(); // Элементүүдийг устгана bool Contains(object value); //Өгөгдсөн элемент байгаа эсэхийг шалгана int IndexOf(object value); // Элементийн индексийг уншина void Insert(int index, object value); // Заасан байрлалд элемент оруулах void Remove(object value); // элемент устгах void RemoveAtfint index); // Заасан байрлалд элемент устгах 8. System.CoIlections-ын классын төрлүүд Интерфейсийг класс, бүтэц ашигласан тохиолдолд л интерфейс ашигтай эд. Доорх хүснэгтэнд System.Collections нэрийн муж дахь цөм классууд болон тэдгээрийн түлхүур үгсийг харуулав. Хүснэгт 5.4 System.Collections классын түлхүүр үгс system,Coll Тайлбар Интерфейсийн ections түяхүүр үгс jwacc ArrayList Динамик хэмжээот IList, массивийг харуулна (Collection. lEnumerable, ICIoneable Hashtable Тоон түлхуүрээр IDictionary, тодорхойлогдсон ICollection, объектийн цуглууллагыг lEnumerable, харуулна ICIorieable First-in. first-out(FIFO) ICollection, дараалал харуулна ICIoneabie, lEnumerable s °rtedList dictionary-тай ижил IDictionary, боловч индексээр ICollection, элеиентэд хандана lEnumerable. ICIoneabie Last-in, first-gut{LIFO) стек ICollection, харуулна. lEnumerable. ICIoneabie 5
  30. 30. VCP413 Лекцийн материал Лекц №7 Сэдэв: .NET-ийн Delegate төрөл Delegate-ыг функцийн заагчтай адилтгаж болно. Програмын код бичих үед чухам аль функц дуудагдах нь мэдэгдэхгүй, харин програм ажиллах үед функц сонгогдох тохиолдолд delegate хэрэглэгддэг. Тухайлбал, зурган дээгүүр хулгана гүйх үед, хулганы товч нэг дарагдсан үед, 2 дарагдсан үед, гараас товчлуур дарахад, хулганы товчийг дарсан чигтээ чирэх зэрэг үйлдлүүдэд юу хийгдэхийг урьдчилан туc тусад нь тодорхойлж өгөөд програм ажиллахад тухайн үед хэрхэн ажилласнаас хамаарч хариу үйлдэл хийгддэг. Delegate нь делегатын класс, энэ классын объект гэсэн 2 хэсгээс тоггоно. Делегатын классыг зарласны дараа энý классын объектыг үүсгэж болох ба ү¿нийг функц дуудах, хадгалахад хэрэглэж болно. Delegate төрөл доорх 3 мэдээллийг агуулна:  Дуудагдах функцийн нэр  Энý функцийн аргумент  Энý функцийн буцах утга Delegate дээр дурдсан мэдээллийг агуулж, ¿үссэн л бол ажиллах явцдаа заагч (pointer)-аа дууддаг. Delegate үүсгэхэд Delegate түлхүүр үгийг хэрэглэнэ. Delegate- ын нэр юу ч байж болох ч энý delegate-ыг заах функцийн доторхтой давхцаж байх ѐстой. Жишээ íь: // DELEGATE КЛАСС ЗАРЛАЖ БАЙНА PUBLIC DELEGATE DOUBLE DELEGATECALCULATION( DOUBLE ACCELERATION, DOUBLE TIME); PUBLIC CLASS MOTIONCALCULATIONS { // HURD BODOH PUBLIC STATIC DOUBLE FINALSPEED(DOUBLE ACCELERATION, DOUBLE TIME) { DOUBLE FINALSPEED=ACCELERATION *TIME; RETURN FINALSPEED; } // ZAI BODOH PUBLIC STATIC DOUBLE DISTANCE(DOUBLE ACCELERATION, DOUBLE TIME) { DOUBLE DISTANCE=ACCELERATION * MATH.POW(TIME,2)/2; RETURN DISTANCE; } } CLASS EXAMPLE1 { PUBLIC STATIC VOID MAIN() { DOUBLE ACCELERATION =10; DOUBLE TIME=5; CONSOLE.WRITE(“ACCELERATION=”+ ACCELERATION +”M/S”); CONSOLE.WRITELINE(“TIME=”+ TIME +”SEC”); DELEGATECALCULATION MYDELEGATECALCULATION = NEW DELEGATECALCULATION(MOTIONCALCULATIONS.FINALSPEED); DOUBLE FINALSPEED=MYDELEGATECALCULATION(ACCELERATION,TIME); CONSOLE.WRITELINE(“FINAL SPEED=”+ FINALSPEED +”M/S”); 1
  31. 31. VCP413 Лекцийн материал MYDELEGATECALCULATION=NEW DELEGATECALCULATION(MOTIONCALCULATIONS.DISTANCE); DOUBLE DISTANCE = MYDELEGATECALCULATION(ACCELERATION, TIME); CONSOLE.WRITELINE(“PAST DISTANCE=”+ DISTANCE +”M.”); CONSOLE.READLINE(); } } ¯ð ä¿í: Зураг .1 delegate хэрэглэсэн нь Програм бичих явцад дээрх FinalSpeed(), Distance() функцуудын аль дуудагдах нь тодорхойгүй, програм ажиллах явцад л тодорхой болох үед делегатын хэрэглэж байна. Дээрх жишээнд делегатын хэрэглээ оновчтой биш мэт харагдавч системийн програмчлалд ашиглах нь элбэг. Функц делегатаар дуудагдахын тулд эхлээд түүнд бүртгүүлсэн байх хэрэгтэй. 2 Delegatе-ын жишээнүүд NAMESPACE SIMPLEDELEGATE { PUBLIC DELEGATE INT BINARYOP(INT X, INT Y); PUBLIC CLASS SIMPLEMATH { PUBLIC STATIC INT ADD(INT X, INT Y) { RETURN X + Y; } PUBLIC STATIC INT SUBTRACT(INT X, INT Y) { RETURN X - Y; } } CLASS PROGRAM { STATIC VOID MAIN(STRING[] ARGS) { CONSOLE.WRITELINE(“***** SIMPLE DELEGATE EXAMPLE *****N”); BINARYOP B = NEW BINARYOP(SIMPLEMATH.ADD); CONSOLE.WRITELINE(“10 + 10 IS {0}”, B(10, 10)); CONSOLE.READLINE(); } } } ¯ð ä¿í: Зурàã .2 delegate-н энгийн жишээ 2
  32. 32. VCP413 Лекцийн материал Энэ програмаар бид 2 статик функц тодорхойлдог SimpleMath нэртэй класс үүсгэж байна. .NET-ийн delegate бол type-safe болохоор хэрэв дараалал, бүтэц буруу delegate функц дуудвал компиляцийн алдаа өгөх болно. public class SimpleMath { ... PUBLIC STATIC INT SQUARENUMBER(INT A) { RETURN A * A; } } BinaryOp Delegate нь 2 Integer угга авч 1 Interger утга буцаадаг тул доорх байдлаар бичвэл алдаа заах болно: BINARYOP B = NEW BINARYOP (SIMPLEMATH.SQUARENUMBER ) ; 3. Multi Delegate-ыг хэрэглэх Delegate нь олон методыг бүртгээд дарааллаар нь дуудахыг мултикастинг буюу Multi Delegate гэдэг. Методыг нэмж дуудахдаа += үйлдлийг, хасаж дуудахдаа -= ¿йлдлийг ашигладаг. USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM.TEXT; NAMESPACE MULTIDELEGATE { CLASS PROGRAM { PUBLIC DELEGATE VOID LINEPRINT(STRING S); PUBLIC STATIC VOID TOLOWER(STRING S) { CONSOLE.WRITELINE(S.TOLOWER()); } PUBLIC STATIC VOID TOUPPER(STRING S) { CONSOLE.WRITELINE(S.TOUPPER()); } STATIC VOID MAIN(STRING[] ARGS) { LINEPRINT P; P = NEW LINEPRINT(TOLOWER); P += NEW LINEPRING(TOUPPER); P(“I LOVE KHULAN”); CONSOLE.READLINE(); } } } ¯ð ä¿í: Çóðàã 6.3. Multi Delegate 4 Delegatе объектын талаар Дээрх SimpleDelegate жишээгээ DisplayDelegateInfo() нэртэй туслах функцээр баяжуулъя. Энý функц нь System.Delegate-аас ирсэн функцийн нэрийг, тухайн функцийн тодорхойлсон классын нэрийг мºн хэвлэдэг. GetIVocationList()-ээс 3
  33. 33. VCP413 Лекцийн материал буцаагдсан System.Delegate массиваар давталт гүйх áа Target, Method ргорегty- нуудыг дуудна: NAMESPACE SIMPLEDELEGATE { PUBLIC DELEGATE INT BINARYOP(INT X, INT Y); PUBLIC CLASS SIMPLEMATH { PUBLIC STATIC INT ADD(INT X, INT Y) { RETURN X + Y; } PUBLIC STATIC INT SUBTRACT(INT X, INT Y) { RETURN X - Y; } } CLASS PROGRAM { STATIC VOID DISPLAYDELEGATEINFO(DELEGATE DELOBJ) { FOREACH (DELEGATE D IN DELOBJ.GETINVOCATIONLIST()) { CONSOLE.WRITELINE(“METHOD NAME: {0}”, D.METHOD); CONSOLE.WRITELINE(“TYPE NAME: {0}”, D.TARGET); } } STATIC VOID MAIN(STRING[] ARGS) { CONSOLE.WRITELINE(“**SIMPLE DELEGATE EXAMPLE *N”); SIMPLEMATH M = NEW SIMPLEMATH(); BINARYOP B = NEW BINARYOP(SIMPLEMATH.ADD); DISPLAYDELEGATEINFO(B); CONSOLE.WRITELINE(“N10 + 10 IS {0}”, B(10, 10)); CONSOLE.READLINE(); } } } ¯ð ä¿í: Çóðàã 6.4. delegate îáúåêòèéí ãèø¿¿äèéã õàðàõ 4
  34. 34. VCP413 Лекцийн материал Лекц №8 Сэдэв: С#-ийн event , ò¿¿íèé òóõàé Еvent нь нэг объектын юу хийж буйг нөгөө объектод мэдээлдэг. Жишээ нь: Õулганы заагч хаана байгаагаас, аль товч дарагдсан зэргээс хамаарч ялгаатай ¿éлдлүүд хийгдэж байгааг мэдээлж болно. Event ихэвчлэн график интерфейст програмд түлхүү хэрэглэгддэг. EVENT ажиллах үед дуудагдах функц delegate-ын тусламжтайгаар өгөгдөнө. Event-тэй ажилладаг delegate заавал 2 утга авдаг. Эхнийх нь event хийгдэж буй объект, дараагийнх нь event-ийн талаарх мэдээллийг агуулсан объект байх ѐстой. 1. Хэрэглэгчийн event тодорхойлох CarControl delegate 2 event-тэй. Эхнийх нь СаrControl-ын хурд дээд хязгаартаа хүрэхэд илгээгдэх AboutToBlow, дараагийн event нь хурд зөвшөөрөгдсөн хэмжээнээс давсан тохиолдолд BelowUp еvent илгээгдэнэ. Энý ¿åä еvent-үүд System.String төрлийн ганц параметр авч, void утга буцаадаг дурын функцийн хаягийг авч чаддаг делегаттай холбогдож чадна. CarContropl-ын рublic хэсэгт еvent нэмбэл: PUBLIC DELEGATE VOID CAREVENTHANDLER (STRING MSG) ; РUBLIC EVENT CAREVENTHANDLER ABOUTTOBLOW; РUBLIC EVENT CAREVENTHANDLER BLEWUP; Мºн дараахь жишээнд AlarmClock класст Alarm гэсэн рublic event тодорхойлъѐ. AlarmEventArgs класс EventArgs-аас удамшиж Аlarm Event руу өгөгдөл тодорхойлно. АlarmDriver класс классуудыг бүгдийг ашигладаг ба WakeMeUp-ын AlarmRang функцийг АAlarmClock-ын Alarm Event-ийг авна. Энý програм делегат, еvent-ийí хамаарлыг харуулсан жишээ юм. NAMESPACE EVENTSAMPLE { USING SYSTEM; USING SYSTEM.COMPONENTMODEL; PUBLIC CLASS ALARMEVENTARGS : EVENTARGS { PRIVATE READONLY BOOL SNOOZEPRESSED; PRIVATE READONLY INT NRINGS; PUBLIC ALARMEVENTARGS(BOOL SNOOZEPRESSED, INT NRINGS) { THIS.SNOOZEPRESSED = SNOOZEPRESSED; THIS.NRINGS = NRINGS; } PUBLIC INT NUMRINGS { GET { RETURN NRINGS; } } PUBLIC BOOL SNOOZEPRESSED { GET { RETURN SNOOZEPRESSED; } } 1
  35. 35. VCP413 Лекцийн материал PUBLIC STRING ALARMTEXT { GET { IF (SNOOZEPRESSED) { RETURN (“WAKE UP!!! SNOOZE TIME IS OVER.”); } ELSE { RETURN (“WAKE UP!”); } } } } PUBLIC DELEGATE VOID ALARMEVENTHANDLER(OBJECT SENDER, ALARMEVENTARGS E); PUBLIC CLASS ALARMCLOCK { PRIVATE BOOL SNOOZEPRESSED = FALSE; PRIVATE INT NRINGS = 0; PRIVATE BOOL STOP = FALSE; // STOP PROPERTY ÍÜ ÑÝп¿ËÃÈÉà ÓÍÒÐÀÀÕ ¸ÑÒÎÉà ÇÀÀÍÀ PUBLIC BOOL STOP { GET { RETURN STOP; } SET { STOP = VALUE; } } PUBLIC BOOL SNOOZEPRESSED { GET { RETURN SNOOZEPRESSED; } SET { SNOOZEPRESSED = VALUE; } } PUBLIC EVENT ALARMEVENTHANDLER ALARM; PROTECTED VIRTUAL VOID ONALARM(ALARMEVENTARGS E) { ALARMEVENTHANDLER HANDLER = ALARM; IF (HANDLER != NULL) { HANDLER(THIS, E); } } PUBLIC VOID START() { FOR (; ; ) { NRINGS++; IF (STOP) { BREAK; } ELSE { IF (SNOOZEPRESSED) { SYSTEM.THREADING.THREAD.SLEEP(1000); { 2
  36. 36. VCP413 Лекцийн материал ALARMEVENTARGS E = NEW ALARMEVENTARGS(SNOOZEPRESSED,NRINGS); ONALARM(E); } } ELSE { SYSTEM.THREADING.THREAD.SLEEP(300); ALARMEVENTARGS E = NEW ALARMEVENTARGS(SNOOZEPRESSED,NRINGS); ONALARM(E); } } } } PUBLIC CLASS WAKEMEUP { PUBLIC VOID ALARMRANG(OBJECT SENDER, ALARMEVENTARGS E) { CONSOLE.WRITELINE(E.ALARMTEXT + “N”); IF (!(E.SNOOZEPRESSED)) { IF (E.NUMRINGS % 10 == 0) { CONSOLE.WRITELINE(“ LET ALARM RING?ENTER Y”); CONSOLE.WRITELINE(“ PRESS SNOOZE? ENTER N”); CONSOLE.WRITELINE(“ STOP ALARM? ENTER Q”); STRING INPUT = CONSOLE.READLINE(); IF(INPUT.EQUALS(“Y”)||INPUT.EQUALS(“Y”)) RETURN; ELSE IF (INPUT.EQUALS(“N”) || INPUT.EQUALS(“N”)) { ((ALARMCLOCK)SENDER).SNOOZEPRESSED = TRUE; RETURN; } ELSE { ((ALARMCLOCK)SENDER).STOP = TRUE; RETURN; } } } ELSE { CONSOLE.WRITELINE(“ LET ALARM RING? ENTER Y”); CONSOLE.WRITELINE(“ STOP ALARM? ENTER Q”); STRING INPUT = CONSOLE.READLINE(); 3

×