Tải bản đầy đủ (.pdf) (125 trang)

giáo trình lập trình windows form nghề tin học ứng dụng cao đẳng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.94 MB, 125 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

ĂY BAN NHÂN DÂN THÀNH PHà Hâ CHÍ MINH

<b>TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GỊN </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

MĀC LĀC

<small>GIÁO TRÌNH MƠN HàC/MÔ ĐUN ... 6 </small>

<small>CH¯¡NG 1 TäNG QUAN VÀ .NET FRAMEWORK ... 7 </small>

<small>1.1Tång quan vÁ ki¿n trúc căa .NET Framework ... 7 </small>

<small>1.2Mơi tr°ßng thực thi ngơn ngă chung CLR (Common Language Runtime) ... 8 </small>

<small>1.2.1 Biên dßch mã lánh .NET ... 8 </small>

<small>1.2.2 Há tháng kiểu dă liáu chung CTS (Common Type System) ... 10 </small>

<small>1.2.3 Assemblies ... 10 </small>

<small>1.2.4 Private Assembly và Shared Assembly ... 13 </small>

<small>1.2.5 TiÁn biên dßch mßt Assembly ... 15 </small>

<small>1.2.6 Kiểm chąng mã lánh (Code Verification) ... 15 </small>

<small>CH¯¡NG 2 NGƠN NGĂ LÀP TRÌNH C# ... 16 </small>

<small>2.1Ch°¢ng trình đ¿u tiên ... 16 </small>

<small>2.2Bi¿n dă liáu ... 18 </small>

<small>2.2.1 Hằng dă liáu ... 19 </small>

<small>2.3Các kiểu dă liáu đßnh nghĩa sẵn căa C# ... 19 </small>

<small>2.3.1 Kiểu dă liáu giá trß đ°ÿc đßnh nghĩa sẵn ... 19 </small>

<small>2.3.2 Kißu dă liáu tham chi¿u đ°ÿc đßnh nghĩa sẵn ... 21 </small>

<small>2.3.2.1 Kiểu dă liáu object ... 21 </small>

<small>2.3.2.2 Kiểu dă liáu string ... 22 </small>

<small>2.4Lng điÁu khiển ch°¢ng trình ... 23 </small>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<small>2.6.2 TruyÁn tham sá cho ph°¢ng thąc ... 31 </small>

<small>2.7Dă liáu kiểu array ... 33 </small>

<small>2.7.2 Làm viác vái array ... 34 </small>

<small>2.7.3 Array nhiÁu chiÁu ... 34 </small>

<small>2.10.1 Khai báo sā dāng namespace ... 41 </small>

<small>2.10.2 Bí danh cho Namespace ... 42 </small>

<small>2.11 Bài thực hành ... 43 </small>

<small>CH¯¡NG 3: LÀP TRÌNH WINFORM ... 48 </small>

<small>3.1. Giái thiáu Visual Studio ... 48 </small>

<small>3.2. Các bÁng điÁu khiển và cāa så trong giao dián: ... 49 </small>

<small>CH¯¡NG 4. XĀ LÝ DĂ LIàU VàI ADO.NET ... 67 </small>

<small>4.1Ki¿n trúc tång quan căa ADO.NET ... 67 </small>

<small>4.2Tång quan vÁ các mơ hình xā lý dă liáu trong ADO.NET ... 69 </small>

<small>4.2.1 Mô hình K¿t nái ... 69 </small>

<small>4.2.2 Mơ hình ngắt k¿t nái ... 70 </small>

<small>4.3Làm viác vái mơ hình K¿t nái trong ADO.NET ... 72 </small>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<small>4.3.1.5 Thực thi Stored Procedure (thă tāc l°u tră sẵn) vái đái t°ÿng Command ... 78 </small>

<small>4.3.1.6 Sā dāng Parameter trong các Command (không phÁi Stored Procedures) ... 80 </small>

<small>4.3.2 Đái t°ÿng DataReader ... 80 </small>

<small>4.3.2.1 Truy xuất các dòng dă liáu vái DataReader ... 81 </small>

<small>4.3.2.2 Truy xuất giá trß căa column ... 81 </small>

<small>4.4.2 N¿p dă liáu vào DataSet ... 95 </small>

<small>4.4.2.1 Dùng DataReader để n¿p dă liáu vào DataSet ... 95 </small>

<small>4.4.2.2 N¿p dă liáu vào DataSet bằng DataAdapter ... 96 </small>

<small>4.4.3 Bài thực hành... 97 </small>

<small>4.4.4 CÁp nhÁt CSDL bằng DataAdapter... 100 </small>

<small>4.4.4.1 CommandBuilder ... 100 </small>

<small>4.4.4.2 Đãng bß hóa dă liáu giăa DataSet và CSDL ... 101 </small>

<small>4.4.4.3 Sā dāng Transactions để Roll Back nhiÁu cÁp nhÁt ... 102 </small>

<small>4.4.4.4 Xác đßnh các dòng gây ra lỗi cÁp nhÁt ... 103 </small>

<small>4.4.5 Đßnh nghĩa Relationships giăa các Table trong DataSet ... 104 </small>

<small>4.5Sā dāng Data Binding ... 107 </small>

<small>4.5.1 Các lo¿i căa Binding ... 107 </small>

<small>4.5.2 Các nguãn dă liáu căa DataBinding ... 108 </small>

<small>4.5.4 Bài thực hành... 110 </small>

<small>4.6Lựa chán giăa mơ hình K¿t nái và mơ hình Ngắt k¿t nái ... 118 </small>

<small>TÀI LIàU THAM KHÀO ... 125 </small>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>GIÁO TRÌNH MƠN HàC/MƠ ĐUN</b>

<b>Tên mơn hác//mơ đun: LÁp Trình Windows Form </b>

<b>Mã sß môn hác//mô đun: MH19 </b>

<b>Thãi gian thực hián môn hác: 90 giß, (Lý thuy¿t: 30 giß; Thực hành: 58, thí nghiám, thÁo </b>

luÁn, bài tÁp: 0 giß; Kiểm tra: 2 giß)

<b>II. Māc tiêu mơn hác: </b>

- VÁn dāng đ°ÿc ki¿n thąc c¢ bÁn căa ngơn ngă C#

- Sā dāng thành th¿o các đái t°ÿng điÁu khiển để lÁp trình giao dián - T°¢ng tác đ°ÿc vái c¢ sá dă liáu

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>CH¯¡NG 1 TàNG QUAN VÀ .NET FRAMEWORK</b>

Māc tiêu:

- Tång quan vÁ ki¿n trúc căa .NET Framework - Mơi tr°ßng thực thi ngơn ngă chung CRT

<b>1.1 Táng quan vÁ ki¿n trúc cÿa .NET Framework</b>

.NET Framework đ°ÿc thi¿t k¿ nh° là mụi tròng tớch hp Ân giÁn hóa viác phát triển và thực thi các ąng dāng trên Internet, trên desktop d°ái d¿ng Windows Forms, hoặc thÁm chí là trên cÁ các thi¿t bß di đßng (vái Compact Framework). Các māc tiêu chính mà .NET framework h°áng đ¿n là:

- Cung cấp mßt mơi tr°ßng h°áng đái t°ÿng nhất qn cho nhiÁu lo¿i ąng dāng

- Cung cấp mßt mơi tr°ßng giÁm tái thiểu sự xung đßt phiên bÁn (<DLL Hell= – Đßa ngāc DLL) tÿng làm điêu đąng các lÁp trình viên Windows (COM), và đ¢n giÁn hóa q trình triển khai/cài đặt.

- Cung cấp mßt mơi tr°ßng linh đßng, dựa trên các chuÁn đã đ°ÿc chąng nhÁn để có thể chąa trên bất cą há điÁu hành nào. C# và mßt ph¿n chính căa mơi tr°ßng thực thi .NET, CLI (Common Language Infrastructure – H¿ t¿ng ngôn ngă chung) đã đ°ÿc chuÁn hóa bái ECMA.

- Để cung cấp mßt mơi tr°ßng qn lý đ°ÿc, trong đó mã đ°ÿc dß dàng xác thực để thực thi an toàn.

Ki¿n trúc căa .NET Framework đ°ÿc thi¿t k¿ thành 2 ph¿n: CLR (Common Language Runtime – Khái thąc thi ngôn ngă chung) và FCL (Framework Class Library – Th° vián láp khung) nh° hình d°ái

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<i>Hình 1.1 – Kiến trúc .NET Framework </i>

CLR, ph¿n cài đặt CLI căa Microsoft, làm nhiám vā quÁn lý sự thực thi mã lánh và tất cÁ các tác vā liên quan đ¿n nó: biên dßch, qn lý bß nhá, bÁo mÁt, quÁn lý tuy¿n đo¿n, và thực thi an toàn kiểu. Mã lánh thực thi trong CLR đ°ÿc gái là mã đ°ÿc quÁn lý (managed code), phân biát vái mã không đ°ÿc quÁn lý (unmanaged code), là mã lánh không cài đặt nhăng yêu c¿u để thực thi trong CLR – chẳng h¿n nh° COM hoặc các thành ph¿n dựa trên Windows API.

FCL là th° vián kiểu dă liáu có thể tái sā dāng (gãm các class, structure, &) dành cho các ąng dāng thực thi trong .NET. Tất cÁ các ngôn ngă hỗ trÿ .NET Framework đÁu sā dāng th° vián láp dùng chung này.

<b>1.2 Môi tr°ãng thực thi ngôn ngă chung CLR (Common Language Runtime)</b>

CLR (Common Languge Runtime – Mơi tr°ßng thực thi ngơn ngă chung) qn lý tồn bß vịng đßi căa mßt ąng dāng: nó n¿p các láp có liên quan, quÁn lý sự thực thi căa các láp, và đÁm bÁo qn lý bß nhá mßt cách tự đßng. Ngồi ra, CLR cịn hỗ trÿ tích hÿp giăa các ngơn ngă để cho phép mã lánh đ°ÿc sinh ra bái các ngơn ngă khác nhau có thể t°¢ng tác vái nhau mßt cách liÁn m¿ch.

<b>1.2.1 Biên dßch mã lánh .NET</b>

Trình biờn dòch tÂng thớch vỏi CLR s sinh mó thc thi cho mơi tr°ßng thực thi chą khơng phÁi là mã thực thi cho CPU cā thể. Mã thực thi này đ°ÿc bi¿t đ¿n qua tên gái CIL (Common Intermediate Language – Ngôn ngă trung gian chung), hay MSIL (Microsoft

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Intermediate Language – Ngôn ngă trung gian căa Microsoft); đó là ngơn ngă kiểu assembler đ°ÿc đóng gói trong các file EXE hoặc DLL. Các file này khơng phÁi thc d¿ng file có thể thực thi nh° thơng th°ßng, chúng c¿n trình biên dßch JIT (Just-in- Time) căa mơi tr°ßng thực thi để chuyển đái IL chąa trong nó sang d¿ng mã lánh cā thể căa máy khi ąng dāng thực sự thực thi.

Quá trình biờn dòch, thc thi mòt chÂng trỡnh trong .NET framework có thể tóm tắt nh° sau:

- Ch°¢ng trình ngn tr°ác h¿t sẽ đ°ÿc biên dßch và đóng gói thành mßt khái gái là assembly. Khái này sẽ chąa các mã lánh ngôn ngă trung gian và các metadata mơ tÁ thơng tin c¿n thi¿t cho sự ho¿t đßng căa khái.

- Mỗi khi có yêu c¿u thực thi assembly nói trên, CLR sẽ chuyển đái mã lánh ngơn ngă trung gian trong assembly thành mã lánh t°¢ng thích vái CPU cā thể tr°ác khi có thể thực thi.

<i>Hình 1.2 – Chāc năng cÿa CLR </i>

Nh° vÁy, lÁp trình viên có thể sā dāng bất cą ngơn ngă nào để phát triển ąng dāng trên .NET framework, mißn là ngơn ngă đó có hỗ trÿ .NET framework. ĐiÁu đặc biát là, do sā dāng chung há tháng kiểu dă liáu, nên tính năng liên thơng giăa các ngôn ngă trên .NET framework là rất cao.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>1.2.2 Há thßng kiểu dă liáu chung CTS (Common Type System)</b>

CTS cung cp mòt tp c sỏ cỏc kiểu dă liáu cho mỗi ngơn ngă ho¿t đßng trên .NET platform. Ngồi ra, nó đặc tÁ cách khai báo và t¿o các kiểu dă liáu tùy bi¿n, cách quÁn lý vịng đßi căa mßt thể hián căa nhăng kiểu dă liáu này. Hình d°ái đây mơ tÁ cách tå chąc CTS căa .NET

<i>Hình 1.3 – Các kiểu dữ liệu cơ sở cÿa CTS </i>

Mái kiểu dă liáu trong .NET đÁu đ°ÿc k¿ thÿa tÿ kiểu dă liáu System.Object. Các kiểu dă liáu đ°ÿc chia làm hai lo¿i: kiểu tham chi¿u và kiểu giá trß. Kiểu dă liáu tham chi¿u đ°ÿc xā lý trong mßt vùng nhá đặc biát gái là heap thơng qua các con trß. Kiểu dă liáu giá trß đ°ÿc tham chi¿u trực ti¿p trong stack căa ch°¢ng trình.

<b>1.2.3 Assemblies</b>

Tất cÁ các mã đ°ÿc quÁn lý thực thi trong .NET đÁu phÁi đ°ÿc chąa trong mßt assembly. Mßt assembly đ°ÿc xem nh° là mßt file EXE hoặc DLL. Mßt asembly có thể chąa mßt tÁp hÿp gãm mßt hay nhiÁu file chąa ph¿n mã lánh hoặc tài nguyên (nh° Ánh hoặc dă liáu XML).

Mßt assembly đ°ÿc t¿o ra khi trỡnh biờn dòch tÂng thớch vỏi .NET chuyn mòt file chąa mã nguãn thành mßt file DLL hoặc EXE. Nh° minh háa trong hình 1.4, mßt assembly chąa mßt manifest, metadata, và ngơn ngă trung gian sinh bái trình biên dßch cā thể.

Manifest: Mỗi assembly phÁi có mßt file chąa mßt manifest. Manifest này là mßt tÁp hÿp các bÁng chąa các metadata trong đó liát kê tên căa tất cÁ các file trong assembly, tham

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

chi¿u đ¿n các assembly bên ngoài, và các thơng tin nh° tên, phiên bÁn để đßnh danh assembly đó. Mßt sá assembly cịn có cÁ chă ký đián tā duy nhất (unique digital signature). Khi mßt assembly đ°ÿc n¿p, nhiám vā đ¿u tiên căa CLR là má file chąa manifest để có thể đßnh danh các thành viên có trong assembly.

Metadata: Ngồi các bÁng trong manifest vÿa đßnh nghĩa, trình biên dßch C# cịn sinh ra các bÁng đßnh nghĩa và bÁng tham chi¿u. BÁng đßnh nghĩa cung cấp mßt ghi chú đ¿y đă vÁ các kiểu chąa trong IL. Ví dā, có các bÁng đßnh nghĩa kiu, phÂng thc, tròng d liỏu, tham sỏ, v thuòc tính. BÁng tham chi¿u chąa các thơng tin vÁ tất cÁ các tham chi¿u vÁ kiểu và các assembly khác. Trình biên dßch JIT phā thc vào các bÁng này để chuyển IL sang mã máy.

IL: Vai trò căa IL đã đ°ÿc đÁ cÁp tr°ác đây. Tr°ác khi CLS có thể sā dāng IL, nó phÁi đ°ÿc đóng gói vào trong mßt assembly d¿ng DLL hoặc EXE. Assembly d¿ng EXE phÁi có mßt điểm nhÁp (entry point) để nó có thể thực thi. Ng°ÿc l¿i, Assembly d¿ng DLL, đ°ÿc thi¿t k¿ để ho¿t đßng nh° là mßt th° vián mã lánh nắm giă các đßnh nghĩa kiểu.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

thành các assembly dựa theo mąc đß th°ßng xuyên sā dāng.

- Trong th¿ giái .NET, mßt assembly quy đßnh mßt biên giái phiên bÁn. Tr°ßng Version Number trong manifest áp dāng cho tất cÁ các kiểu và tài nguyên trong assembly. Vì vÁy, mái file t¿o nờn assembly c xem nh l mòt Ân vò Ân nhất có cùng phiên bÁn.

- Mßt assembly cũng thi¿t lÁp mßt biên giái bÁo mÁt để đßnh ra quyÁn h¿n truy xuất. C# sā dāng các bå tÿ truy cÁp để điÁu khiển cách mà các kiểu và thành ph¿n kiểu trong mßt assembly đ°ÿc truy xuất. Hai trong sá này đ°ÿc sā dāng trong assembly, đó là public – cho phép truy xuất tùy ý tÿ assembly bất kỳ ; và internal – giái h¿n truy xuất đ¿n các kiểu và thành viên bên trong assembly.

Nh° đã đÁ cÁp á trên, mßt assembly có thể chąa nhiÁu file. Nhăng file này không giái h¿n là các module mã lánh mà có thể là các file tài ngun nh° file hình Ánh hoặc văn bÁn. Mßt cách sā dāng tính chất này trong thực t¿ đó là chúng ta có thể t¿o ra ąng dāng đa ngơn ngă, trong đó ąng dāng sẽ cùng sā dāng chung các module logic, ph¿n giao dián hoặc các tài nguyên khác có thể đ°ÿc triển khai riêng thành các file đßc lÁp. Khơng có giái h¿n vÁ sá l°ÿng file trong mßt assembly. Hình 1.5 minh háa bá cāc căa mßt assembly chąa nhiÁu file.

<i>Hình 1.5 - Assembly chāa nhiều file </i>

Trong minh háa assembly chąa nhiÁu file, manifest căa assembly chąa thơng tin để đßnh danh mái file đ°ÿc sā dāng trong assembly.

Mặc dù h¿u h¿t các assembly đÁu chąa mßt file duy nhất. Sau đây là các thuÁn lÿi căa

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

assembly chąa nhiÁu file:

- Có thể tå hÿp các module đ°ÿc t¿o ra tÿ nhiÁu ngơn ngă lÁp trình khác nhau.

- Các module mã lánh có thể đ°ÿc phân ra để tái °u cách mà mã lánh đ°ÿc n¿p vào trong CLR. Các mã lánh có liên quan và đ°ÿc sā dāng th°ßng xuyên nên đ°ÿc đặt vào trong cùng mßt module; nhăng mã lánh ít khi đ°ÿc sā dāng sẽ đ°ÿc đặt vào trong module khác. CLR không n¿p các module nào khi ch°a thực sự c¿n thi¿t. Các file tài nguyên có thể đ°ÿc đặt vào trong module căa riêng nó, qua đó cho phép nhiÁu ąng dāng có thể chia sẻ tài nguyên dùng chung.

<b>1.2.4 Private Assembly và Shared Assembly</b>

Các assembly có thể đ°ÿc triển khai theo hai d¿ng: private assembly và global assembly.

Private assembly là assembly đ°ÿc đặt trong th° māc căa ąng dāng hoặc th° māc con căa nó. Q trình cài đặt và cÁp nhÁt private assembly chỉ đ¢n giÁn là chép assembly vào trong th° māc c¿n thi¿t, không c¿n thi¿t lÁp thông tin trong registry. Đơi khi, có thể dùng thêm mßt file cấu hình ąng dāng có thể ghi đè mßt sá thi¿t lÁp trong manifest căa ąng dāng.

Shared assembly là assembly đ°ÿc cài đặt vào vß trí tồn cāc, gái là Global Assembly Cache (GAC), là n¢i có thể truy xuất đ°ÿc tÿ nhiÁu ąng dāng. Điểm quan tráng nhất căa GAC đó là nó cho phép nhiÁu phiên bÁn căa mßt assembly có thể đ°ÿc thực thi. Để hỗ trÿ điÁu này, .NET khắc phāc vấn đÁ xung đßt tên bằng cách sā dāng 4 thc tính để đßnh danh 1 assembly, bao gãm: Assembly Name (tên assembly), Culture Identity (đßnh danh văn hóa), Version (phiên bÁn), và Public Key Token (dấu hiáu mã khóa cơng khai).

Các shared assembly th°ßng đ°ÿc đặt trong th° māc assembly á d°ái th° māc há tháng căa há điÁu hành (WINNT\ trong Windows 2000, WINDOWS\ trong Windows XP). Nh° mô tÁ á hình 1.6, các assembly đ°ÿc liát kê theo đßnh d¿ng đặc biát để hiển thß 4 thc tính căa chúng (.NET Framework bao gãm mßt file DLL để má rßng Windows Explorer cho phép nó có thể hiển thß nßi dung GAC).

- Assembly Name: còn đ°ÿc gái là tên th°ßng gái, là tên file căa assembly khơng chąa ph¿n má rßng.

- Version: Mỗi assembly có mßt sá hiáu phiên bÁn để dùng cho tất cÁ các file trong

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

assembly. Nó chąa 4 sá theo đßnh d¿ng:

<small><major.number>.<minor number>.<build>.<revision> </small>

Thơng th°ßng các sá <major number> và <minor number> đ°ÿc cÁp nhÁt cho nhăng l¿n thay đåi mang tính phá vỡ tính t°¢ng thích ng°ÿc. Mßt sá hiáu phiên bÁn có thể đ°ÿc gán cho mßt assembly bằng cách đính thc tính AssemblyVersion trong ph¿n mã nguãn căa assembly.

- Culture Setting: Nßi dung căa mßt assembly có thể đ°ÿc k¿t hÿp vái mßt văn hóa hay ngơn ngă cā thể. Thi¿t lÁp này đ°ÿc chỉ đßnh bằng mã hai ký tự kiểu nh° <en= cho English, <vi= cho Vietnam, và có thể đ°ÿc gán vái thc tính AssemblyCulture đặt trong mã nguãn căa assembly

<small>[assembly: AssemblyCulture ("fr-CA")]</small>

- Public Key Token: Để đÁm bÁo mßt shared assembly là duy nhất và đáng tin cÁy, .NET yêu c¿u ng°ßi t¿o ra assembly phÁi đánh dấu bằng mßt đßnh danh m¿nh. Quá trình này đ°ÿc gái là ký, yêu c¿u sā dāng cặp khóa cơng khai/riêng t°. Khi trình biên dßch xây dựng assembly, nó sẽ sā dāng khóa riêng t° để sinh ra mßt đßnh danh m¿nh. Token đ°ÿc sinh ra á đây là 8 byte cuái cùng căa phép băm (hashing) khóa cơng khai. Token này sẽ đ°ÿc đặt trong manifest căa bất kỳ assembly client nào có tham chi¿u đ¿n shared assembly và sā dāng nó để đßnh danh assembly trong q trình thực thi.

Mßt assembly đ°ÿc gán mßt cặp khóa cơng khai/riêng thì đ°ÿc gái là mßt assembly đßnh danh m¿nh. Mái assembly đÁu phÁi có đßnh danh m¿nh.

<i>Hình 1.6 – Thư mục Global Assembly </i>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>1.2.5 TiÁn biên dßch mßt Assembly</b>

Sau khi mßt assembly đ°ÿc n¿p vào CLR, IL phÁi đ°ÿc biên dßch sang thành mã máy tr°ác khi thực sự đ°ÿc thực thi. .NET Framework có cung cÁp mßt cơng cā gái là Ngen (Native Image Generator), dùng để biên dßch mßt assembly thành mßt <native image= đ°ÿc l°u trong native image cache – mßt vùng dành riêng căa GAC. Mỗi khi CLR n¿p mßt assembly, nó sẽ kiểm tra trong cache xem đã có native image t°¢ng ąng ch°a; n¿u có nó sẽ n¿p mã đã biên dßch đó chą khơng c¿n biên dßch thêm l¿n năa. Đây là tính năng mà n¿u đ°ÿc khai thác hÿp lý thì có thể tÁn dāng để cÁi thián hiáu năng

<b>1.2.6 Kiểm chāng mã lánh (Code Verification)</b>

Nh° là mßt ph¿n căa q trình biên dßch JIT, CLR thực hián hai lo¿i kiểm chąng: kiểm chąng IL và hÿp lá hóa metadata để bÁo đÁm mã lánh đ°ÿc an toàn kiểu. Trong thực t¿, điÁu này có nghĩa là các tham sá trong lòi gỏi v phÂng thc c gỏi phi c kiểm tra để đÁm bÁo chúng có cùng kiểu dă liỏu, hoc l mòt phÂng thc ch tr v ỳng kiểu đ°ÿc đặc tÁ trong khai báo trÁ vÁ. Nói ngắn gán, CLR sẽ xem xét trong IL và metadata để đÁm bÁo mái giá trß đ°ÿc gán cho mßt bin l tÂng thớch kiu; nu khụng s cú mòt ngo¿i lá xuất hián.

ThuÁn lÿi căa mã lánh đ°ÿc kiểm chąng đó là CLR có thể chắc chắn mã lánh sẽ không Ánh h°áng đ¿n ąng dāng khác theo kiểu truy xuất đ¿n vùng nhá ngoài vùng cho phép căa nó. Do đó CLR tự do thực thi nhiÁu ąng dāng trong cùng mßt ti¿n trình hay khơng gian đßa chỉ.

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

1. Khái đßng Microsoft Visual Studio. Nhấn Ctrl + Shift + N hoặc chán menu t°¢ng ąng là File  New  Project để t¿o mái mßt project

<i>Hình 2.1 – Giao diện tạo Project mới. </i>

2. Chán lo¿i ąng dāng c¿n phát triển là Visual C#  Windows  Console Application. Sau đó, chán th° māc chąa project và đặt tên cho project nh° minh háa á hình trên. Chú ý, á đây, chúng ta bß chán á hßp kiểm <Create directory for solution=.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Visual Studio .NET coi mßt <bài tốn= c¿n giÁi quy¿t là mßt solution. Mßt solution có thể bao gãm mßt hoặc nhiÁu project. Mßt solution, n¿u có nhiÁu project thì nên đ°ÿc t¿o ra trong mßt th° māc riêng để có thể chąa các project trong nó. à đây, solution chỉ có duy nhất mßt project, th¿ nên khơng c¿n thi¿t phÁi t¿o ra mßt th° māc cho solution.

3. Sau khi nhấn nút OK, hãy khÁo sát xem cấu trúc căa th° māc chąa solution căa chúng ta.

<i>Hình 2.2 – Thư mục chāa āng dụng. </i>

4. Gõ mã lánh nh° minh háa vào trong ph¿n mã nguãn căa tÁp tin Program.cs

<i>Hình 2.3 – Giao diện nhập code </i>

5. Chúng ta có thể sā dāng MSDN để tra cąu các thông tin ch°a bi¿t vÁ:

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

a. Láp Console và các ph°¢ng thąc ReadLine(), WriteLine() căa nó b. Cách chuyển đåi kiểu chuỗi thành sá, ví dā nh° int.Parse()

6. Nhấn Ctrl + F5 để thực hián biên dßch và ch¿y ch°¢ng trình. Sau đó quan sát cấu trúc th° māc căa solution, cho bi¿t sự thay đåi căa nó so vái khi mái đ°ÿc t¿o ra á b°ác 3 (xem th° māc bin và th° māc obj căa project). 7. Thā thay đåi k¿t câu lánh

<small>float thuong = (float)n1 / n2; </small>

thành

<small>float thuong = n1 / n2; </small>

sau đó ch¿y ch°¢ng trình, quan sát k¿t quÁ và rút ra k¿t luÁn.

8. Sā dāng thêm các cấu trúc lánh khác để tinh chỉnh ho¿t òng ca chÂng trỡnh (x lý phộp chia cho 0, &)

<b>2.2 Bi¿n dă liáu</b>

Bi¿n trong C# đ°ÿc khai báo theo cú pháp nh° sau: <small>datatype identifier; </small>

Ví dā: <small>int i; </small>

Câu lánh này khai báo mßt sá int tên là i. Trình biên dßch thực sự ch°a cho phép sā dāng bi¿n này cho đ¿n khi chúng ta khái t¿o nó bằng mßt giá trß. Lánh khai báo này chỉ làm nhiám vā cấp phát mßt vùng nhá (4 bytes) cho bi¿n i.

Sau khi khai báo, chúng ta có thể gán mßt giá trß cho bi¿n bằng tốn tā gán =, nh° sau:

<small>i = 10; </small>

Chúng ta cũng có thể vÿa khai báo, vÿa khái t¿o giá trß cho bi¿n cùng lúc:

 <b>Tầm ho¿t đßng cÿa bi¿n</b>

T¿m ho¿t đßng căa mßt bi¿n là vùng mã lánh mà trong đó bi¿n có thể truy xuất. Nói chung, t¿m ho¿t đßng căa bi¿n đ°ÿc xác đßnh theo các quy tắc sau:

<small>int i = 10; // khai bao va khoi tao gia tri cho bien int </small>

<small>double x = 10.25, y = 20; // khai bao va khoi tao hai bien double </small>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

 Mßt tr°ßng dă liáu (field), cịn đ°ÿc gái là mßt bi¿n thành ph¿n căa mßt láp đái t°ÿng sẽ có t¿m ho¿t đßng trong ph¿m vi láp chąa nó.

 Mßt bi¿n cāc bß sẽ có t¿m ho¿t đßng trong khái khai báo nó (trong cặp dấu ngoặc nhán { })

 Mßt bi¿n cāc bß đ°ÿc khai báo trong các lánh lặp for, while, & sẽ có t¿m ho¿t đßng trong thân vòng lặp.

 Trong cùng ph¿m vi ho¿t đßng, khơng đ°ÿc có hai bi¿n có trùng tên.

<b>2.2.1 H¿ng dă liáu</b>

Hằng dă liáu là bi¿n có giá trß khơng đ°ÿc phép thay đåi trong st thßi gian tãn t¿i căa nó. Cách khai báo căa hằng dă liáu là t°¢ng tự nh° đái vái bi¿n dă liáu, chỉ khác là đ°ÿc thêm tÿ khóa const á đ¿u.

<small>const int a = 100; // Gia tri nay khong duoc thay doi </small>Hằng dă liáu có các đặc tính sau:

PhÁi đ°ÿc khái t¿o ngay khi nó đ°ÿc khai báo, sau đó khơng đ°ÿc phép thay đåi giá trß căa hằng.

 Giá trß căa hằng dă liáu phÁi đ°ÿc tính tốn trong thßi điểm biên dßch. Vì vÁy, chúng ta khơng thể khái t¿o mßt hằng sá có giá trß đ°ÿc lấy tÿ mßt bi¿n dă liáu. N¿u c¿n điÁu này, chúng ta sā dāng tr°ßng dă liáu kiểu read-only.

<b>2.3 Các kiểu dă liáu đßnh nghĩa sẵn cÿa C#</b>

C# phân kiểu dă liáu thành hai lo¿i (t°¢ng tự nh° cách phân lo¿i chung trong CTS): kiểu dă liáu giá trß và kiểu dă liáu tham chi¿u. VÁ mặt khái niám, điểm khác biát giăa hai kiểu dă liáu này đó là, bi¿n kiểu dă liáu giá trß l°u giă trực ti¿p mßt giá trß, trong khi đó, bi¿n kiểu tham chi¿u l°u giă tham chi¿u đ¿n mßt giá trß dă liáu. VÁ mặt l°u tră vÁt lý, bi¿n căa hai kiểu dă liáu này đ°ÿc l°u vào hai vùng nhá khác nhau căa ch°¢ng trình, đó là vùng nhá stack (cho bi¿n dă liáu kiểu giá trß) và vùng nhá heap (cho bi¿n dă liáu kiểu tham chi¿u). C¿n đặc biát l°u ý hiáu ąng căa các phép gán đái vái kiểu dă liáu kiểu tham chi¿u.

<b>2.3.1 Kiểu dă liáu giá trß đ°ÿc đßnh nghĩa sẵn</b>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Các kiểu dă liáu giá trß đ°ÿc đßnh nghĩa sẵn bao gãm sá nguyên, sá dấu chấm phÁy đßng, ký tự và boolean.

tÿ -32,768 đ¿n 32,767 ushort 2 System.Uint16 Sá ngun khơng dấu có giá trß

tÿ 0 đ¿n 65,535 int 4 System.Int32 Sá ngun có dấu có giá trß

tÿ -2,147,483,647 đ¿n 2,147,483,647 uint 4 System.Uint32 Sá nguyên không dấu có giá trß

tÿ 0 đ¿n 4,294,967,295 long 8 System.Int64 Sá nguyên có dấu có giá trß

tÿ -9,223,370,036,854,775,808 đ¿n 9,223,370,036,854,775,807 ulong 8 System.Uint64 Sá ngun khơng dấu có giá trß

tÿ 0 đ¿n 18,446,744,073,709,551,615

<i><b>2.3.1.2 Các kiểu số dấu chấm động</b></i>

Các kiểu sá thực dấu chấm đßng đ°ÿc hỗ trÿ sẵn căa C# bao gãm:

<small>Tên Kiểu trong CTS Sá chă sá cú ngha Vựng biu diòn tÂng ỏi (khong) float </small> <b><small>System.Single 7 ±1.5 × 10-45 to ±3.4 × 1038 </small></b>

<small>double </small> <b><small>System.Double 15/16 ±5.0 × 10-324 to ±1.7 × 10308 </small></b>

<i><b>2.3.1.3 Kiểu số thập phân</b></i>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Để biểu dißn sá thÁp phân vái đß chính xác cao hÂn sỏ thc du chm òng, C# h tr kiu dă liáu sá thÁp phân:

<small>Tên Kiểu trong CTS Sá chă sá có nghĩa Vùng biểu dißn </small>

<small>decimal </small> <b><small>System.Decimal 28 ±1.0 × 10-28 to ±7.9 × 1028</small></b>

<i><b>2.3.1.3 Kiểu boolean</b></i>

T°¢ng ąng vái System.Boolean trong CTS, C# có kiểu dă liáu bool, có thể nhÁn mßt trong hai giá trß true hoặc false. Có mßt điÁu l°u ý, kiểu dă liáu bool khơng đ°ÿc nhÁn các giá trß ngun nh° mßt sá ngơn ngă (C, C++).

<i><b>2.3.1.4 Kiểu ký tự</b></i>

Để lu tr giỏ trò ca mòt ký t Ân, C# hỗ trÿ dă liáu kiểu ký tự.

Các hằng kiểu ký tự đ°ÿc gán bằng cách đóng trong cặp dấu nhỏy Ân, vớ d 'A'. Cng cú th biu thò hằng ký tự d°ái d¿ng sá thÁp lāc phân, kiểu nh° 8\u00419, hoặc ép kiểu nh° (char)65. Ngồi ra có thể sā dāng mßt sá ký tự escape: \9, \\, \0, \a, \b, \n, \t.

<b>2.3.2 Kißu dă liáu tham chi¿u đ°ÿc đßnh nghĩa sẵn</b>

C# hỗ trÿ sẵn hai kiểu dă liáu tham chi¿u:

<small>tÿ đây (kể cÁ các kiểu dă liáu giá trß) </small>

<i><b>2.3.2.1 Kiểu dữ liệu object</b></i>

object là kiểu dă liáu gác, c¢ bÁn nhất mà tÿ đó, tất cÁ các kiểu dă liáu khác đÁu phÁi k¿ thÿa (trực ti¿p hoặc gián ti¿p). Các thuÁn lÿi chúng ta có đ°ÿc tÿ kiểu dă liáu object là:

- Chúng ta có thể sā dāng tham chi¿u đái t°ÿng để gắn k¿t vái mßt đái t°ÿng căa bất kỳ kiểu dă liáu con nào. Tham chi¿u đái t°ÿng cũng đ°ÿc sā dāng trong nhăng tr°ßng hÿp mà mã lánh phÁi truy xuất đ¿n nhăng đái t°ÿng ch°a rõ kiu d liỏu (tÂng t nh vai trũ con trò void á C++)

- Kiểu object có cài đặt mòt sỏ phÂng thc c bn, dựng chung, bao góm: Equals(),

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

GetHashCode(). GetType(), và ToString(). Các láp do ng°ßi sā dāng tự đßnh nghĩa có thể cài đặt l¿i các ph°¢ng thąc này theo kỹ thuÁt gái là overriding (ghi đè) trong lÁp trình h°áng đái t°ÿng.

<i><b>2.3.2.2 Kiểu dữ liệu string</b></i>

Kiểu dă liáu string đ°ÿc cung cấp sẵn trong C# vái nhiÁu phép toán và cách thąc ho¿t đßng thuÁn tián là mßt trong nhăng kiểu dă liáu đ°ÿc sā dāng nhiÁu nhất khi lÁp trình. Đái t°ÿng string đ°ÿc cấp phát trong vùng nhá heap, và khi gán mßt bi¿n string cho mßt bi¿n khác, chúng ta sẽ có hai tham chi¿u đ¿n cùng mßt chuỗi trong bß nhá. Tuy nhiên, khi thay đåi nßi dung căa mßt trong các chuỗi này, chuỗi thay đåi sẽ đ°ÿc t¿o mái hồn tồn, khơng Ánh h°áng đ¿n các chuỗi khác. Hãy xem hiáu ąng này trong đo¿n ch°¢ng trình d°ái đây:

<small>using System; class NSGString { </small>

<small>public static int Main() { </small>

<small>string s1 = "a string"; string s2 = s1; Console.WriteLine("s1 is " + s1); </small>

<small>Console.WriteLine("s2 is " + s2); s1 = "another string"; </small>

<small>Console.WriteLine("s1 is now " + s1); Console.WriteLine("s2 is now " + s2); return 0; </small>

<small>} } </small>

K¿t q căa đo¿n ch°¢ng trình trên là: <small>s1 is a string </small>

<small>string filepath = "C:\\CSharp\\NSGString.cs"; </small>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

Có mßt giÁi pháp khác để biểu dißn ký tự \ trong chuỗi, đó là dùng cú pháp @: <small>string filepath = @"C:\CSharp\NSGString.cs";</small>

Cú pháp này còn cho phép chúng ta ngắt dòng trong hằng chuỗi, nh° sau: <small>string st = @"'Day la dong thu nhat </small>

<small> Day la dong thu hai."; </small>

Khi đó, giá trß căa chuỗi st sẽ là: <small>'Day la dong thu nhat </small>

<small>Day la dong thu hai. </small>

<b>2.4 Luòng iu khin chÂng trình2.4.1 Câu lánh điÁu kián</b>

Các câu lánh điÁu kián cho phép phân nhánh mã lánh theo các điÁu kián cā thể. C# có hai cấu trúc phân nhánh if và switch.

<i><b>2.4.1.1 Câu lệnh if</b></i>

Câu lánh if căa C# đ°ÿc k¿ thÿa tÿ cấu trúc if căa C và C++. Cỳ phỏp ca nú l:

Nu cú nhiu hÂn mòt cõu lỏnh c thc thi tÂng ng vỏi mòt trong hai giá trß căa biểu thąc logic condition, chúng ta có thể gßp các lánh này trong cặp dấu ngoặc nhán ({ ... }) (điÁu này cũng đ°ÿc áp dāng cho nhiÁu cấu trúc lánh khác mà chúng ta sẽ đÁ cÁp sau này):

ĐiÁu đáng l°u ý nhất khi sā dāng câu lánh if đó là condition nhất thi¿t phÁi là mßt biểu thąc logic (chą khơng thể là mßt sá nh° á C/C++).

<small>if (condition) statement1(s) [else </small>

<small>statement2(s)] </small>

<small>bool isZero; if (i == 0) { </small>

<small>isZero = true; </small>

<small>Console.WriteLine("i is Zero"); } </small>

<small>else { </small>

<small>isZero = false; </small>

<small>Console.WriteLine("i is Non-zero"); } </small>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

N¿u biểu thąc khơng ąng vái nhánh nào căa lánh switch thì điÁu khiển sẽ đ°ÿc chuyển đ¿n các câu lánh sau nhãn default (n¿u có). N¿u khơng có nhãn default, điÁu khiển đ°ÿc chuyển ra bên ngồi câu lánh switch.

Ví dā:

<small>switch (integerA) { </small>

<small>case 1: </small>

<small>Console.WriteLine("integerA =1"); break; case 2: </small>

<small>Console.WriteLine("integerA =2"); break; case 3: </small>

<small>Console.WriteLine("integerA =3"); break; default: </small>

<small>Console.WriteLine("integerA is not 1,2, or 3"); break; } </small>

<b>2.4.2 Câu lánh lặp</b>

<small>{ </small>

<small>case const_1: statement_1; break; </small>

<small>case const_2: statement_2; break; </small>

<small>... </small>

<small>case const_n: statement_n; break; </small>

<small>[default: </small>

<small>statement_n+1; break;] </small>

<small>} </small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

C# cung cấp bán lo¿i lánh lặp (for, while, do...while, và foreach) cho phép lÁp trình viên có thể thực thi mßt khái lánh liên ti¿p cho đ¿n khi mßt điÁu kián xác đßnh nào đó đ°ÿc thßa mãn.

 Condition: là biểu thąc kiểm tra tr°ác khi mỗi vòng lặp đ°ÿc thực thi.

 Iterator: biểu thąc đ°ÿc °ác l°ÿng sau mỗi vòng lặp (th°ßng dùng để tăng <bi¿n đ¿m=). Các vịng lặp sẽ k¿t thúc khi condition đ°ÿc °ác l°ÿng là false.

Ví dā d°ái đây in ra 100 sá tự nhiên đ¿u tiên (0, 1, 2, ..., 99), mỗi sá trên mßt dịng:

Chúng ta có thể sā dāng các vịng lặp for lãng nhau, nh° ví dā in ra tam giác hình sao d°ái đây.

<small>for (int i = 0; i < 5; i++) { </small>

<small>for (int j = 0; j <= i; j++) Console.Write(<*=); Console.WriteLine(i); }</small>

<small>while(condition) statements; </small>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

lánh, sẽ dÿng khi chuỗi nhÁp vào là <abc=:

Ví dā này sẽ in ra tất cÁ các ph¿n tā có trong tÁp hÿp arrayOfInts. Có mßt điÁu đáng l°u ý, chúng ta không đ°ÿc thay đåi giá trò ca bin phn t lp. Chng hn, on chÂng trình d°ái đây sẽ bß báo lỗi:

<small>string correctPwd = <abc=, st = <=; while (st != correctPwd) </small>

<small>{ </small>

<small>Console.Write(<Password = <); st = Console.ReadLine(); } </small>

<small>do { </small>

<small>statements; } </small>

<small>while(condition) </small>

<small>string correctPwd = <abc=, st; //để ý rằng st không cần khởi tạo là <= do { </small>

<small>Console.Write(<Password = <); st = Console.ReadLine(); } </small>

<small>while (st != correctPwd) </small>

<small>foreach (int temp in arrayOfInts) { </small>

<small>Console.WriteLine(temp); } </small>

<small>foreach (int temp in arrayOfInts) { </small>

<small>temp++; //không được thay đổi giá trị temp!!! Console.WriteLine(temp); </small>

<small>} </small>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

Ví dā sau đây là mßt phiên bÁn khác căa đo¿n lánh kiểm tra mÁt khÁu á trên:

<i><b>2.4.3.3 Câu lệnh continue</b></i>

Lánh continue cũng t°¢ng tự nh° câu lánh break, phÁi đ°ÿc sā dāng trong thân câu lánh for, foreach, while, hay do& while. Tuy nhiên, nó chỉ thốt tÿ l¿n lặp hián t¿i căa vòng lặp để bắt đ¿u l¿n lặp mái.

Ví dā, đo¿n ch°¢ng trình d°ái đây& <small>goto Label1; </small>

<small>Console.WriteLine("Dịng lệnh này sẽ không được thực hiện"); Label1: </small>

<small>Console.WriteLine("Continuing execution from here"); </small>

<small>string correctPwd = <abc=; while (true) </small>

<small>{ </small>

<small>Console.Write(<Password = <); string st = Console.ReadLine(); if (st == correctPwd) </small>

<small>break; } </small>

<small>for (int i = 0; i < 4; i++) { </small>

<small>Console.WriteLine(<---<); if (i%2 == 0) </small>

<small>continue; </small>

<small>Console.WriteLine(<i = {0}=, i); } </small>

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

sẽ in ra k¿t quÁ nh° th¿ này trong cāa så Console:

<i><b>2.4.3.4 Câu lệnh return</b></i>

Lánh return đ°ÿc sā dāng để thốt khßi phÂng thc ca mòt lỏp, tr iu khin trỏ v n¢i gái ph°¢ng thąc. Tùy theo kiểu dă liáu trÁ v ca phÂng thc l void hoc cú mòt kiu dă liáu cā thể, lánh return phÁi t°¢ng ąng khơng trÁ vÁ kiểu dă liáu gì, hoặc là trÁ vÁ mßt giá trß có kiểu dă liáu thích hÿp.

<b>2.5 Cấu trúc ch°¢ng trình</b>

Trong ph¿n đ¿u căa ch°¢ng này, chúng ta ó vit mòt chÂng trỡnh C# Ân gin u tiên. T¿i thßi điểm đó, chúng ta chỉ quan tâm đ¿n cách thąc quÁn lý, biên dßch solution, project căa Visual Studio. Sau khi đã nắm văng đ°ÿc cấu trúc điÁu khiển cũng nh° mßt sá đặc điểm cā thể căa ngơn ngă, giß là lúc chúng ta xem xét cu trỳc ca mòt chÂng trỡnh vit bng C#.

<b>2.5.1 Láp đßi t°ÿng</b>

Láp đái t°ÿng đóng vai trị rất lán trong cỏc chÂng trỡnh C#. Núi mòt cỏch nụm na, láp đái t°ÿng là khuôn đúc ra các đái t°ÿng cā thể (gái là instance), đßnh nghĩa các thành ph¿n dă liáu và chąc năng có thể có cho mỗi đái t°ÿng cā thể.

Thành viên căa láp đái t°ÿng là các dă liáu và các hàm bên trong láp đái t°ÿng nó, gái là dă liáu thành ph¿n và hàm thành ph¿n. Các thành viên căa láp đái t°ÿng có thể đ°ÿc khai báo là public (có thể đ°ÿc truy xuất trực ti¿p tÿ bên ngoài láp đái t°ÿng), hoặc private (chỉ đ°ÿc nhìn thấy á trong chính khai báo láp đái t°ÿng), protected (chỉ đ°ÿc truy xuất tÿ bên trong chính láp đái t°ÿng hoặc các láp đái t°ÿng khác k¿ thÿa tÿ nó).

Dă liáu thành ph¿n là các thành ph¿n bên trong láp chąa dă liáu cho class – đó có thể là các tr°ßng dă liáu (field), hằng sá (constant) hoặc là các sự kián (event).

Tr°ßng dă liáu là các bi¿n đ°ÿc khai báo á mąc láp đái t°ÿng. Ví dā d°ái đây đßnh

<small>--- --- i = 1 --- --- i = 3 </small>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

nghĩa mßt láp đái t°ÿng có tên là PhoneCustomer vái 3 tr°ßng dă liáu CustomerID, FirstName và LastName. Láp này cũng đßnh nghĩa mßt hằng á mąc láp là DayOfSendingBill.

Khi t¿o ra mßt đái t°ÿng căa láp đái t°ÿng PhoneCustomer, chúng ta có thể truy xuất các tr°ßng dă liáu này theo d¿ng đáiT°ÿng.Tr°ßngDăLiáu, nh° ví dā d°ái đây:

<small>PhoneCustomer Customer1 = new PhoneCustomer(); Customer1.FirstName = "Burton"; </small>

Hàm thành ph¿n là các thành ph¿n cung cấp chąc năng xā lý dă liáu cho láp đái t°ÿng. Chúng có thể là các phÂng thc (method), thuòc tớnh (property), hàm khái dựng (constructor), hàm hy bò (destructor), hoc indexer.

PhÂng thc (method) l cỏc hàm đ°ÿc khai báo trong láp đái t°ÿng. Chúng có thể là ph°¢ng thąc làm viác vái thể hián cā th ca lỏp, hoc l phÂng thc ch hot òng ỏ mc lỏp (phÂng thc tnh static method).

Thuòc tính (property) là tÁp các hàm có thể đ°ÿc truy xuất theo cách giáng nh° tr°ßng dă liáu public căa láp đái t°ÿng. C# cung cấp các cú pháp đặc biát để đßnh nghĩa các thc tính chỉ đác, chỉ ghi hay đ°ÿc truy xuất tự do.

Hàm khái dựng (constructor) là các hàm đặc biát, đ°ÿc gái mỗi khi đái t°ÿng căa láp đ°ÿc t¿o mái. Các hàm khái dāng phÁi có trùng tên vái tên láp đái t°ÿng.

Hàm hăy bß (destructor) là các hàm đ°ÿc gái khi đái t°ÿng bß hăy. Các hàm này có tên căa láp và đ°ÿc bắt đ¿u bằng ký tự ~ (dấu ngã).

Danh sách đ¿y đă các bå tÿ truy cÁp các hàm thành ph¿n căa láp đ°ÿc cho á bÁng d°ái đây:

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

public Ph°¢ng thąc có thể đ°ÿc truy cÁp tÿ mái n¢i

protected Ph°¢ng thąc có thể đ°ÿc truy cấp bên trong láp khai báo nó hoặc tÿ mßt kiểu dă liáu

khác đ°ÿc d¿n xuất tÿ láp khai báo nó.

internal Ph°¢ng thąc có thể đ°ÿc truy xuất trong ph¿m vi cùng assembly. private Ph°¢ng thąc chỉ có thể truy xuất trong láp khai báo nó.

static Ph°¢ng thąc ho¿t đßng á mąc láp, khơng ho¿t đßng vái mßt đái t°ÿng cā thể.

Virtual Ph°¢ng thąc có thể đ°ÿc ghi đè (override) trong láp d¿n xuất. abstract PhÂng thc ch úng vai trũ ònh ngha cỳ phỏp, khơng cài đặt.

override Ph°¢ng thąc ghi đè ph°¢ng thąc đ°ÿc đßnh nghĩa là virtual hoặc abstract á láp cha.

sealed Ph°¢ng thąc ghi đè ph°¢ng thąc virtual, nh°ng không thể đ°ÿc ghi đè bái bất cą láp

nào khi d¿n xuất thêm.

Extern Ph°¢ng thąc đ°ÿc cài đặt tÿ bên ngồi, có thể là bằng ngơn ngă khác.

<b>2.5.2 Kiểu dă liáu cấu trúc – struct</b>

Cú pháp khai báo kiểu dă liáu cấu trúc trong C# hồn tồn t°¢ng tự nh° khai báo láp đái t°ÿng, chỉ thay tÿ khóa class bằng tÿ khóa struct.

Chẳng h¿n, đây là khai báo kiểu cấu trúc PhoneCustomer:

Điểm khác biát giăa kiểu cấu trúc và láp đái t°ÿng đó là cách mà chúng đ°ÿc l°u tră và truy xuất. Láp đái t°ÿng là kiểu dă liáu tham chi¿u, đ°ÿc l°u tră trong vùng nhá heap, trong khi đó, cấu trúc là kiểu dă liáu giá trß, đ°ÿc l°u tră trong vùng nhá stack. Ngồi ra, cấu trúc khơng thể đ°ÿc k¿ thÿa nh° á láp đái t°ÿng.

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<b>2.6 Ph°¢ng thāc</b>

<b>2.6.1 Khai báo ph°¢ng thāc</b>

Cú phỏp ònh ngha mòt phÂng thc trong C# tÂng t nh° á C++. Điểm khác biát đó là, trong C#, mỗi ph°¢ng thąc đ°ÿc đÁu đ°ÿc khai báo t¿m truy xuất căa nó (public, private, protected) và đßnh nghĩa ln ph¿n thân ph°¢ng thąc. Nghĩa là, khơng đ°ÿc sā dāng t khúa <public:= gòp nhúm nhiu ònh ngha phÂng thąc public.

D°ái đây là cú pháp đßnh nghĩa mßt phÂng thc:

Vớ d, on code dỏi õy ònh ngha hai phÂng thc IsSquare() v Move():

<b>2.6.2 Truyn tham sò cho ph°¢ng thāc</b>

Các đái sá có thể đ°ÿc trun cho ph°¢ng thąc theo tham chi¿u hoặc giá trß. Bi¿n đ°ÿc truyÁn theo tham chiu n mòt phÂng thc thỡ s bò Ánh h°áng bái mái thay đåi n¿u có trong thân ph°¢ng thąc, trong khi đó, bi¿n đ°ÿc trun theo giá trß thì khơng bß Ánh h°áng bái nhăng thay đåi diòn ra trong thõn phÂng thc.

Dỏi õy l minh háa viác sā dāng các đái sá trong ph°¢ng thąc: <small>[modifiers] return_type MethodName([parameters]) </small>

<small>{ </small>

<small>// Method body } </small>

<small>public bool IsSquare(Rectangle rect) { </small>

<small>return (rect.Height == rect.Width); } </small>

<small>protected void Move(int dX, int dY) { </small>

<small>this.x += dX; this.y += dY; } </small>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

Mßt minh háa k¿t quÁ á console là nh° sau:

Để thay đåi giá trß căa đái sá i, chúng ta phÁi trun nó nh° là mßt đái sá kiểu tham chi¿u. Viác đßnh nghĩa mßt đái sá là kiểu tham chi¿u đ°ÿc thực hián bằng cách thêm tÿ khóa ref vào đ¿u đßnh nghĩa đái sá, nh° ví dā sau:

Và khi thực hián lòi gỏi phÂng thc, t khúa ref cng phi c thêm vào tr°ác bi¿n truyÁn cho ph°¢ng thąc:

<small>SomeFunction(ints, ref i); </small>

<small>using System; </small>

<small>namespace MinhHoaDoiSo { </small>

<small>class ParameterTest { </small>

<small>static void SomeFunction(int[] ints, int i) { </small>

<small>ints[0] = 100; i = 100; } </small>

<small>public static int Main() { </small>

<small>SomeFunction(ints, i); </small>

<small>Console.WriteLine("i = " + i); Console.WriteLine("ints[0] = " + ints[0]); return 0; </small>

<small>} } } </small>

<small>i = 0 ints[0] = 0 </small>

<small>Thuc hien goi phuong thuc SomeFunction()... i = 0 </small>

<small>ints[0] = 100 </small>

<small>static void SomeFunction(int[] ints, ref int i) { </small>

<small>ints[0] = 100; i = 100; } </small>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

Mßt điểm c¿n l°u ý đó là, bi¿n đ°ÿc sā dāng để truyÁn cho ph°¢ng thąc phÁi đ°ÿc khỏi to trỏc khi thc hiỏn lòi gỏi phÂng thc.

Để truyÁn mßt đái sá làm nhiám vā chąa giá trò u ra ca mòt phÂng thc, chỳng ta s dāng tÿ khóa out. Bi¿n đ°ÿc truyÁn theo kiểu nh° th¿ này thì khơng nhất thi¿t phÁi đ°ÿc khái t¿o trỏc khi thc hiỏn lòi gỏi phÂng thc, tuy nhiờn, n¿u trong thân hàm đái sá khơng đ°ÿc gán mßt giá trß nào thì trình biên dßch sẽ báo lỗi.

Cách sā dāng đái sá kiểu out là nh° ví dā d°ái đây:

<b>2.7 Dă liáu kiểu array</b>

<b>2.7.1 Cú pháp khai báo array</b>

Array trong C# đ°ÿc khai báo bằng cách gắn cặp dấu ngoặc vng vào sau kiểu dă liáu c¢ sá, theo cú pháp d°ái.

<small>type[] arrayName; </small>

Ví dā:

<small>int[] daySo; //khai bao daySo la mot array (co the chua cac so int) </small>

Để khái t¿o array, chúng ta sā dāng tÿ khóa new, sau đó chỉ đßnh cā thể kích th°ác trong cặp dấu ngoặc vng. Sau khi khái t¿o, mỗi ph¿n tā trong array đ°ÿc truy xuất thông qua tên array cùng vái sá hiáu căa nó (đ°ÿc đánh sá tÿ 0 trá đi).

L°u ý rằng, chúng ta có thể sā dāng giá trß căa bi¿n khi đßnh nghĩa kích th°ác cho array.

<small>static void SomeFunction(out int i) { </small>

<small>i = 100; //phai thuc hien thay doi gia tri cua doi so i trong than phuong thuc!!! } </small>

<small>public static int Main() { </small>

<small>int i; // chi khai bao bien i, chua can KHOI TAO GIA TRI cho no SomeFunction(out i); </small>

<small>Console.WriteLine(i); return 0; </small>

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

Và, mßt khi đã khái t¿o xong array vái kích th°ác cā thể, chúng ta khơng thể thay đåi kích th°ác căa array đó. Để làm đ°ÿc điÁu này, chúng ta c¿n mßt kiểu dă liáu khác – ArrayList.

Chúng ta cũng có thể khai báo và đßnh nghĩa mßt array theo cách chỉ ra các ph¿n tā cā thể căa nó nh° sau:

<small>string[] myArray = {"first element", "second element", "third element"}; </small>

<b>2.7.2 Làm viác vái array</b>

Để lấy kích th°ác căa array, chúng ta sā dāng thc tính Length ca nú. Mòt sỏ phÂng thc thòng dựng ỏi vái dă liáu kiểu array là:

- Array.Sort(arr): hàm tĩnh, sā dāng để sắp x¿p array arr; arr là array căa các ph¿n tā có kiểu đ°ÿc đßnh nghĩa sẵn trong C#.

- Array.Reverse(arr): hàm tĩnh, sā dāng để đÁo ng°ÿc vß trí căa các ph¿n tā có trong array arr.

Ví dā sau minh háa viác khai báo mßt array gãm các string, sắp x¿p theo thą tự ABC, đÁo ng°ÿc các ph¿n tā, rãi in các ph¿n tā ra Console:

<b>2.7.3 Array nhiÁu chiÁu</b>

C# hỗ trÿ hai kiểu array nhiÁu chiÁu: kiểu ma trÁn (chẳng h¿n nh° mßt ma trÁn hai chiÁu là mßt array trong đó mỗi dịng sẽ có cùng sá cßt) và array kiểu răng c°a.

Ví dā d°ái đây minh háa cách khai báo và khái t¿o mßt array kiểu ma trÁn hai chiÁu:

<small>string[] hoTen = {"Nguyen Van Trung", "Nguyen Hoang Ha", "Tran Nguyen Phong"}; // in danh sach cac phan tu trong array </small>

<small>for (int i = 0; i < hoTen.Length; i++) Console.WriteLine(hoTen[i]); </small>

<small>Array.Sort(hoTen); Array.Reverse(hoTen); </small>

<small>// in danh sach cac phan tu trong array su dung cu phap foreach foreach (string stHoTen in hoTen) </small>

<small>Console.WriteLine(stHoTen); </small>

<small>string[,] beatleName = { {"Lennon","John"}, {"McCartney","Paul"}, {"Harrison","George"}, {"Starkey","Richard"} }; </small>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

L°u ý rằng chúng ta sā dāng dấu phÁy để phân cách các chiÁu trong khai báo array, ngay cÁ khi chúng ta ch°a thực sự xác đßnh kích th°ác căa mỗi chiÁu. Để khai báo mßt array 3 chiÁu gãm các string, chúng ta làm nh° sau:

Tÿng ph¿n tā căa array kiểu răng c°a sẽ đ°ÿc truy xuất nh° là mòt array mòt chiu nh thụng thòng. ChÂng trỡnh dỏi đây cho thấy rõ h¢n cách thąc sā dāng căa array kiểu răng c°a. Ch°¢ng trình này có nhiám vā nhÁn vào mßt sá ngun n, sau đó thành lÁp tam giác Pascal rãi in tam giác này ra màn hình.

<small>double [, ] matrix = new double[5, 10]; </small>

<small>Console.WriteLine(<Kich thuoc chieu thu nhat: {0}=, matrix.GetLength(0)); // 5 Console.WriteLine(<Kich thuoc chieu thu nhat: {0}=, matrix.GetLength(1)); // 10 </small>

<small>int[][] a = new int[3][]; a[0] = new int[4]; </small>

<small>a[1] = new int[3]; a[2] = new int[1]; </small>

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

Mßt minh háa k¿t q in ra căa ch°¢ng trình là:

<small>1 1 1 </small>

C# hỗ trÿ các kiểu toán tā sau đây:

<small>class TamGiacPascal { </small>

<small>for (int i = 0; i < C.Length; i++) { </small>

<small>for (int j = 0; j < C[i].Length; j++) </small>

<small>Console.Write("{0, 5}", C[i][j]); // in so voi do rong la 5 Console.WriteLine(); </small>

<small>} </small>

<small>Console.ReadLine(); } </small>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Ép kiểu <small>()</small>

Cũng giáng nh° các ngôn ngă tựa C, chúng ta c¿n phân biát phép gán vái phép so sánh. Chẳng h¿n

<small>x = 3; // gán giá trị 3 cho x </small>

trong khi đó, muán so sánh x vái 3, chúng ta phÁi ghi nh° th¿ này

<small>if (x == 3) </small>

<b>2.8.1 Các toán tā tắt</b>

D°ái đây là các toán tā vi¿t tắt căa C#

<b>2.8.2 Toán tā tam nguyên (ternary operator)</b>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

Cũng nh° các ngôn ngă tựa C, C# cũng cung cấp toán tā tam nguyên: <small>condition ? true_value : false_value </small>

<b>2.8.3 Chỉ d¿n checked và unchecked</b>

Xem xét đo¿n mã lánh sau

Dă liáu kiểu byte chỉ có thể nắm giă đ°ÿc các giá trß trong vùng tÿ 0 đ¿n 255, vì th¿, viác tăng giá trß căa b sẽ làm xuất hián lỗi overflow. Viác quÁn lý các lỗi kiểu nh° th¿ này rất quan tráng, vì th¿ C# cung cấp mßt cú pháp cho phép phát hián ra kiểu lỗi này. Xem đo¿n mã lánh

<small>byte b = 255; checked </small>

<small>{ </small>

<small>b++; } </small>

<small>Console.WriteLine(b.ToString()); </small>

Khi thực thi đo¿n mã lánh này, chúng ta sẽ nhÁn đ°ÿc thông báo lỗi d¿ng

N¿u muán bß qua lỗi overflow, chúng ta đánh dấu đo¿n mã lánh t°¢ng ąng là unchecked

<small>byte b = 255; unchecked { </small>

<small>b++; } </small>

<small>Console.WriteLine(b.ToString()); </small>

<small>Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow. </small>

<small>at MinhHoa.Main(String[] args) </small>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

Toán tā sizeof cho phép xác đßnh kích th°ác (tính bằng byte) đ°ÿc u c¿u bái mßt kiểu dă liáu giá trß trên vùng nhá stack . Xem ví dā minh háa sau:

L°u ý rằng, toán tā sizeof chỉ đ°ÿc sā dāng vái mã lánh khơng an tồn (unsafe code).

<b>2.9 Enumerations – Kiểu liát kê</b>

Mßt kiểu liát kê là mßt kiểu dă liáu nguyên do ng°ßi sā dāng tự đßnh nghĩa. Khi khai báo mßt kiểu liát kê, chúng ta xác đßnh mßt tÁp các giá trß có thể nhÁn đ°ÿc thơng qua các tên gái có tính gÿi nhá.

Chúng ta có thể đßnh nghĩa mßt kiểu liát kê nh° ví dā sau:

Viác sā dāng kiểu dă liáu liát kê sẽ cho phép vi¿t các đo¿n mã lánh dß đác, dß quÁn lý lỗi logic h¢n.

<small>class EnumExample { </small>

<small>public static int Main() { </small>

<small>WriteGreeting(TimeOfDay.Morning); return 0; </small>

<small>} </small>

<small>static void WriteGreeting(TimeOfDay timeOfDay) { </small>

<small>switch(timeOfDay) { </small>

<small>case TimeOfDay.Morning: </small>

<small>Console.WriteLine("Good morning!"); break; </small>

<small>case TimeOfDay.Afternoon: </small>

<small>Console.WriteLine("Good afternoon!"); break; </small>

<small>case TimeOfDay.Evening: </small>

<small>Console.WriteLine("Good evening!"); break; </small>

<small>string s = "A string"; unsafe </small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<small>default: </small>

<small>Console.WriteLine("Hello!"); break; </small>

<small>} } } </small>

Mßt đặc tính đặc biát căa kiểu liát kê c¿n l°u ý đó là khÁ năng chuyển đåi qua l¿i giăa nó vái kiểu dă liỏu string.

Viỏc ly chui tÂng ng ca mòt bin giỏ trò liỏt kờ cú th tin hnh Ân gin bằng cách sā dāng ph°¢ng thąc ToString() căa bi¿n. Trong khi đó, để lấy giá trß kiểu liát kê tÿ mòt chui tÂng ng thỡ phc tp hÂn, chỳng ta phÁi sā dāng ph°¢ng thąc tĩnh Parse căa láp Enum. Cịn có nhiÁu ph°¢ng thąc khác căa láp Enum; chi ti¿t tham khÁo b¿n xem á tài liáu MSDN.

<b>2.10 Namespace</b>

Namespace l Ân vò gòp nhúm mang tớnh logic. Khi đßnh nghĩa mßt láp đái t°ÿng trong mßt file C#, chúng ta có thể đ°a nó vào trong mßt namespace nào đó. Sau đó, khi đßnh nghĩa láp khác có chąc năng liên quan vái láp đái t°ÿng tr°ác đó, chúng ta có thể gßp nó vào trong cùng namespace, qua đó t¿o ra mßt nhóm logic, cho các nhà phát triển bi¿t rằng các láp đái t°ÿng trong cùng namespace là có liên quan vái nhau.

Kiểu dă liáu thc vÁ mßt namespace sẽ có tên đ¿y đă đ°ÿc xác đßnh bằng

<small>TimeOfDay time = TimeOfDay.Afternoon; </small>

<small>Console.WriteLine(time.ToString()); // chuoi in ra la <Afternoon= //string  enum </small>

<small>TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine((int)time2); </small>

<small>namespace BusinessLayer { </small>

<small>public struct Student { </small>

<small>// Ma lenh dinh nghia struct Student... } </small>

<small>} </small>

</div>

×