SlideShare a Scribd company logo
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
VCP413                                                       Лекцийн материал

       болно. Хэрэв хэрэглэгчийн код классын бүтцээс хамаардаг бол классын
       өөрчлөлт хэрэглэгчээс хамааралтай кодын ажиллагааг эвдэж болно.
     Классын нээлттэй хэсэг дэх өөрчлөлт хийхэд өмнөх хэсгүүдийг зайлшгүй
       анхаарах хэрэгтэй. Хэрэглэгчдэд нээлттэй хэсэг их байх тусам хэрэглэгчийн
       кодыг өөрчлөлгүйгээр тухайн классын кодыг өөрчлөхөд хүндрэлтэй болҗ
       ирнэ.
        Класст нээлттэй хэсэг их байх тусам олон хэсгийг хянах шаардлагатай
            болдог учраас програмыг хүндрүүлдэг.
Жишээ нь:
private string fullname;
public Employee() { }

4.5. Удамшил (Inheritance)
Удамшил бол ОХП-ын суурь ойлголтуудын нэг юм. Шинэ классыг эхнээс нь
зохиохын оронд өмнө бичигдсэн классыг ашиглан дээр нь хэрэгтэй нэмэлтүүдийг
хийнэ. Тодорхойлогдсон байгаа класс дээр үндэслээд шинэ класс үүсгэх
боломжийг олгодог. Хуучин класс нь "эцэг класс", түүний үр дүнд үүссэн шинэ
классыг "удамшсан" буюу "хүү класс" гэж нэрлэдэг. Удамших байдлаас хамаарч:
*    Энгийн удамшил
*    Нийлмэл удамшил гэж байдаг
Онолын хувьд удамшил нь гол ойлголт тул практикт өргөн хэрэглэгддэг ч:
       Бодит зүйлүүдийн харьцааг ашигладаг. Жишээ нь: "амьтан", "муур"
         классууд байвал муур нь амьтан учираас "муур" класс "амьтан" классаас
         удамшиж болно. Эцэг класс нь илүү ерөнхий шинж чанартай байх ѐстой,
         харин хүү класс нь өргөтгөсөн, нарийн шинж чанарыг агуулах ѐстой.
         Тэгвэл "муур” классын хувьд "тэжээгдэх" гэсэн шинж нэмэгдэж болох
         байна. Гэвч энэ нь оновчтой шийдэл биш ба иймэрхүү жишээ тэр бүр
         элбэг биш.
       Эцэг класс нь удамшлыг тооцож үзсэний үндсэн дээр бичигдэх ѐстой.
         Энэ нь хэд хэдэн учир шалтгаантай. Хэрэв объект нь тохиромжгүй
         бүтэцтэй бол ажиллагаа муу байх нь ойлгомжтой. Мөн эцэг класс нь хүү
         классуудын бүх ерөнхий шинжийг агуулдаг учраас классуудын
         өөрчлөлтийг харж үзэх хэрэгтэй болдог. Үгүй бол, эцэг класс ямар нэг
         байдлаар өөрчлөгдөвөл удамшсан классууд "эвдэрч" болзошгүй.
Програмын бүтцийг сайжруулах, ажиллагааг хурдасгах үед л удамшлыг хэрэглэх
хэрэгтэй. .NЕТ-ийн орчинд бүх объектууд классаас удамшдаг ба зөвхөн нэг
                           классаас     л    удамшихыг    зөвшөөрнө.     Ингэж
                           хязгаарласнаар зарим нэгэн асуудал гардаг ч
                           програмыг энгийн болгож өгдөг. Гэхдээ .NЕТ-ийн
                           орчинд интерфейс ашиглаж олон удамшиж болно.
                           Энэ зурагт 6 өнцөгт дүрс геометрийн хэлбэр
                           болохынхоо хувьд Shaре классаас, Shаре класс нь
                           С#-ын объектоос удамшиж байгааг харуулав.
                           Зураг 4в Удамшил

                           Жишээ:

                                       4
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
VCP413                                      Лекцийн материал



         Зураг 2. Windows Forms Application үүсгэх алхам 2


         5. Ингээд F5 дараад програмаа ажиллуул.
         6. Button- дээрээ дарахад дараахь байдлаар message
         box гарч ирнэ.




                    2
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
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
VCP413       Лекцийн материал




         3
VCP413       Лекцийн материал




         4
VCP413       Лекцийн материал




         5
VCP413       Лекцийн материал




         6
VCP413       Лекцийн материал




         7
VCP413       Лекцийн материал




         8
VCP413       Лекцийн материал




         9
VCP413        Лекцийн материал




         10
VCP413        Лекцийн материал




         11
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
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
VCP413       Лекцийн материал




         3
VCP413       Лекцийн материал




         4
VCP413       Лекцийн материал




         5
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
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
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
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
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
VCP413                                                       Лекцийн материал



тодорхойлохдоо                  товчин дээр дарах ба классын гишүүн функцын
тодорхойлолтыг доор үзүүлсэнтэй ижлээр харуулна




Харлуулсан хэсэгт хэрэглэгч хийх үйлдлээ тодорхойлно.
Edit Box control
Энэхүү control-оо классын гишүүн өгөгдэлтэй холбон класстай өгөгдөл солилцоно.
Үүний тулд ClassWizardруугаа орон Member Variables tab-ыг сонгоод control-

ынхоо ID сонгон                  товчин дээр даран гарч ирэх цонхонд гишүүн
өгөгдлийн нэр, бүлэг, төрөл зэргийг тохируулан үүсгэх ба үүссэн гишүүн
өгөгдлийг Class View-ээс харж болно.




Дараа     нь control-оос   утга   авах   эсвэл control руу  утга    дамуулахаас
хамааран UpdateData гэх CWnd классын гишүүн функцыг ашиглах ба энэ функц
нь dialog-ийг үүсгэхдээ өгөгдлийг тодорхойлох эсвэл dialog-оос утга буцааж авах
тохиолдолд хэрэглэнэ. Энэхүү функц нь гаднаас нэг фараметр авах ба control-оос
утга дамжуулах бол “true” эсрэгээр утга авах бол “false” гэсэн фараметрыг
дамжуулна.




                                      6
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
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
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
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
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
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
VCP413                                                     Лекцийн материал




                                         Зураг 10.7Add Connection цонх

                                         Гарах цонхны Data source хэсэгт
                                         access файлын замыг зааж өгөөд
                                         Test Connec tion товчийг дараарай.
                                         Access файлаа хэрэглэж байгаа
                                         тохиолдолд алдаа заадаг. Хэрвээ
                                         өер егөгдлийн сантай холбогдох
                                         тохиолдолд      Change      товчийг
                                         даржөөрчлөнө. Ингээд цааш ОК
                                         товчийгдараад дахин Next товчийг
                                         дарахад доорх цонх гарч ирнэ.




Зураг 10.8 DataSet нэмэх
Дээрх цонхоос Finish сонголтыг хийгээд
шинээр dataset нэмэгдэх болно. DataSet
нэмэгдсэн тохиолдолд доорх гурван
контролууд үүснэ.




                                   4

More Related Content

PPTX
PPTX
Лекц 1
PDF
C# hicheelin lekts
PDF
Sedev 1
PDF
Java programchlal s.uuganbayr
PPTX
PL Lecture3
PPT
CS203 Лекц02 Oop
Лекц 1
C# hicheelin lekts
Sedev 1
Java programchlal s.uuganbayr
PL Lecture3
CS203 Лекц02 Oop

What's hot (20)

DOC
Gosexem asuult 09
PPS
Sw203 Lecture6 Inheritance
PPTX
Java лекц1
PPT
CS203 Лекц01 Prefeace
PPS
Sw203 Lecture9 Encapsulation
PPS
Sw203 Lecture3 Advanced Java Program
PPT
Lecture1
PPTX
Лекц 6 - 7
PPTX
Java lecture2
PPTX
PL Lecture1
PPTX
Pl lecture3
PPS
Sw203 Lecture4 Class Object
PPS
Sw203 Lecture8 Interface
PPTX
Pl lecture1
PPTX
Java lecture4
PPT
Lecture2
PPTX
PL Lecture2
PPTX
Java lecture5
Gosexem asuult 09
Sw203 Lecture6 Inheritance
Java лекц1
CS203 Лекц01 Prefeace
Sw203 Lecture9 Encapsulation
Sw203 Lecture3 Advanced Java Program
Lecture1
Лекц 6 - 7
Java lecture2
PL Lecture1
Pl lecture3
Sw203 Lecture4 Class Object
Sw203 Lecture8 Interface
Pl lecture1
Java lecture4
Lecture2
PL Lecture2
Java lecture5
Ad

Viewers also liked (20)

PDF
Android гэж юу вэ
PDF
C cons
PPSX
бодлого C++
PPTX
Lecture tread
POTX
Lecture3
PDF
Vizual programchilal cu lekts
PPTX
Кириллин Иван (МойСклад): Секреты работы с клиентской базой
DOCX
.NET Development
PDF
Lecture15
PPTX
datatable ,dataset,datagridview in C#
PPTX
Разработка, тестирование и развертывание баз данных в Visual Studio Team Syst...
PPSX
Разработка БД с использованием инструментов MS VS 2010
ODP
Entity framework
PPTX
Entity Framework Overview
PDF
анги тайлан
PDF
Lec3 c++operator
PPTX
Управление данными (распределенная обработка)
PPTX
Управление данными. Основы проектирования БД
PPTX
bonifacio m zamudio 123
PPTX
Power point tic
Android гэж юу вэ
C cons
бодлого C++
Lecture tread
Lecture3
Vizual programchilal cu lekts
Кириллин Иван (МойСклад): Секреты работы с клиентской базой
.NET Development
Lecture15
datatable ,dataset,datagridview in C#
Разработка, тестирование и развертывание баз данных в Visual Studio Team Syst...
Разработка БД с использованием инструментов MS VS 2010
Entity framework
Entity Framework Overview
анги тайлан
Lec3 c++operator
Управление данными (распределенная обработка)
Управление данными. Основы проектирования БД
bonifacio m zamudio 123
Power point tic
Ad

Similar to Lecture vcp413 (20)

ODS
It glossary
PPTX
Лекц 3
PPTX
лекц-3
PPTX
visual programming lecture 2
PPTX
visual programming lecture 2
PPTX
visual programming lecture 2
PPT
203lec2
PPT
си хэлний ойлголт
DOC
PDF
DOCX
Lecture2
PPTX
C++ vndsen oilgolt хичээл 1
PPTX
2014 is101 lec7
DOCX
203lab1
PPTX
PDF
Lecture13,14
PDF
PDF
PDF
It glossary
Лекц 3
лекц-3
visual programming lecture 2
visual programming lecture 2
visual programming lecture 2
203lec2
си хэлний ойлголт
Lecture2
C++ vndsen oilgolt хичээл 1
2014 is101 lec7
203lab1
Lecture13,14

More from orgil (20)

DOCX
Bodlogo
DOCX
Its150 l3
DOCX
Its150 l2
DOCX
Its150 l1
DOCX
Bd
DOCX
Test
DOCX
Example excel2007
DOCX
Test7
DOCX
Test6
DOCX
Bodlogiin code
DOCX
Bodlogo
DOCX
Bodlogo
DOCX
Bodlogo
DOCX
Its150 l10powerpoint2007
DOCX
Its150 l10powerpoint2007
DOCX
Test5
DOCX
Test7
DOCX
Test7
DOCX
Test7
DOCX
Test7
Bodlogo
Its150 l3
Its150 l2
Its150 l1
Bd
Test
Example excel2007
Test7
Test6
Bodlogiin code
Bodlogo
Bodlogo
Bodlogo
Its150 l10powerpoint2007
Its150 l10powerpoint2007
Test5
Test7
Test7
Test7
Test7

Lecture vcp413

  • 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