Your SlideShare is downloading. ×
Lecture vcp413
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Lecture vcp413

8,381
views

Published on


3 Comments
10 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
8,381
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
497
Comments
3
Likes
10
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. VCP413 Лекцийн материал болно. Хэрэв хэрэглэгчийн код классын бүтцээс хамаардаг бол классын өөрчлөлт хэрэглэгчээс хамааралтай кодын ажиллагааг эвдэж болно.  Классын нээлттэй хэсэг дэх өөрчлөлт хийхэд өмнөх хэсгүүдийг зайлшгүй анхаарах хэрэгтэй. Хэрэглэгчдэд нээлттэй хэсэг их байх тусам хэрэглэгчийн кодыг өөрчлөлгүйгээр тухайн классын кодыг өөрчлөхөд хүндрэлтэй болҗ ирнэ.  Класст нээлттэй хэсэг их байх тусам олон хэсгийг хянах шаардлагатай болдог учраас програмыг хүндрүүлдэг. Жишээ нь: private string fullname; public Employee() { } 4.5. Удамшил (Inheritance) Удамшил бол ОХП-ын суурь ойлголтуудын нэг юм. Шинэ классыг эхнээс нь зохиохын оронд өмнө бичигдсэн классыг ашиглан дээр нь хэрэгтэй нэмэлтүүдийг хийнэ. Тодорхойлогдсон байгаа класс дээр үндэслээд шинэ класс үүсгэх боломжийг олгодог. Хуучин класс нь "эцэг класс", түүний үр дүнд үүссэн шинэ классыг "удамшсан" буюу "хүү класс" гэж нэрлэдэг. Удамших байдлаас хамаарч: * Энгийн удамшил * Нийлмэл удамшил гэж байдаг Онолын хувьд удамшил нь гол ойлголт тул практикт өргөн хэрэглэгддэг ч:  Бодит зүйлүүдийн харьцааг ашигладаг. Жишээ нь: "амьтан", "муур" классууд байвал муур нь амьтан учираас "муур" класс "амьтан" классаас удамшиж болно. Эцэг класс нь илүү ерөнхий шинж чанартай байх ѐстой, харин хүү класс нь өргөтгөсөн, нарийн шинж чанарыг агуулах ѐстой. Тэгвэл "муур” классын хувьд "тэжээгдэх" гэсэн шинж нэмэгдэж болох байна. Гэвч энэ нь оновчтой шийдэл биш ба иймэрхүү жишээ тэр бүр элбэг биш.  Эцэг класс нь удамшлыг тооцож үзсэний үндсэн дээр бичигдэх ѐстой. Энэ нь хэд хэдэн учир шалтгаантай. Хэрэв объект нь тохиромжгүй бүтэцтэй бол ажиллагаа муу байх нь ойлгомжтой. Мөн эцэг класс нь хүү классуудын бүх ерөнхий шинжийг агуулдаг учраас классуудын өөрчлөлтийг харж үзэх хэрэгтэй болдог. Үгүй бол, эцэг класс ямар нэг байдлаар өөрчлөгдөвөл удамшсан классууд "эвдэрч" болзошгүй. Програмын бүтцийг сайжруулах, ажиллагааг хурдасгах үед л удамшлыг хэрэглэх хэрэгтэй. .NЕТ-ийн орчинд бүх объектууд классаас удамшдаг ба зөвхөн нэг классаас л удамшихыг зөвшөөрнө. Ингэж хязгаарласнаар зарим нэгэн асуудал гардаг ч програмыг энгийн болгож өгдөг. Гэхдээ .NЕТ-ийн орчинд интерфейс ашиглаж олон удамшиж болно. Энэ зурагт 6 өнцөгт дүрс геометрийн хэлбэр болохынхоо хувьд Shaре классаас, Shаре класс нь С#-ын объектоос удамшиж байгааг харуулав. Зураг 4в Удамшил Жишээ: 4
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  • 37. VCP413 Лекцийн материал IF(INPUT.EQUALS(“Y”)||INPUT.EQUALS(“Y”)) RETURN; ELSE { ((ALARMCLOCK)SENDER).STOP = TRUE; RETURN; } } } } PUBLIC CLASS ALARMDRIVER { PUBLIC STATIC VOID MAIN(STRING[] ARGS) { WAKEMEUP W = NEW WAKEMEUP(); ALARMCLOCK CLOCK = NEW ALARMCLOCK(); CLOCK.ALARM += NEW ALARMEVENTHANDLER(W.ALARMRANG); CLOCK.START(); } } } ¯Ð Ä¿Í: Çóðàã 6.5. Alarm Event-èéí ¿ð ä¿í Мэдлэг шалгах асуулт 1. Event , Delegate хоѐрын хамаарал юу вý? 2. Дээрх SimpleDelegate namespace-т тодорхойлогдсон МуMath классыг үржих, хуваах функцуудаар нэмж баяжуул. ВinaryОр делегат ашиглан дуудаж үз. 3. Төрөл хувиргадаг multi delegate бич. Эхний функц нь дамжигдаж ирсэн int утгыг float рүү, дараагийнх нь string рүү хөрвүүлэх ѐстой. 4. MultiDelegate namespace-т р -= new LinePrint(ToUpper); мөр нэмж үр дүнг хараарай. 4
  • 38. VCP413 Лекцийн материал Лекц №9 Сэдэв: Файлын оролт гаралт Ямар ч програм бичихэд мэдээллийг файлд хадгалах, файлаас унших зэргээр файлтай ажиллах ямар нэгэн хэрэгцээ гарах нь зайлшгүй. Ýíýõ¿¿ õè÷ýýëýýð оролт, гаралттай ажилладаг System.IO нэрийн мужид тодорхойлогдсон олон классуудыг узэх болно. 1. Stream (урсгал) Stream гэдэг бол дараалсан өгөгдөл юм. Бусад бүх өгөгдлийн урсгалын классууд Stream абстракт классаас удамшина. Stream классын интерфейс оролт гаралттай ажиллахад маш хэрэгтэй. Дараахь хүснэгтэнд Stream классын шинж чанаруудыг тайлбарлав. Хүснэгт 8. 1 Stream классын гишүүд Ãèø¿¿ä Тайлбар CanRead Урсгалаас ºгºгдлийг уншиж, хайж бичиж болох эсэхийг CanSeek тодорхойлох утãа буцаана CanWrite Length Урсгалын уртыг байтаар тодорхойлно Position Урсгалын тухайн байрлалыг буцаана BeginRead() Унших үйлдлийг эхэлнэ BeginWrite() Бичих үйлдлийг эхэлнэ Close() Урсгал хааж эзэлсýн байсан санах ойн хэсгийг чºлººлнº EndRead() Унших үйлдлийг дуусгана EndWrite() Бичих үйлдлийг дуусгана Flush() Өгºгдлийн rеsource-т буферлэгдсэн өгөгдfл бичнэ Read() Байтуудын дарааллыг уншина ReadByte() Нэг байт уншина Seek() Урсгалд байрлал тогтооно SetLength() Урсгалын уртыг тогтооно Write() Байтуудын дарааллыг бичнэ WriteByte() Нэг байт бичнэ Ганц ч ºгөгдлийн resource холбогдоогүй урсгал буцаадаг Stream.Null талбар мºн Stream класст байна. Stream.Null-с ямар ч өгөгдөл буцдаггүй ба Stream .Null-д өгөгдөл бичихэд з¿гээр л алга болчихдог. Stream класс програмд шууд ордоггүй ч хүү классууд болох FileStream, NetworkStream, MemoryStream, BufferStream, CrypToStream классууд хэрэглэгддэг. 2. FileStream класс Ôàéëûã дискэн дээр (болон стандарт оролт, гаралт дээр) унших, бичих урсгал áîëíî. FileStream æèøýý àâ÷ ¿çüå. Доорх жишээ нь console програм биш Windows Application програм þì. using System; using System.Windows.Forms; using System.IO; class ExampleStr1 { 1
  • 39. VCP413 Лекцийн материал public static void Main() { // ôàéëûí íýðèéã ñîíãîæ îðóóëààðàé. *.txt ºðãºòãºëòýé ôàéë òóðøèæ ¿çýýðýé. OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Title = “Choose the file to be reserved”; if (dlgOpen.ShowDialog() != DialogResult.Cancel) { FileStream inStream = File.OpenRead(dlgOpen.FileName); // Õóóëàõ ôàéë FileStream outStream = File.OpenWrite(dlgOpen.FileName + “.bak”); // Øèíýýð ¿¿ñýæ áàéãàà *.bak ºðãºòãºëòýé áè÷èõ ôàéë int b; while ((b = inStream.ReadByte()) > -1) outStream.WriteByte((byte)b); // ãàðàëòààñ îðîëòðóó ºãºãäëèéã íýã áàéò áàéòààð íü õóóëæ ºã÷ áàéíà. outStream.Flush(); outStream.Close(); inStream.Close(); } } } Энý програмыг ажиллуулахад өмнө нь адил нэртэй файл байсан бол дээр нь дарж бичигдэнэ гэдгийг анхаарна уу! int төрлийн утга буцаадаг ReadByte функц, byte төрлийн утга авдаг WriteByte функцуудын уялдааг анхаараарай. Ер нь файлд ганц ганц байтаар унших, бичих нь төдийлөн үр дүнтэй биш тул буферийн тусламжтайгаар олноор нь унших бичих Read, Write функцуудыг ашиглана: using System; using System.Windows.Forms; using System.IO; class ExampleStr2 { public static void Main() { // ôàéëûí íýðèéã ñîíãîæ îðóóëààðàé. // *.txt ºðãºòãºëòýé ôàéë òóðøèæ ¿çýýðýé. OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Title = “Choose the file to be reserved”; if(dlgOpen.ShowDialog() == DialogResult.OK) { FileStream inStream = File.OpenRead(dlgOpen.FileName); // Õóóëàõ ôàéë FileStream outStream = File.OpenWrite(dlgOpen.FileName+”.bak”); // Øèíýýð ¿¿ñýæ áàéãàà *.bak ºðãºòãºëòýé áè÷èõ ôàéë byte[] buf = new byte[4086]; int bytesRead; // while ((bytesRead = inStream.Read(buf, 0, 4086)) > 0) 2
  • 40. VCP413 Лекцийн материал { // ãàðàëòààñ îðîëò ðóó ºãºãäëèéã 4086 áàéòààð õóóëæ ºã÷ áàéíà //MessageBox.Show(Convert.ToString(bytesRead)); outStream.Write(buf, 0, bytesRead); } // áóôåð ÷ºëººëºõ outStream.Flush(); outStream.Close(); inStream.Close(); } } } Дээрх жишээнд 4086 байтаар хуулж өгч байгаа. Read, Write функцийн 3 параметрийн эхнийх нь уншигдах (бичигдэх) буфер, дараагийнх нь өгөгдөл эхлэх буферийн байрлал, сүүлчийнх нь уншигдах (бичигдэх) байтын боломжит хамгийн их тоо байна. 3 StreamReaders, StreamWriters классуудтай ажиллах StreamReaders, StreamWriters классууд нь өгөгдлийг (string гэх мэт) уншиж бичихэд хэрэглэгдэнэ. Аль аль нь юникод тэмдэптэй ажиллана. StreamReader нь StringReader-тэй адилаар TextReader нэртэй абстракт классаас удамшина. Энэ класс нь character stream-ээс уншдаг. StreamWriter төрºл нь StringWriter-тэй адилаар TextWriter нэртэй абстракт классаас удамшина. Энэ класс нь удамшсан төрлийг өгөгдсөн character stream-д текст бичих боломæтой гишүүн тодорхойлдог. Оролт гаралтын шинэ төрлүүдийг энэ зурагт харуулав. StreamWriter, stringWriter класуудыг ойлгох үүднээсТехtWriter абстракт классын гол; гишүүдийг хүснэгтэнд тайлбарлалаа. Хүснэгт 8.2 ТеxtWriter классын гишүүд TextWriter-ûí ãîë Òàéëáàð ãèø¿¿ä Close() Áè÷èã÷(ôàéë çýðýã)-èéã õààæ, áè÷èãëýõ ìýäýýëëèéã ÷ºëººëíº. Flush() Áè÷èã÷(ôàéë çýðýã)-èéã õààëã¿éãýýð õ¿ëýýãäýæ áóé ìýäýýëëèéã áóôåðýýñ óñòãàíà. NewLine Øèíý ìºð àâíà. Write() Øèíý ìºðã¿éãýýð òåêñò óðñãàë ðóó ìºð áè÷íý. WriteLine() Øèíý ìºðòýé㺺ð òåêñò óðñãàë ðóó ìºð áè÷íý. 3
  • 41. VCP413 Лекцийн материал StreamWriter класс Write(), Сlose(), Fluhs() функцууд, мºн нэмэлт AutoFlush- гишүүнтэй. AutoFlush гишүүн true утга aвбал SreamWriter бичих үйлдэл хийгдэнэ, харин AutoFlush гишүүн False уггатай байвал Сlose()-ыг дуудна. . 4 Текст файл руу бичих StreamWriter òºðлийн жишээ харъя. Дараахь класс File.СreateText() функц ашиглаí remainders.txt файл үүсгэх ба StreamWriter объектыг ашиглаад файлдаа текс- бичнэ: static void Main(string[] args) { Console.WriteLine(“***** Fun with StreamWriter/StreamReader *****n”); // StreamWriter àâààä string ºãºãäºë áè÷èõ StreamWriter writer = File.CreateText(“reminders.txt”); writer.WriteLine(“Don‟t forget Mother‟s Day this year...”); writer.WriteLine(“Don‟t forget Father‟s Day this year...”); writer.WriteLine(“Don‟t forget these numbers:”); for(int i = 0; i < 10; i++) writer.Write(i + “ “); // Øèíý ìºð îðóóëàõ writer.Write(writer.NewLine); // Õààõ writer.Close(); Console.WriteLine(“Created file and wrote some thoughts...”); } Энý програмын үр дүн болох reminders.txt файлын агуулгыг Зураг8.2-т харуулав. Çóðàã 5. Текст файлаас унших Одоо StreamReader төрлийг ашиглан файлаас өгөгдөл хэрхэн унших талаар үзье. ТехtReader классаас удамшдаг ба дараахь хүснэгтэнд үзүүлсэн гишүүдтэй. Хүснэгт 8.3 ТехtReader классын гишуүд TextReader-ûí ãîë ãèø¿¿ä Òàéëáàð Peek() Òóõàéí áàéðëàëûí äàðààãèéí áàéðëàëûã áóöààíà.Õýðýâ -1 óòãà áóöààâàë ôàéëûí òºãñãºëä èðñýíèéã çààíà. Read() Îðîëòûí ºãºãäºë óíøèíà. ReadBlock() Òóõàéí óðñãàëààñ õàìãèéí èõ òîîíû òýìäýãòèéã óíøèíà. ªãºãäëèéã èíäåêñýýñ ýõëýí áóôåðò áè÷íý. ReadLine() Òóõàéí ìºðèéí òýìäýãò¿¿äèéã óíøèíà. ReadToEnd() Òóõàéí áàéðëàëààñ òºãñãºë õ¿ðòýë òýìäýãò¿¿äèéã óíøààä íýãýí òýìäýãò ìºð áîëãîí áóöààíà. Одоо Streamreader ашиглаад дээр бичсэн reminder.txt файлаасаа өгөгдөл уншина гэвэл: static void Main(string[] args) 4
  • 42. VCP413 Лекцийн материал { Console.WriteLine(“**Fun with StreamWriter/StreamReader***n”); // ôàéëààñ ºãºãäºë óíøèõ Console.WriteLine(“Here are your thoughts:n”); StreamReader sr = File.OpenText(“reminders.txt”); string input = null; while ((input = sr.ReadLine()) != null) { Console.WriteLine (input); } } Үр дүнг Зураг8.3-т харууллаа. Çóðàã Äàðààõ ïðîãðàì StreamReader, StreamWriter êëàññûã àøèãëàí òåêñòýí ôàéëä ºãºãäºë áè÷èæ, óíøèæ áàéíà. using System; using System.Text; using System.IO; class ExampleStr5 { public static void Main() { // øèíý ôàéë ¿¿ñãýõ FileStream outStream = File.Create(“c:TextText.txt”); // TextText.txt-ã øèíýýð ¿¿ñãýæ StreamWriter êëàññûã àøèãëàõ StreamWriter sw = new StreamWriter(outStream); // ôàéëä òåêñò áè÷èõ sw.WriteLine(“This is the check for StreamWriter”); // áóôåðèéã ÷ºëººëæ, ôàéë õààõ sw.Flush(); sw.Close(); // ôàéë óíøèõààð íýýõ StreamReader str = new StreamReader(“C:TextText.txt”); // áóôåðò ôàéëûí ýõíèé ìºðèéã óíøèæ äýëãýöýíä õàðóóëàõ string FirstLine; FirstLine = str.ReadLine(); Console.WriteLine(FirstLine); // àæëàà äóóñãàõ str.Close(); } } Ýíý ïðîãðàì àæèëëàæ This is the check for StreamWriter ãýñýí ìðº õýâëýæ õàðóóëíà. ¯ð ä¿í: Çóðàã 8.4. StreamWriter 6 Folder үүсгэх, устгах Програмчлах явцад хавтас үүсгэх, устгах хэрэгцээ их гардаг. Хавтастай ажиллахдаа Directory, DirectoryInfo, Path классуудыг ашигладаг. 5
  • 43. VCP413 Лекцийн материал Хүснэгт 8.4 Folder (хавтас)-тай ажилладаã классуудын гишүүд Directory, Directoryinfo êëàññûí Òàéëáàð ãèø¿¿ä Create(), ªãºãäñºí çàìûí äàãóó õàâòàñ ¿¿ñãýõ CtreateDirectory(), CreateSubDirectory() Delete(), Õîîñîí õàâòàñ óñòãàõ, True óòãà àâñàí ¿åä Delete(string), óñòãàíà. Delete(string, bool) GetDirectories(), ªãºãäñºí çàì äîòîðõ õàâòàñíóóäûã õàðóóëíà. GetDirectories(string), GetDirectories(string,string filter) GetFiles() ªãºãäñºí çàì äîòîðõ ôàéëóóäûã õàðóóëíà. GetFiles(string) GetFiles(string, string filter) Parent() ªìíºõ õàâòàñûã áóöààíà. GetParent() Øèíýýð õàâòàñ ¿¿ñãýõ, óñòãàõ æèøýý: public static void Main() { string userpath = @”c:oki”; if (!Directory.Exists(userpath)) Directory.CreateDirectory(userpath); // ¿¿ñãýõ Console.WriteLine(“oki folder is created”); Console.WriteLine(“Are you sure to delete folder„oki‟.Press Y”); String input = Console.ReadLine(); if (input.Equals(“Y”) || input.Equals(“y”)) { if (Directory.Exists(userpath)) Directory.Delete(userpath);// óòñãàõ Console.WriteLine(“oki folder deleted”); } else { return; } } ¯Р Дүн: Ñ: Диск дотор оki нэртэй folder үүснэ. Мән түүнийгээ буцаагаад устгаж болно. 7. NetworkStream класс NetworkStream класс сүлжээний нэг үзүүрт байгаа өгөгдөл (энд файл ч байж болно, resource ч байж болно) хүлээн авах, илгээх үүрэгтэй. NetworkStream класс 6
  • 44. VCP413 Лекцийн материал нь System.Net.Socktets нэрийн мужид тодорхойлогдсон байдаг. Энэ класстай ажиллахын тулд host хаяг, рогt-ын дугаар тодорхойлж өгсөн байх хэрэгтэй. Рогt нь 0 - 65535 байж болох ба НТТР протокол нь 80 дугаар портоор өгөгдөл дамжуулахад хэрэглэгддэг. System.Net.Socktets нэрийн мужид Socket класс тодорхойлогдсон байдаг ба сүлжээгээр 2 програм холбогдохын тулд энэ socket-ыг ашиглах ѐстой. Дараахь жишээнд ТсрListener класс нь socket нээж түүнд client холбогдохыг хүлээнэ. ТсрСlient класс socket-ыг нээнэ. Эдгээр нэмэлт классын тусламжтайгаар NetworkStream класс ажиллахад бэлэн болно. сlient-д NetworkSTream классаар буфер өгөгдөл дамжуулж байна: using System; using System.IO; using System.Net.Sockets; using System.Net; class ExampleStr3 { // Listen ôóíêö õîëáîëò õ¿ëýýæ áàéíà private void Listen() { // 50001 port-ûã ñîíñîæ áàéíà IPAddress ipAddress = Dns.Resolve(“localhost”).AddressList[0]; TcpListener tcp1 = new TcpListener(ipAddress, 50001); tcp1.Start(); // client õîëáîãäîõûã õ¿ëýýæ áàéíà for(;;) { // client õîëáîãäâîë Socket newSocket = tcp1.AcceptSocket(); if (newSocket.Connected) { // socket íýýõèéí òóëä //NetworkStream îáúåêò ¿¿ñãýõ NetworkStream ns = new NetworkStream(newSocket); // ºãºãäºë äàìæóóëàõ byte[] buf = {(byte)‟H‟, (byte)‟e‟, (byte)‟l‟, (byte)‟l‟, (byte)‟o‟, (byte)‟ „, (byte)‟N‟, (byte)‟e‟, (byte)‟t‟}; ns.Write(buf, 0, 9); // öýâýðëýõ ns.Flush(); ns.Close(); } // resource ÷ºëººëæ, ãàðàõ newSocket.Close(); break; } } public static void Main() { ExampleStr3 listener = new ExampleStr3(); listener.Listen(); } } 7
  • 45. VCP413 Лекцийн материал Äýýðõ ïðîãðàì NetworkStream êëàññ àøèãëàäàã server òàëä áè÷èãäýõ áà îäîî client òàëûí ïðîãðàìûã õàðöãààÿ: using System; using System.IO; using System.Net.Sockets; using System.Net; class ExampleStr4 { public static void Main() { // client-ûí socket ¿¿ñãýõ TcpClient newSocket = new TcpClient(“localhost”, 50001); //NetworkStream-í îáúåêòûã Host-îîñ ºãºãäºë óíøèõààð ¿¿ñãýõ NetworkStream ns = newSocket.GetStream(); // óðñãàëààñ áàéòûí ìàññèâèéã óíøèõ byte[] buf = new byte[100]; ns.Read(buf, 0, 100); // áàéòóóäûã ñèìáîë áîëãîí äýëãýöýí äýýð õàðóóëàõ char[] buf2 = new char[100]; for(int i=0; i<100; i++) buf2[i]=(char)buf[i]; Console.WriteLine(buf2); // öýâýðëýõ ns.Close(); newSocket.Close(); } } Эдгээр кодоос ТсрСlient класс нь Тсрlistener классаас энгийн болох нь харагдаж байна. Энә класст роrt-ын хаяг, дугаар дамжсаны дараа сүлжээнд холбогдохыг оролдоно (жишээнд localhost гэдэг нь өөрийн компьютер). ТсрСlient класс socket- той холбогдсоны дараа NetworkStream-ын объект буцаадаг GetStream функц ашиглагдана. Үүний дараа Socket-оос өгөгдөл авах Read функцтай ажиллаж болно. Энý програмыг ажиллуулахын өмнө ЕхampleStrЗ-тай програмыг ажиллуулах ѐстой. Мэдлэг шалгах асуулт 1. С дискэн дээр С# folder үүсгээд дотор нь МуFile1.txt нэртэй текст файл үүсгэ. 2. Үүсгэсэн файлдаа дурын мэдээлэл бич. 3. МуFile1.txt файлаа С дискэнд хуул 4. С:С#МуFile1.txt файлыг устга 8
  • 46. VCP413 Лекцийн материал Лекц №10 Сэдэв: Windows-èéí Form-òîé àæèëëàõ Энý бүлгээр System.Windows.Forms нэрийн мужидтодорхойлогдсон контролуудтай танилцах болно. Visual Studio-д байдаг, түгээмэл хэрэглэгддэг Button, TextBox, MaskedTextBox, WebBrowser, MonthCalendar, TreeView гэх мэт контролуудтай танилцана. Мен MDI form хэрхэн уүсгэх, ажиллах талаар үзэх болно. ToolStrip, StatusStrip зэрэг сонирхолтой контролуудтай бие даан танилцахыг зөвлөе. ОХП- ын тусламжтайгаар классуудыг удамшуулж болохыг та өмнөх бүлгүүдээс сайн мэдэж авсан байхаа. Энә бүлэгт Windows-ын Form-д удамшсан шинэ контролуудыг ашигласан болно. Мән танд бонус болгон DevExpress 8.1.2 контролуудыг номын дагалдах дискэн дээр хууллаа. Windows Forms Application үүсгэх 1. Шинэ solution үусгэх гэж байгаа бол емнөх Solution-ийг заавал хааж өгнө. (Зураг2.5-г харна уу) 2. Дэлгэцийн зүүн талын ToolBox хэрэгсэл дээр хулганаа аваачих хэрэггэй. (Зураг 2.6-г харна уу) 3. Button-r сонгоод хулганаа хоёр дарна. 4. Form1.cs файл үүссэн байгаа энә файлд доорх мөрийг нэмээрэй' private void buttonl_Click(object sender, System.EventArgs e) MessageBox.Show("The first windows app in the book!"); Зураг1: Windows Forms Application үүсгэх алхам 1 1
  • 47. VCP413 Лекцийн материал Зураг 2. Windows Forms Application үүсгэх алхам 2 5. Ингээд F5 дараад програмаа ажиллуул. 6. Button- дээрээ дарахад дараахь байдлаар message box гарч ирнэ. 2
  • 48. VCP413 Лекцийн материал Лекц №11 Сэдэв: Windows-ын form-ын контролууд Forms-ыг кодын аргаар (өөрөөр хэлбэл гараар) үүсгэж, ажиллаж болно. Ингэвэл урт, өргән, байрлал зэргээс эхлээд бүх л шинж чанаруудыг гараар тодорхойлж бичиж өгөх ѐстой. User Interface ашиглан үүсгэе гэвэл Бүлэг2-ын Windows Forms Application үүсгэх хэсгийн дагуу form үүсгэнэ.Үүсгэсэн form-доо контролууд нэмэхийн тулд ажлын цонхны зүүн хэсэгт байх Toolbox цонхноос (Ctrl+Alt+x) оруулна. Form дээр хэрэглэгддэг өргән ашиглагддаг зарим контролуудыг тайлбарлая. Хүснэгт 1 зарим контролууд Контролууд Тайлбар Button Формын товчлуур. Дээрх бичгийг text propeffy-д заана '"CheckBox Өгөгдлийг сонгоход хэрэглэгдэх хайрцаг ComboBox Дээрх хэд хэдэн checkbox-ын жагсаалт DataGridVievv Хүснэгт хэлбэрийн өгөгдөлтэй ажиллах контроль GroupBox Сонголтуудыг бүлэглэх үүрэгтэй Imagelist Зургуудын цуглуулгатай ажиллана Label Текст харуулах хэсэг ListBox Жагсаалт хэлбэрийн өгөгдөлтэй ажиллана MenuStrip Цэс (menu'j-тэй ажиллана Panel PictureBox Хэсэг контролуудыг нэг булэг оолгоно Зурагтай ажиллахад хэрэглэнэ RadioButton Хэсзг сонголтуудаас ганцыг сонгоход хэрэглэнэ TsxtBox Өгөгдөл оруулах нүд TreeView Өгөгдлийг шатчилсан, мод хэлбэрээр харуулна. За одоо эхлээд form-доо Button (товч) оруулъя. Зураг 9.1-т харууллаа. 1
  • 49. VCP413 Лекцийн материал Зураг 9.1 Form дээр товч тавьсан нь Авч тавьсан контролуудын шинж чанар болох хэмжээ, харагдах байдал, текст, утга, нэр зэргийг Properties дотор еөрчилнө. Энд мен контролуудтай ажиллах event-үүд буюу хулганы товч дарагдах, гараас товч дарагдах, хулгана гүйх, хэмжээ өөрчлөгдөх, харагдах байдал өөрчлөгдөх зэрэгт хийгдэх үйлдл үүдийн кодыг бичиж өгөх боломжтусгагдсан байдаг. Тухайлбал Button-ы зарим Properties болон Events-ийгтайлбарлая: Хүснэгт 9.2 Button-ын зарим property, event-үүд Properties Тайлбар name Нэр. Тухайн төрлийн хэддэх нь байна гэдгээрзэ нзрлэгдэнэ. button1!, button2 гэх мэт backcolor Арын суурь енгийгтодорхойлно font Үсгийн фонтыг зааж өгнө location X, Ү байрлал tablndex Tab-товчоор шилжих дараалал заана visible Програм ажиллахад харагдах эсэхийг заана гэх мэт. Events Тайлбар Click Дээр нь дарахад хийгдэх үйлдлийг бичиж өгнө DragDrop Хулганы товч дараад авах үеийн үйлдэл Enter Гараас Enter дарагдахад KeyDown Гараас товч дарагдахад TextChanged Дээрх текст өөрчлегдөхөд гэх мэт. Контролуудад Properties Events байдгийн адил form-д ч бас байдаг. Form-ны Load, Activated зэрэг заавал мэдэж байх event-үүдийгтуршиж-үзээрэй. 2
  • 50. VCP413 Лекцийн материал 3
  • 51. VCP413 Лекцийн материал 4
  • 52. VCP413 Лекцийн материал 5
  • 53. VCP413 Лекцийн материал 6
  • 54. VCP413 Лекцийн материал 7
  • 55. VCP413 Лекцийн материал 8
  • 56. VCP413 Лекцийн материал 9
  • 57. VCP413 Лекцийн материал 10
  • 58. VCP413 Лекцийн материал 11
  • 59. VCP413 Лекцийн материал Лекц №12 Сэдэв: Windows-ын form-ын контролууд 1. MDI form, NIDI child үүсгэх Одоо бид MDI form буюу програмын эх form-ын талаар үзэцгээе. MDI form-той ap- plication гэж юуг хэлж байна гэхээр зураг ч байна уу, текст файл ч байна уу, ер нь файл бүр нэг нэг цонхонд нээгдэж, нэгэн хүрээнээс гаралгүй ажиллахыг хэлнэ. Энд гаднах эх хүрээг нь MDI parent (эцэг) form, дотор нээгдэхийг MDI child (хүү) form гэнэ. Эцэг form нээгээд юуны түрүүнд menu-нээс хүү form-уудыг дуудаж нээдэг байна гэвэл (өерөөр хэлбэл File->New), нээсэн файлуудаа харагдах байдлыг мән л menu-нээс дуудаж өерчилж хардаг (өөрөер хэлбэл Cascade, Tile Horizontally, Verti- cally гэх мэт) байна гээд жижиг MDI form үүсгэе. Эхлээд эцэг form-oo нээгээд Properties доторх isMdiContainer-ыг true болгоно. Дараа нь MenuStrip контролыг form дээрээ авахаад меню үүсгэнэ. Менюгээ бөглөсний дараа дэд меню дээр хоёр дарахад биелэгдэх кодуудыг бичнэ. Зураг 1 Эцэг form-ын дизайн Одоо үүний дараа хүү form-oo үүсгэнэ. Үүсгэхийн тулд Project -> Add Windows Form гээд үүсгэсэн шинэ формоо Emp гэж нэрлэе. Эцэг form-ын цэсний Хэрэглэгчдийн бүртгэл дарахад Child form үүсгэх доорх кодыг бичиж өгнө. Emp userForm = new Emp(}; // Emp бол Child болно userForm.MdiParent = this; userForm.Show(); MDI эцэг form-ын Цонх цэсний дэд цэсийг дарахад ажиллах код: private void X3BT33ToolStripMenuItem__Click (object sender, Even-tArgs e) : ( this.LayoutMdi(MdiLayout.TileHorizontal); } 1
  • 60. VCP413 Лекцийн материал private void BocooToolStripMenuItem_Click(object sender, Even-tArgs e) { this.LayoutMdi(MdiLayout.TileVertical); } private void )KarcaaxToolStripMenuItem_Click_l(object sender, EventArgs e) ( this.LayoutMdi(MdiLayout.Cascade); } private void xaaxToolStripMenu!tem_Click(object sender, Even-•tArgs e) { int iLength = MdiChildren.Length; for (int i = 0; i < iLength; i++) Ч MdiChildren[0] .Dispose (); Зураг 2 Эцэг form-ын цонх цэс 2
  • 61. VCP413 Лекцийн материал 3
  • 62. VCP413 Лекцийн материал 4
  • 63. VCP413 Лекцийн материал 5
  • 64. VCP413 Лекцийн материал Лекц №13, 14 Сэдэв: GDI ãðàôèê 1. Windows программчлалыг GDI-ээр загварчлах нь GDI нь анх 1992 онд Windows-ийн 16bit-ийн үйлдлийн системд зориулагдан гарч ирсэн ба одоогийн бидний хэрэглэдэг .NET хүртлээ хөгжөөд байна. 2008 оны 08 сарын байдлаар GDI 9.0 хувилбар гарсан ба 2010 онд түүний 10.х хувилбар нь гарна. GDI нь Win32 сайжруулж гарч ирсэн ба Windows төрлийн үйлдлийн системд зориулсан application-уудыг хөгжүүлэх бэлэн классуудын сан юм. C++ хэл дээр бичигдсэн ба 200-аас илүү класстай. Классууд нь цонх, menu, dialog box, үндсэн оролт гаралтын гүйцэтгэл, өгөгдөл хадгалалт зэргийг удирдах шаардлагатай кодуудаар хангагдсан. GDI-ыг МFC-ын бэлэн объектуудыг хэрэглэх эсвэл шинээр объект үүсгэх, GDI-ийн классуудаас класс удамшуулан удамшсан классынхаа объектыг хэрэглэх замаар ашиглана. GDI-ээс класс удамшуулахад удамших класс нь цонх болон түүнтэй холбоотой бүхий лүйлдлүүдийг хийж чадах учраас системийн шаардлагаас хамааран удамших классд гишүүн өгөгдөл болон функцуудыг л нэмж өгнө. МFC-ээр програмчлах ерөнхий зарчим нь цонх нь өөр дээрээ байх control-уудыг өөрийн классын гишүүдтэй холбон тэднийг удирдах үйлдлүүдийг тодорхойлох явдал юм. GDI-ийг хөгжүүлэх үндсэн хөгжүүлэлтийн орчин нь Visual Studio 6.0 бөгөөд энэхүү IDE(integrated development environment буюу нэгдсэн хөгжүүлэлтйиг орчин) дээр хэрэглэгч кодоо гараар үүсгэх эсвэл бэлэн график хэрэгслүүдийг ашиглан программчилна. 2. GDI-ийн классын сангийн ерөнхий классууд болон тодорхойлолтууд CObject GDI-ийн ихэнх класуудын үндсэн класс. CcmdTarget Windows API-ийн message буюу зурвасын классуудыг encapsule хийсэн буюу багцалсан. Хэрвээ message-тэй холбоотой class үүсгэх бол энэ class- аас удамшуулна.  Сobject классаас удамшсан  Win32 зурвасуудыг хангадаг 3. CWinApp GDI windows application-ийг байгуулах, эхлүүлэх, ажлуулах, зогсоох зэрэг үйлдлийг зохион байгуулах класс.  Application хязгаар доторхи өгөгдлүүдийг хадгалдаг  Standart cursor болон icon рүү хандана  Windows Registry ба *.ini файлууд руу хандана CWnd Windows API функцууд, өгөгдлийн төрлүүд болон цонх байгуулахад хэрэглэгдэх бусад классуудыг encapsule хийсэн.  CcmdTarget-аас удамшсан.  Бүх цонхны үндсэн класс ба доорхи классууд удамшина Control классууд(CButton, CEdit, CStatic гэх мэт) CView класс 1
  • 65. VCP413 Лекцийн материал CDialog класс CPropertySheet класс CSplitterWnd класс CControlBar класс CFrameWnd класс  Цонхны хэмжээ болон байрлал өөрчлөх  CWnd классын ерөнхий хэрэглэгдэх функцууд ShowWindow –Цонхыг харуулах функц бөгөөд үндсэн 10 параметр авах боломжтой үүнээс SW_HIDEбуюу цонхыг нуух, SW_SHOW буюу цонхыг харуулах параметрыг ихэнхдээ хэрэглэдэг SetWindowText- Цонхны title bar дээр гарах гарчгийг тохируулна GetwindowText- Цонхны title bar дээр гарах гарчгийг буцаана MoveWindow- Цонхыг шинэ байрлалд шилжүүлнэ SetFont –Цонхон дээр гарах текстийн фонтыг тодорхойлно 4. CObject-оос удамшаагүй классууд Control болон түүний классууд BUTTON control- класс нь CButton. Button-ы 3 төрөл байдаг 1. Push Button- дарагддаг button 2. Radio Button- Групплэгдсэн button-уудаас нэгийг сонгох 3.CheckBox- Групплэгдсэн button-уудаас олноор нь сонгох EDIT control-класс нь CEDIT LIST-BOX ба COMBO-BOX –класс нь CListBox List Box нь их хэмжээний сонгогддог item-үүдийн жагсаалтыг агуулах ба олон item-ийг сонгож болох ба defaultүедээ 1 item-ийг сонгоно GDI-ийн өөр нэг онцлог бол глобал функц болон макрог ашигладаг. Глобал функц нь Afx гэсэн prefix буюу угтвар хэрэглэдэг. Жишээ нь AfxMessageBox() - энэ функц нь глобал функц учраас class-ын объект үүсэхээс өмнө хэрэглэгч рүү Мessage Box- ийг гаргаж чадна. Харин макрог ашиглахдаа #define гэх препроцессорын командыг 2
  • 66. VCP413 Лекцийн материал ашиглах ба бичихдээ том үсгээр бичдэг. Жишээ нь: BEGIN_MESSAGE_MAP(); END_MESSAGE_MAP();энэ 2 макро нь class доторхи event-үүдийн эхлэх төгсөхийг заанa. 5. GDI AppWizard GDI нь цонх болон түүн дээрхи control-уудыг классаар загварчилдгийг дээрхи классуудаас харлаа. Тиймээс applicationбуюу программ хийхийн тулд үүсгэх классуудаа project дотор нэгтгэж өгөх хэрэгтэй. GDI AppWizard нь энэхүү project- ийг автоматаар үүсгэнэ. Wizard нь project файлын систем болон бүтэц мөн project доторх файлуудын функциональ хамаарлыг бий болгодог. Шинээр project үүсгэх дараалал 1. File menu New --> Project tab сонгоход New диалог box –ийг харуулах ба GDI AppWizard(exe) сонгоод ProjectName textbox-д Project-ийн нэрийг оруулаад OK товчин дээр дарна. 2. Application-ы төрлийг сонгох цонх гарч ирэх ба 3 төрлийн Application үүсгэх боломжтой. Single document- Ганц л document-тай ажиллана Multiple Document- Олон document-тай ажиллах боломжтой Dialog- Dialog-тай ажиллах 3. Finish товчийг дарснаар default тохируулгатай application үүснэ. Хэрэглэгч мөн Next товчийг даран defaultтохируулгыг өөрчилж болно. Үүний үр дүнд AppWizard нь Application-ы төрлөөс хамааран доорхи классуудыг автоматаар үүсгэнэ.  Single Document - CNameApp, CNameDoc, CNameView, CNameFrame CNameApp класс нь Application класс бөгөөд CWinApp классаас удамшина CNameDoc класс нь CDocument классаас удамших Document класс ба Application-ийг удирдах классуудыг удирдана CNameView – CView классаас удамших View класс ба хэрэглэгч рүү document-ийн тухай мэдээллийг харуулах ба document ба хэрэглэгчийн хоорондох харилцааг удирдана CNameFrame класс нь CFrmWnd классаас удамших Frame класс  Multiple document- CNameDoc, CNameView, CNameFrame үүсгэхээс гадна CChildFrame классыг үүсгэнэ  Dialog Based – CNameApp, CNameDlg Жич: Классын нэрний дунд бичигдсэн Name-ийн оронд Project-ийн нэр байна. Multiple document болон Single Document –ийг үүсгэхэд menu автоматаар үүснэ. 3
  • 67. VCP413 Лекцийн материал Энэ нь dialog учраас menu-гүй байна. 1. Class View буюу программд хэрэглэгдэх классууд болон түүний гишүүн өгөгдөл болон функцуудыг харуулна Хэрэв программд шинээр class нэмэх бол View--> ClassWizard сонгох буюу Ctrl+W гэсэн гарны хослолыг дарж шинээр класс үүсгэх, үүссэн класс дээр шинээр гишүүн функц болон гишүүн өгөгдөл нэмнэ. 2. Программд хэрэглэгдэж буй нөөцүүдийг харуулна. Dialog, Menu, Icon, string table гэх мэт resource-уудыг харуулна. Хэрэв программд шинээр resource нэмэх бол Insert Resource сонгох буюу Ctrl+R даран оруулах боломжтой 3. Үүссэн файлуудыг харуулна 4. Client Area буюу хэрэглэгчийн талбар 5. Control-уудыг агуулсан toolbox 6. Eрөнхий хэрэглэгдэх control-ууд 7. Control-уудыг үүсгэх болон класстай холбох Control үүсгэхийн тулд хэрэглэгдэх control-уудаа toolbox-оос mouse-ны зүүн товчин дээр даран чирж client area буюу хэрэглэгчийн форм дээр байрлуулах ба control- ын шинжтэй холбоотой өөрчлөлтүүдийг control-ийн дээр баруун товч даран үүсэх menu-ний properties руу орж өөрчилнэ. Харин control-ийг класстай 4
  • 68. VCP413 Лекцийн материал холбохдоо ClassWizard руу орон control-ийн үүсгэх event-ийг class-ын гишүүн функцтэй эсвэл control-ийг class-ийн гишүүн өгөгдөлтэй холбож болно. Ингэснээрclass-ууд нь control-той харьцах боломжтой болно. Button control Button control үүсгэхийн тулд эхлээд resourse view-ээс dialog-оо сонгоод toolbox- оос button-оо чирч авчирна.Button дээр гарах текстийг өөрчилэхийн тулд Button control дээр mouse-ны баруун товчийг даран General tab-ийг сонгоход доорхи цонх үүсэх ба Caption хэсэг дэх текстийг өөрчилнэ. Харин ID хэсэг нь тухайн control-ийн программ дах бусад control-оос ялгагдах ID нь бөгөөд хэрэглэгч үүнийг бусад control-ын ID –тай давхцуулахгүйгээр өөрчилж болно. Button-ы загвар болон түүн дээр харагдах текстийн байрлал зэргийг Styles, Extended Styles tab доторхи тохируулгуудаас өөрчилэх боломжтой. Button дээр дарахад үүсэх event-ийг class-ын гишүүн функцтай холбохдоо ClassWizard руу орон control-оо сонгоод Messages хэсгээс control-ын үүсгэх event-ийг сонгоод товчин дээр дарснаар доорхи цонх үүснэ Энд class-ын гишүүн функцын нэрийг бичиж оруулснаар классд шинээр гишүүн функцыг нэмнэ. Харин энэ функц дотор хийгдэх үйлдлээ 5
  • 69. VCP413 Лекцийн материал тодорхойлохдоо товчин дээр дарах ба классын гишүүн функцын тодорхойлолтыг доор үзүүлсэнтэй ижлээр харуулна Харлуулсан хэсэгт хэрэглэгч хийх үйлдлээ тодорхойлно. Edit Box control Энэхүү control-оо классын гишүүн өгөгдэлтэй холбон класстай өгөгдөл солилцоно. Үүний тулд ClassWizardруугаа орон Member Variables tab-ыг сонгоод control- ынхоо ID сонгон товчин дээр даран гарч ирэх цонхонд гишүүн өгөгдлийн нэр, бүлэг, төрөл зэргийг тохируулан үүсгэх ба үүссэн гишүүн өгөгдлийг Class View-ээс харж болно. Дараа нь control-оос утга авах эсвэл control руу утга дамуулахаас хамааран UpdateData гэх CWnd классын гишүүн функцыг ашиглах ба энэ функц нь dialog-ийг үүсгэхдээ өгөгдлийг тодорхойлох эсвэл dialog-оос утга буцааж авах тохиолдолд хэрэглэнэ. Энэхүү функц нь гаднаас нэг фараметр авах ба control-оос утга дамжуулах бол “true” эсрэгээр утга авах бол “false” гэсэн фараметрыг дамжуулна. 6
  • 70. VCP413 Лекцийн материал Лекц №15 Сэдэв: Өгөгдлийн сантай ажиллах 1. ADO.NET классуудыг танилцуулга ADO.NET нь санах ойд єгєгдлийн олонлогуудыг байгуулахыг зєвшєєрдєг объектын загвар юм. Та єгєгдлийн олонлогуудын єгєгдлийг кодоос, текст файлаас, exchange server-ээс, єгєгдлийн баазын системээс авч болно. ADO.NET-д сурах зайлшгvй хэрэгтэй хэд хэдэн класс бий. Танд энэ бvх классуудын товч тайлбарлая. DataSet - Энэ классыг санах ой дахь єгєгдлийн бааз гэж зvйрлэж болно. DataSet нь нэг болон тvvнээс дээш DataTable объектуудыг багтааж чаддаг ба тэдгээрийн хооронд relationship тогтоож чадна. Энэ классад жинхэнэ єгєгдлєєс уншсан єгєгдєл байрлах ба ямар нэгэн єєрчлєлт бvр нь тvvн рvv хийгдэж байдаг. ADO.NET-ийн єєр объектыг ашиглан єєрчлєлтийг єгєгдлийн бааз руу хадгална. DataTable – Энэ класс нь єгєгдєл бvхий мєрvvдийг агуулж байдаг. Мєр болгон багануудаас бvрдэх ба багана болгон нэгэн тєрєл бvхий єгєгдлvvдийг агуулж байдаг. DataView – Энэ класс нь онцлог шинжээр харагдах DataTable юм. Энэ объект нь DataTable объект дээр эрэмбэлэлтvvд, шvvлтvvрvvдийг хэрэглэж байдаг. Connection - Энэ класс нь єгєгдлийн эхтэй (data source) холболт хийхэд хэрэглэгддэг. Энэ классад vндсэн OLE DB, SQL server гэсэн 2 тєрєл байна. Command – Энэ класс нь SQL мэдэгдлvvдийг єгєгдлийн эх рvv буцаан дамжуулж байдаг. Та SQL болон stored procedure-уудыг ашиглан бvх єгєгдлийг сэргээх ба єєрчлєлт хийж чадна. Энэ классад єєрчлєлтvvдийг хадгалж чадах, єгєгдєл сэргээх method-ууд бий. CommandBuilder - Энэ класс нь SELECT, INSERT, UPDATE, DELETE command oбъектуудыг байгуулахад хэрэглэгддэг. DataAdapter - Энэ класс нь DataSet эсвэл DataTable-ийг єгєгдлийн баазаас єгєгдлєєр дvvргэхэд хэрэглэгддэг. DataAdapter нь єгєгдлийн баазтай холболт 1
  • 71. VCP413 Лекцийн материал vvсгэх ба SQL мэдэгдэлд тохирох command oбъектыг байгуулж, єгєгдлийг сэргээн, DataSet эсвэл DataTable-ийг байгуулаад, єгєгдлийн баазаас салгагдана. DataReader - Энэ класс нь єгєгдлийн эхээс єгєгдлийг хурдан уншиж чадах ба forward-only, зєвхєн уншигдах курсор юм. Энэ класс нь DataGrid-vvдийг, ListBox- уудыг, ComboBox-уудыг дvvргэхэд хамгийн тохиромжтой. ADO классуудыг хэрэглэх нь Та дээрхээс .NET ийн зарим классууд яаж єгєгдлийг дамжуулж буйг, DataSet-vvд нь хэрхэн хэрэглэгддэгийг харж байна. DataAdapter-ууд нь SQL Server, Oracle, Access зэрэг єгєгдєл хадгалагч (Data Store)-аас єгєгдєл уншин DataSet-vvдийг дvvргэдэг. DataSet нь байгуулагдсан бол энэ нь WinForm, WebForm, Web Service эсвэл бvр єєр ямар нэгэн Java дээр бичигдсэн Unix сервэр дээр ажиллах вэб хуудасанд ч хэрэглэгдэж болно. OleDb ба SqlClient Энэ 2 нь ялгаатай шинж бvхий Connection, Command, CommandBuilder, DataAdapter, DataReader классуудтай. OleDb нь OLE DB provider-уудыг хэрэглэн єгєгдлийн эхvvдийг авахад зориулагдсан. Энэ 2 нь єєр єєр NameSpace-д байрлана. Доор OleDb классуудыг хэрхэн тодорхойлохыг жишээ болгон бичье. Dim oConn As OleDb.OleDbConnection 2
  • 72. VCP413 Лекцийн материал Dim oCmd As OleDb.OleDbCommand Dim oBuild As OleDb.OleDbCommandBuilder Dim oDA As OleDb.OleDb.OleDbDataAdapter Dim oDR As OleDb.OleDb.OleDbDataReader Доор Sql классуудыг хэрхэн тодорхойлохыг жишээ болгон бичье. Dim oConn As SqlClient.SqlConnection Dim oCmd As SqlClient.SqlCommand Dim oBuild As SqlClient.SqlCommandBuilder Dim oDA As SqlClient.SqlDataAdapter Dim oDR As SqlClient.SqlDataReader ADO.NET-г ADO-той харьцуулах нь ADO.NET нь ADO-гийн сайжруулсан, боловсронгуй хувилбар юм. Энэ 2 объект загварын зарим vндсэн єєрчлєлт байдаг боловч эцсийн vр дvн нь ижил хэвээр билээ. Танд єгєгдєл хадгалах, єгєгдєл сэргээх, єгєгдєлд засвар хийх объект загвар хэрэгтэй билээ. ADO нь танд тvvнийг RecordSet-vvдийн тусламжтай гvйцэтгэхийг зєвшєєрдєг бол ADO.NET нь танд тvvнийг DataSet-д болон бусад объектын тусламжтай хийхийг зєвшєєрдєг. ADO.NET ба ADO-гийн vндсэн ялгаа нь ADO.NET нь єгєгдлийн vл холбогдсон (disconnected) хэлбэр, ADO нь холбогдсон тєрлийн объект загвар гэдэгт байгаа билээ. 3
  • 73. VCP413 Лекцийн материал Лекц №16 Сэдэв: Visual Studio-ooc өгөгдлийн санд холбогдох 1. Visual Studio-ooc өгөгдлийн санд холбогдох namespace ConnectionApp {. enum DataProvider { SqlServer, OleDb, Odbc, Oracle } class Program { static void Main (string [] args) { // тусгай холболт авах IDbConnection myCn = GetConnection (DataProvider . SqlServer) ; // SQL Server-ийн Pubs database-тэй холбогдоно гэвэл • - myCn.ConnectionString = "Data Source=localhost;uid=sa;pwd=; Initial Catalog=Pubs"; // туслах функцээр холболтын оролтыг нээе OpenConnection (myCn) ; // холболтыг ашигласны дараа хаах myCn. Close () ; } static IDbConnection GetConnection (DataProvider dp) { IDbConnection conn = null; switch (dp) { case DataProvider . SqlServer : conn = new SqlConnection ( ) ; break; case DataProvider .OleDb: conn = new OleDbConnection ( ) ; break; case DataProvider .Odbc: conn = new OdbcConnection ( ) ; break; case DataProvider .Oracle : conn = new OracleConnection ( ) ; break; } return conn; Энә код нь System. Data.SqlClient-ыг биш System. Data-г хэрэглэснээр уян хатан гэгдэх болно. Өнөөдөр танай компани SQL дээр ажиллаж байснаа хожим Oracle ашиглах болбол сонгон ашиглах боломжтой. 2. SQL Server дээрх өгөгдлийн сантай холбогдох Одоо Microsoft SQL Server дээрх өгөгдлийн санг .NET-тэй холбосон жишээ авч үзье. Та SQL-ийн талаар мэдлэггүй бол монгол хэлээр Microsoft SQL Server2000 гэсэн ном гарсныг олж уншаарай. Microsoft SQL Server-тэй холбогдохоос өмнө та өөрийн Database-ээ үүсгэсэн байх хэрэгтэй. SQL Server-ийн Enterprise Manager ашиглавал илүү хялбар байх болно. Бид дараагийн жишээ програмууд дээрээ SQL програм дээр Cars өгөгдлийн санг ашиглана. Cars өгөгдлийн сан нь доорх хүснэгт, талбаруудтай болно. 1
  • 74. VCP413 Лекцийн материал Зураг 10.2 Cars вгегдлийн сангийн бүтэц Дээрх өгөгдлийн сангийн script-r дагалдах дискэн дээр-хуулсныг авч ашиглаарай. Өгөгдлийн сангаа үүсгэсэний дараа Visual Studio дотроо -егөгдлийн сан руугаа егөгдөл холбох (data connection үүсгэх) хэрэгтэй. Ингэснээр өгөгдлийн объектуудыг засах, харах боломжтой болно. Үүний тулд View цэсний Server Explorer-oo нээгээд Data Connection хэсэг дээр Add Connection хийнэ. Гарах цонхонд data source хэсэгт Microsoft SQL Server, Server name хэсэгт компьютерийн нэрээ (localhost гэх мэт), сүүлийн хэсэгт өгөгдлийн сангаа сонгож өгнө. Өгегдлийн санг холбосны дараа Server Explorer (Зураг 10.4) цонхонд өгөгдлийн сан харагдах болно. Ингээд объектуудыг засах, харах боломжтой болно. Ингэж холбохоос гадна кодонд бичиж холболт хийж болдог. // SQL-тэй холбогдох SqlConnection en = new SqlConnection(); en .ConnectionString ="и1с1=Хэрэглэгчийн H3p;pwd=HyyLt үг; Initial Са1а1од=Өгөгдлийн сангийн нэр; Data Зоигсе=Холбогдох компьютер"; en.Open(); 2
  • 75. VCP413 Лекцийн материал // SQL-ийн script үүсгэх string strSQL = "Select * From table ner"; SqlCommand myCommand = new SqlCommand(strSQL, en); Энд гарсан Connection, Open, Command-ын талаар бүлгийн эхэнд үзсэн билээ. Харин ConnectionString бол өгөгдлийн сантай холбогдох data provider-ийн H3p(=SQL байна), data source (^localhost), холбогдох хэрэглэгч (=sa), нууц үг, Initial Catalog зэргийг заадаг чухал үүрэгтэй элемент болно. 3. Access өгөгдлийн сантай холбогдох За одоо Му DocumentsCars.mdb нэртэй access өгөгдлийн сантай холбогдон хэрэглэгч нэмдэг, засдаг, устгадагжишээ програм хийе. Өмнөх 9-р бүлгийн MDI, MDI child формтой жишээн дээрээ нэмж Emp формыг үүсгэе. Emp форм дээрээ binding-Navigator, TextBox гурвыг, Label гурвыг, DataGrid контролуудыг доорх байдлаар авч тавина. Зураг 10.5 Хэрэглэгчдийн бүртгэлийн форм Дараа нь dataGridViewl контролын DataSource properties дээр очоод Add Project Data Source товчийг дарна. Зураг 10.6 Data Source нэмэх Шинээр гарч ирэх DataSource Configuration wizard цонхноос DataBase сонголтыг сонгоод Next товчийг дарна. Мән дараагийн гарч ирэх цонхноос NewConnection товчийг дарахад доорх цонх гарч ирнэ. 3
  • 76. VCP413 Лекцийн материал Зураг 10.7Add Connection цонх Гарах цонхны Data source хэсэгт access файлын замыг зааж өгөөд Test Connec tion товчийг дараарай. Access файлаа хэрэглэж байгаа тохиолдолд алдаа заадаг. Хэрвээ өер егөгдлийн сантай холбогдох тохиолдолд Change товчийг даржөөрчлөнө. Ингээд цааш ОК товчийгдараад дахин Next товчийг дарахад доорх цонх гарч ирнэ. Зураг 10.8 DataSet нэмэх Дээрх цонхоос Finish сонголтыг хийгээд шинээр dataset нэмэгдэх болно. DataSet нэмэгдсэн тохиолдолд доорх гурван контролууд үүснэ. 4