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

125 0 0
Tài liệu đã được kiểm tra trùng lặp
giáo trình lập trình windows form nghề tin học ứng dụng cao đẳng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các file này không phÁi thußc 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ã

Trang 1

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

TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GÒN

Trang 3

MĀC LĀC

GIÁO TRÌNH MÔN HàC/MÔ ĐUN 6

CH¯¡NG 1 TäNG QUAN VÀ NET FRAMEWORK 7

1.1Tång quan vÁ ki¿n trúc căa NET Framework 7

1.2Môi tr°ßng thực thi ngôn ngă chung CLR (Common Language Runtime) 8

1.2.1 Biên dßch mã lánh NET 8

1.2.2 Há tháng kiểu dă liáu chung CTS (Common Type System) 10

1.2.3 Assemblies 10

1.2.4 Private Assembly và Shared Assembly 13

1.2.5 TiÁn biên dßch mßt Assembly 15

1.2.6 Kiểm chąng mã lánh (Code Verification) 15

CH¯¡NG 2 NGÔN NGĂ LÀP TRÌNH C# 16

2.1Ch°¢ng trình đ¿u tiên 16

2.2Bi¿n dă liáu 18

2.2.1 Hằng dă liáu 19

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

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

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

2.3.2.1 Kiểu dă liáu object 21

2.3.2.2 Kiểu dă liáu string 22

2.4Luãng điÁu khiển ch°¢ng trình 23

Trang 4

2.6.2 TruyÁn tham sá cho ph°¢ng thąc 31

2.7Dă liáu kiểu array 33

2.7.2 Làm viác vái array 34

2.7.3 Array nhiÁu chiÁu 34

2.10.1 Khai báo sā dāng namespace 41

2.10.2 Bí danh cho Namespace 42

2.11 Bài thực hành 43

CH¯¡NG 3: LÀP TRÌNH WINFORM 48

3.1 Giái thiáu Visual Studio 48

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

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

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

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

4.2.1 Mô hình K¿t nái 69

4.2.2 Mô hình ngắt k¿t nái 70

4.3Làm viác vái mô hình K¿t nái trong ADO.NET 72

Trang 5

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

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

4.3.2 Đái t°ÿng DataReader 80

4.3.2.1 Truy xuất các dòng dă liáu vái DataReader 81

4.3.2.2 Truy xuất giá trß căa column 81

4.4.2 N¿p dă liáu vào DataSet 95

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

4.4.2.2 N¿p dă liáu vào DataSet bằng DataAdapter 96

4.4.3 Bài thực hành 97

4.4.4 CÁp nhÁt CSDL bằng DataAdapter 100

4.4.4.1 CommandBuilder 100

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

4.4.4.3 Sā dāng Transactions để Roll Back nhiÁu cÁp nhÁt 102

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

4.4.5 Đßnh nghĩa Relationships giăa các Table trong DataSet 104

4.5Sā dāng Data Binding 107

4.5.1 Các lo¿i căa Binding 107

4.5.2 Các nguãn dă liáu căa DataBinding 108

4.5.4 Bài thực hành 110

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

TÀI LIàU THAM KHÀO 125

Trang 6

GIÁO TRÌNH MÔN HàC/MÔ ĐUNTên môn hác//mô đun: LÁp Trình Windows Form

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

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

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

II Māc tiêu môn hác:

- 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

Trang 7

CH¯¡NG 1 TàNG QUAN VÀ NET FRAMEWORK

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

1.1 Táng quan vÁ ki¿n trúc cÿa NET Framework

.NET Framework đ°ÿc thi¿t k¿ nh° là môi tr°ßng tích hÿp để đ¢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 quán 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 quá 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 quÁn 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

Trang 8

Hình 1.1 – Kiến trúc NET Framework

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, quÁn 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

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

CLR (Common Languge Runtime – Môi tr°ßng thực thi ngôn ngă chung) quÁn lý toà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 quÁn lý bß nhá mßt cách tự đßng Ngoà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

1.2.1 Biên dßch mã lánh NET

Trình biên dßch t°¢ng thích vái CLR sẽ sinh mã thực 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

Trang 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 thußc 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, thực thi mßt ch°¢ng trình trong NET framework có thể tóm tắt nh° sau:

- Ch°¢ng trình nguãn 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

Hình 1.2 – Chāc năng cÿa CLR

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

Trang 10

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

CTS cung cấp mßt tÁp c¢ sá các kiểu dă liáu cho mỗi ngôn ngă ho¿t đßng trên NET platform Ngoà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

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

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

1.2.3 Assemblies

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 chuyển 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

Trang 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: Ngoà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 kiểu, ph°¢ng thąc, 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ā thußc 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

Trang 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 nguyên 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

Hình 1.5 - Assembly chāa nhiều file

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

Trang 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

1.2.4 Private Assembly và Shared Assembly

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ó Quá 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í toà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 thußc 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 thußc 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

Trang 14

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

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

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 thußc 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 thußc tính AssemblyCulture đặt trong mã nguãn căa assembly

[assembly: AssemblyCulture ("fr-CA")]

- 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 quá 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

Hình 1.6 – Thư mục Global Assembly

Trang 15

1.2.5 TiÁn biên dßch mßt Assembly

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

1.2.6 Kiểm chāng mã lánh (Code Verification)

Nh° là mßt ph¿n căa quá 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 thąc đ°ÿc gái phÁi đ°ÿc kiểm tra để đÁm bÁo chúng có cùng kiểu dă liáu, hoặc là mßt ph°¢ng thąc 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 bi¿n là t°¢ng thích kiểu; n¿u 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ỉ.

Trang 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

Hình 2.1 – Giao diện tạo Project mớ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=

Trang 17

Visual Studio NET coi mßt <bài toá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

Hình 2.2 – Thư mục chāa āng dụng

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

Hình 2.3 – Giao diện nhập code

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

Trang 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

float thuong = (float)n1 / n2;

thành

float thuong = n1 / n2;

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 căa ch°¢ng trình (xā lý phép chia cho 0, &)

2.2 Bi¿n dă liáu

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

Ví dā: int i;

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 toán tā gán =, nh° sau:

i = 10;

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:

Tầm ho¿t đßng cÿa bi¿n

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:

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

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

Trang 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

2.2.1 H¿ng dă liáu

Hằng dă liáu là bi¿n có giá trß không đ°ÿc phép thay đåi trong suát 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

const int a = 100; // Gia tri nay khong duoc thay doi 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 toá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

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

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

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

Trang 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á nguyên không dấu có giá trß

tÿ 0 đ¿n 65,535 int 4 System.Int32 Sá nguyên 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á nguyên không dấu có giá trß

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

2.3.1.2 Các kiểu số dấu chấm động

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

Tên Kiểu trong CTS Sá chă sá có nghĩa Vùng biểu dißn t°¢ng đái (khoÁng) float System.Single 7 ±1.5 × 10-45 to ±3.4 × 1038

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

2.3.1.3 Kiểu số thập phân

Trang 21

Để biểu dißn sá thÁp phân vái đß chính xác cao h¢n sá thực dấu chấm đßng, C# hỗ trÿ kiểu dă liáu sá thÁp phân:

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

decimal System.Decimal 28 ±1.0 × 10-28 to ±7.9 × 1028

2.3.1.3 Kiểu boolean

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ß nguyên nh° mßt sá ngôn ngă (C, C++)

2.3.1.4 Kiểu ký tự

Để l°u tră giá trß căa 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' Cũng có thể biểu 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 Ngoài ra có thể sā dāng mßt sá ký tự escape: \9, \\, \0, \a, \b, \n, \t

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

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

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

2.3.2.1 Kiểu dữ liệu object

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õ kiểu 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 thąc c¢ bÁn, dùng chung, bao gãm: Equals(),

Trang 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

2.3.2.2 Kiểu dữ liệu string

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 hoàn toà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:

using System; class NSGString {

public static int Main() {

string s1 = "a string"; string s2 = s1; Console.WriteLine("s1 is " + s1);

Console.WriteLine("s2 is " + s2); s1 = "another string";

Console.WriteLine("s1 is now " + s1); Console.WriteLine("s2 is now " + s2); return 0;

} }

K¿t quÁ căa đo¿n ch°¢ng trình trên là: s1 is a string

string filepath = "C:\\CSharp\\NSGString.cs";

Trang 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 @: string filepath = @"C:\CSharp\NSGString.cs";

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

Day la dong thu hai.";

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

Day la dong thu hai

2.4 Lußng điÁu khiển ch°¢ng trình2.4.1 Câu lánh điÁu kián

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

2.4.1.1 Câu lệnh if

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 căa nó là:

N¿u có nhiÁu h¢n mßt câu lánh đ°ÿc thực 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++)

if (condition) statement1(s) [else

statement2(s)]

bool isZero; if (i == 0) {

isZero = true;

Console.WriteLine("i is Zero"); }

else {

isZero = false;

Console.WriteLine("i is Non-zero"); }

Trang 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 ngoài câu lánh switch

Ví dā:

switch (integerA) {

case 1:

Console.WriteLine("integerA =1"); break; case 2:

Console.WriteLine("integerA =2"); break; case 3:

Console.WriteLine("integerA =3"); break; default:

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

2.4.2 Câu lánh lặp

{

case const_1: statement_1; break;

case const_2: statement_2; break;

case const_n: statement_n; break;

[default:

statement_n+1; break;]

}

Trang 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

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

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

while(condition) statements;

Trang 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ß căa bi¿n ph¿n tā lặp Chẳng h¿n, đo¿n ch°¢ng trình d°ái đây sẽ bß báo lỗi:

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

{

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

do {

statements; }

while(condition)

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

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

while (st != correctPwd)

foreach (int temp in arrayOfInts) {

Console.WriteLine(temp); }

foreach (int temp in arrayOfInts) {

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

}

Trang 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:

2.4.3.3 Câu lệnh continue

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ỉ thoá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& goto Label1;

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

Console.WriteLine("Continuing execution from here");

string correctPwd = <abc=; while (true)

{

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

break; }

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

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

continue;

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

Trang 28

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

2.4.3.4 Câu lệnh return

Lánh return đ°ÿc sā dāng để thoát khßi ph°¢ng thąc căa mßt láp, trÁ điÁu khiển trá vÁ n¢i gái ph°¢ng thąc Tùy theo kiểu dă liáu trÁ vÁ căa ph°¢ng thąc là void hoặc có mßt kiểu 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

2.5 Cấu trúc ch°¢ng trình

Trong ph¿n đ¿u căa ch°¢ng này, chúng ta đã vi¿t mßt ch°¢ng trình C# đ¢n giÁn đ¿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 cấu trúc căa mßt ch°¢ng trình vi¿t bằng C#

2.5.1 Láp đßi t°ÿng

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

- - i = 1 - - i = 3

Trang 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:

PhoneCustomer Customer1 = new PhoneCustomer(); Customer1.FirstName = "Burton";

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 thąc (method), thußc tính (property), hàm khái dựng (constructor), hàm hăy bß (destructor), hoặc indexer

Ph°¢ng thąc (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ể căa láp, hoặc là ph°¢ng thąc chỉ ho¿t đßng á mąc láp (ph°¢ng thąc tĩnh – 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 thußc 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:

Trang 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 thąc chỉ đóng vai trò đßnh nghĩa 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 ngoài, có thể là bằng ngôn ngă khác

2.5.2 Kiểu dă liáu cấu trúc – struct

Cú pháp khai báo kiểu dă liáu cấu trúc trong C# hoàn toà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 Ngoài ra, cấu trúc không thể đ°ÿc k¿ thÿa nh° á láp đái t°ÿng

Trang 31

2.6 Ph°¢ng thāc

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

Cú pháp đßnh nghĩa mßt ph°¢ng thąc 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 luôn 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 nhiÁu đßnh nghĩa ph°¢ng thąc public

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

Ví dā, đo¿n code d°ái đây đßnh nghĩa hai ph°¢ng thąc IsSquare() và Move():

2.6.2 TruyÁn tham sß cho ph°¢ng thāc

Các đái sá có thể đ°ÿc truyÁn cho ph°¢ng thąc theo tham chi¿u hoặc giá trß Bi¿n đ°ÿc truyÁn theo tham chi¿u đ¿n mßt ph°¢ng thąc 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 truyÁn theo giá trß thì không bß Ánh h°áng bái nhăng thay đåi dißn ra trong thân ph°¢ng thąc

D°ái đây là minh háa viác sā dāng các đái sá trong ph°¢ng thąc: [modifiers] return_type MethodName([parameters])

{

// Method body }

public bool IsSquare(Rectangle rect) {

return (rect.Height == rect.Width); }

protected void Move(int dX, int dY) {

this.x += dX; this.y += dY; }

Trang 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 truyÁn 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 thąc, tÿ khóa ref cũng phÁi đ°ÿc thêm vào tr°ác bi¿n truyÁn cho ph°¢ng thąc:

SomeFunction(ints, ref i);

using System;

namespace MinhHoaDoiSo {

class ParameterTest {

static void SomeFunction(int[] ints, int i) {

ints[0] = 100; i = 100; }

public static int Main() {

SomeFunction(ints, i);

Console.WriteLine("i = " + i); Console.WriteLine("ints[0] = " + ints[0]); return 0;

} } }

i = 0 ints[0] = 0

Thuc hien goi phuong thuc SomeFunction() i = 0

ints[0] = 100

static void SomeFunction(int[] ints, ref int i) {

ints[0] = 100; i = 100; }

Trang 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 t¿o tr°ác khi thực hián lßi gái ph°¢ng thąc

Để truyÁn mßt đái sá làm nhiám vā chąa giá trß đ¿u ra căa mßt ph°¢ng thąc, 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 thực hián lßi gái ph°¢ng thąc, 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:

2.7 Dă liáu kiểu array

2.7.1 Cú pháp khai báo array

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

type[] arrayName;

Ví dā:

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

Để 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 vuông 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

static void SomeFunction(out int i) {

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

public static int Main() {

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

Console.WriteLine(i); return 0;

Trang 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:

string[] myArray = {"first element", "second element", "third element"};

2.7.2 Làm viác vái array

Để lấy kích th°ác căa array, chúng ta sā dāng thußc tính Length căa nó Mßt sá ph°¢ng thąc 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:

2.7.3 Array nhiÁu chiÁu

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:

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

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

Array.Sort(hoTen); Array.Reverse(hoTen);

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

Console.WriteLine(stHoTen);

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

Trang 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 chiÁu 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á nguyên n, sau đó thành lÁp tam giác Pascal rãi in tam giác này ra màn hình

double [, ] matrix = new double[5, 10];

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

int[][] a = new int[3][]; a[0] = new int[4];

a[1] = new int[3]; a[2] = new int[1];

Trang 36

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

1 1 1

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

class TamGiacPascal {

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

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

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

}

Console.ReadLine(); }

Trang 37

Ép kiểu ()

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

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

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

if (x == 3)

2.8.1 Các toán tā tắt

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

2.8.2 Toán tā tam nguyên (ternary operator)

Trang 38

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

2.8.3 Chỉ d¿n checked và unchecked

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

byte b = 255; checked

{

b++; }

Console.WriteLine(b.ToString());

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

byte b = 255; unchecked {

b++; }

Console.WriteLine(b.ToString());

Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow

at MinhHoa.Main(String[] args)

Trang 39

Toán tā sizeof cho phép xác đßnh kích th°ác (tính bằng byte) đ°ÿc yê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 toàn (unsafe code)

2.9 Enumerations – Kiểu liát kê

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

class EnumExample {

public static int Main() {

WriteGreeting(TimeOfDay.Morning); return 0;

}

static void WriteGreeting(TimeOfDay timeOfDay) {

switch(timeOfDay) {

case TimeOfDay.Morning:

Console.WriteLine("Good morning!"); break;

case TimeOfDay.Afternoon:

Console.WriteLine("Good afternoon!"); break;

case TimeOfDay.Evening:

Console.WriteLine("Good evening!"); break;

string s = "A string"; unsafe

Trang 40

default:

Console.WriteLine("Hello!"); break;

} } }

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 lấy chuỗi t°¢ng ąng căa mßt bi¿n giá trß liát kê có thể ti¿n hành đ¢n giÁn 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 chuỗi t°¢ng ąng thì phąc t¿p 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

2.10 Namespace

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 thußc vÁ mßt namespace sẽ có tên đ¿y đă đ°ÿc xác đßnh bằng

TimeOfDay time = TimeOfDay.Afternoon;

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

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

namespace BusinessLayer {

public struct Student {

// Ma lenh dinh nghia struct Student }

}

Ngày đăng: 02/06/2024, 11:50

Tài liệu cùng người dùng

Tài liệu liên quan