Tài liệu Đề tài Giới thiệu sơ bộ về .NET và C#: MụC lục
Danh sách các hình vẽ
Hình 1 Kiến trúc nền .NET 9
Hình 2 Cấu trúc CLR 11
Hình 3 Tô màu bằng bút vẽ Gradient tuyến tính 21
Hình 4 Đường Bézier được tô bởi bút phủ Gradient 22
Hình 5 Chuyển đổi đồ thị 22
Hình 6 Co giãn vùng ảnh 23
Hình 7 Các mức độ trong suốt của màu nền 23
Hình 8 Hệ trục toạ độ của GDI+ 25
Hình 9 Dịch chuyển hệ toạ độ 26
Hình 10 Vòng đời của một luồng 36
Hình 11 Vòng luân phiên thực hiện luồng 36
Hình 12 Minh hoạ soạn thảo trong WordPad 42
Hình 13 Mã của văn bản đọc bằng NotePad 43
Hình 14 Mã của văn bản Word đọc bằng NotePad 43
Hình 15 Tạo văn bản HTML trong NotePad 44
Hình 16 Cấu trúc của XML 48
Hình 17 Khai báo thành phần trong XML 49
Hình 18 Minh họa cấu trúc cây của ví dụ 51
Hình 19 Kết quả chương trình tạo tài liệu trên IE 6.0 54
Hình 20 Kết quả ví dụ Serializing trên IE 6.0 58
Danh sách các thuật ngữ viết tắt
IE 6.0 = Internet Explorer 6.0
CLS = Common Language Spcification
CLR = Common Language Runtime
IDE = Integrated Develo...
81 trang |
Chia sẻ: hunglv | Lượt xem: 1161 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Giới thiệu sơ bộ về .NET và C#, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MôC lôc
Danh s¸ch c¸c h×nh vÏ
H×nh 1 KiÕn tróc nÒn .NET 9
H×nh 2 CÊu tróc CLR 11
H×nh 3 T« mµu b»ng bót vÏ Gradient tuyÕn tÝnh 21
H×nh 4 §êng BÐzier ®îc t« bëi bót phñ Gradient 22
H×nh 5 ChuyÓn ®æi ®å thÞ 22
H×nh 6 Co gi·n vïng ¶nh 23
H×nh 7 C¸c møc ®é trong suèt cña mµu nÒn 23
H×nh 8 HÖ trôc to¹ ®é cña GDI+ 25
H×nh 9 DÞch chuyÓn hÖ to¹ ®é 26
H×nh 10 Vßng ®êi cña mét luång 36
H×nh 11 Vßng lu©n phiªn thùc hiÖn luång 36
H×nh 12 Minh ho¹ so¹n th¶o trong WordPad 42
H×nh 13 M· cña v¨n b¶n ®äc b»ng NotePad 43
H×nh 14 M· cña v¨n b¶n Word ®äc b»ng NotePad 43
H×nh 15 T¹o v¨n b¶n HTML trong NotePad 44
H×nh 16 CÊu tróc cña XML 48
H×nh 17 Khai b¸o thµnh phÇn trong XML 49
H×nh 18 Minh häa cÊu tróc c©y cña vÝ dô 51
H×nh 19 KÕt qu¶ ch¬ng tr×nh t¹o tµi liÖu trªn IE 6.0 54
H×nh 20 KÕt qu¶ vÝ dô Serializing trªn IE 6.0 58
Danh s¸ch c¸c thuËt ng÷ viÕt t¾t
IE 6.0 = Internet Explorer 6.0
CLS = Common Language Spcification
CLR = Common Language Runtime
IDE = Integrated Development Environment
API = Application Programming Interface
VB = Visual Basic
VC = Visual C
VS = Visual Studio
XML = Extensible Markup Language
MSIL = IL = Microsoft Intermediate Language
COM = Component Object Model
IDL = Interface Definition Language
DLL = Dynamic Link Library
GC = Garbage Collection
JIT = Just In Time compiler
ADO = ActiveX Data Object
MS = Microsoft
SQL = Structured Query Language
GDI = Graphic Device Independence
WMF = Window MetaFile
EMF = Enhanced MetaFile
CPU = Central Processing Unit
RTF = Rich Text Format
HTML = Hyper Text Markup Language
SGML = Standard Generalized Markup Language
Giíi thiÖu ®Ò tµi
Trong nhiÒu n¨m, c¸c lËp tr×nh viªn C vµ C++ lu«n ph¶i ®èi mÆt víi nh÷ng vÊn ®Ò ®au ®Çu nh: sö dông con trá, qu¶n lÝ bé nhí, truyÒn tham trÞ, tham biÕn, xö lý danh s¸ch, x©y dùng th viÖn, ®a kÕ thõa, x©y dùng giao diÖn th©n thiÖn víi ngêi dïng… V× vËy hä lu«n mong muèn, t×m kiÕm mét ng«n ng÷ thay thÕ cã kh¶ n¨ng còng nh tÝnh uyÓn chuyÓn m¹nh nh C vµ C++ h¬n n÷a l¹i ®¬n gi¶n h¬n. Vµo gi÷a nh÷ng n¨m 90, thÕ giíi lËp tr×nh cã sù thay ®æi lín víi sù bïng næ Internet ( Internet Boom ) vµ sù ra ®êi cña ng«n ng÷ lËp tr×nh Java. Ngay tõ khi ra ®êi, Java ®· cho thÊy kh¶ n¨ng to lín cña nã trong viÖc ph¸t triÓn c¸c øng dông trªn internet. H¬n n÷a Java cßn thnµh c«ng víi tuyªn bè “write once, run anywhere” cè thÓ t¹m dich lµ : viÕt mét lÇn, ch¹y trªn mäi nÒn. Thµnh c«ng ®ã xuÊt ph¸t tõ ý tëng t¸ch rêi m· khi biªn dÞch ch¬ng tr×nh vµ m· khi ch¹y ch¬ng tr×nh, ®©y lµ ®iÓm kh¸c biÖt lín so víi nh÷ng ng«n ng÷ lËp tr×nh C hay C++. Java ®a ra mét kh¸i niÖm míi : m¸y ¶o. M¸y ¶o thùc hiÖn c¸c c«ng viÖc nh biªn dÞch ra m· m¸y, qu¶n lÝ bé nhí… hay nãi c¸ch kh¸c, m¸y ¶o ®ãng vai trß giao tiÕp gi÷a øng dông Java vµ m«i trêng ( hÖ ®iÒu hµnh, hay phÇn cøng) lµm cho øng dông Java ®éc lËp víi m«i trêng. Tuy nhiªn tèc ®é ph¸t triÓn Java l¹i chËm dÇn, vµ kh«ng thÓ ®Êp øng ®îc nh÷ng ®ßi hái ngµy cµng cao cña ngêi dïng. C¸c h·ng ph¸t triÓn Java chËm ®a ra mét m«i trêng tÝch hîp IDE phôc vô cho ph¸t triÓn c¸c dù ¸n phÇn mÒm. ViÖc lËp tr×nh c¸c øng dông trªn Windows b»ng Java kh«ng thuËn tiÖn, Java cã nhiÒu h¹n chÕ trong viÖc giao tiÕp víi c¸c ng«n ng÷ kh¸c nh C++, Visôal Basic…Java kh«ng cã sù ph¸t triÓn ®ång nhÊt theo xu híng thuËn tiÖn cho ngêi sö dông, ph¶i mÊt nhiÒu n¨m Java míi hç trî ®îc ®iÒu khiÓn Mouse – wheel, khã sö dông th viÖn API cña hÖ ®iÒu hµnh, phiªn b¶n Visual J++ cña Microsoft ph¸t triÓn th× l¹i mang nhiÒu nÐt kh«ng gièng víi nguyªn b¶n. Windows XP ra ®êi víi tuyªn bè kh«ng hç trî m¸y ¶o Java, kh«ng tÝch hîp m¸y ¶o Java vµo tr×nh duyÖt IE 6.0 ®· lµm uy tÝn cña Java suy gi¶m nÆng nÒ. Cuèi cïng th× ng«n ng÷ mµ c¸c lËp tr×nh viªn mong ®îi còng xuÊt hiÖn, ®¸nh dÊu chÊm hÕt cho cuéc t×m kiÕm ng«n ng÷ lËp tr×nh kÐo dµi nhiÒu n¨m cña c¸c lËp tr×nh viªn. §îc b¾t ®Çu nghiªn cøu tõ n¨m 1997, vµo n¨m 2001, Microsoft giíi thiÖu mét platform míi --.Net, ®i cïng víi nã lµ mét ng«n ng÷ míi - C#.
C# ®îc coi nh ng«n ng÷ mang tÝnh c¸ch m¹ng cña Microsoft. Dùa trªn kinh nghiÖm cña c¸c ng«n ng÷ tríc ®ã nh C, C++ vµ VB, C# ®îc thiÕt kÕ nh»m sö dông ®¬n gi¶n, hoµn toµn híng ®èi tîng. Víi sù tÝch hîp C# víi VS. Net, viÖc ph¸t triÓn c¸c øng dông Windows vµ Web nhanh vµ ®¬n gi¶n. Cã thÓ truy cËp vµo c¸c th viÖn líp cña .Net, C# hç trî ph¸t triÓn c¸c øng dông ASP.Net vµ dÞch vô Web. Bªn c¹nh ®ã, C# t¨ng cêng n¨ng suÊt lËp tr×nh b»ng viÖc xo¸ bá ®i nh÷ng lçi th«ng thêng cã trong C vµ C++.
Java thµnh c«ng nhÊt trªn 2 lÜnh vùc: lËp tr×nh c¸c øng dông trªn server vµ trong gi¶ng d¹y khoa häc tÝnh trong c¸c trêng häc. C# còng cã kh¶ n¨ng vît tréi Java trªn hai lÜnh vùc ®ã. Trong ®Ò tµi nµy, chóng em kh«ng thÓ tr×nh bµy hÕt mäi vÊn ®Ò liªn quan ®Õn ng«n ng÷ C#, chóng em chØ xin giíi thiÖu s¬ bé vÒ .NET vµ C# cïng víi mét sè vÊn ®Ò n©ng cao trong ng«n ng÷ C# nh sau:
Giíi thiÖu s¬ bé vÒ nÒn .NET vµ ng«n ng÷ C#
§å ho¹ trong C#
§a luång trong C#
XML vµ C#
LËp tr×nh m¹ng trong C#
Mét vµi so s¸nh C# víi c¸c ng«n ng÷ kh¸c
Trong ®Ò tµi nµy, chóng em kh«ng d¸m ch¾c mäi tr×nh bµy, ®¸nh gi¸ lµ chÝnh x¸c, x¸c ®¸ng. Trong khi lµm ®Ò tµi cã mét sè thuËt ng÷ Anh khã chuyÓn t¶i ®óng nghÜa sang tiÕng ViÖt nªn ®îc gi÷ nguyªn. Chóng em kÝnh mong thÇy th«ng c¶m vµ gãp ý söa ch÷a nh÷ng ®iÓm cha tèt trong b¸o c¸o.
PhÇn I: Giíi thiÖu s¬ bé vÒ nÒn .NET vµ ng«n ng÷ C#
NÕu nh Java ra ®êi, næi tiÕng víi tuyªn bè: “ write once, run anywhere”, th× ngay tõ khi chµo ®êi, C# vµ .NET ®îc c¸c nhµ thiÕt kÕ g¾n víi tuyªn bè: “ Every language, one platform”, cã thÓ t¹m dÞch lµ: mäi ng«n ng÷ ®Òu ch¹y trªn mét nÒn. NÒn ®ã chÝnh lµ .NET ( .NET Framework). VËy .NET lµ g× ? Chóng ta sÏ cïng nhau t×m hiÓu vÒ .NET qua c¸c vÊn ®Ò sau :
Giíi thiÖu chung vÒ nÒn .NET
Nh÷ng ®Æc ®iÓm cña nÒn .NET
Nh÷ng thµnh phÇn cña .NET
I. Giíi thiÖu s¬ bé vÒ .NET
I.1. Giíi thiÖu chung vÒ nÒn .NET (.NET platform)
NÒn .NET lµ mét kh¸i niÖm míi trong khoa häc m¸y tÝnh; nã vît ra ngoµi khu«n khæ cña mét ng«n ng÷ lËp tr×nh, mét bé th viÖn; nã cha ph¶i lµ mét hÖ ®iÒu hµnh, chóng ta cã thÓ hiÓu ®¬n gi¶n nã lµ mét nÒn ®Ó tõ ®ã cã thÓ ph¸t triÓn c¸c øng dông c¶ trªn Windows lÉn trªn Internet thuËn tiÖn h¬n. NÒn .NET ®îc thiÕt kÕ ®Ó phôc vô c¸c môc ®Ých sau:
Cung cÊp mét m«i trêng lËp tr×nh híng ®èi tîng tuyÖt ®èi, m· cña ch¬ng tr×nh ®îc thùc thi trªn mét m¸y hay c÷ng cã thÓ thùc thi tõ mét m¸y tõ xa th«ng qua Internet.
Gi¶m thiÓu tèi ®a xung ®ét gi÷a c¸c version cña mét phÇn mÒm
§em l¹i mét m«i trêng cho phÐp c¸c ng«n ng÷ lËp tr×nh cã thÓ giao tiÕp víi nhau, tÝch hîp víi nhau
Chó ý: chóng ta còng cÇn ph¶i ph©n biÖt gi÷a hai thuËt ng÷: .NET vµ nÒn .NET. .NET bao gåm 3 thµnh phÇn c¬ b¶n :
NÒn .NET: mét nÒn cho phÐp ph¸t triÓn c¸c øng dông
C¸c s¶n phÈm .NET: bao gåm tÊt c¶ c¸c s¶n phÈm cña Microsoft dùa trªn nÒn .NET.
C¸c dÞch vô .NET: c¸c dÞch vô ®îc cung cÊp bëi Microsoft phôc vô cho viÖc ph¸t triÓn c¸c øng dông ch¹y trªn nÒn .NET.
Nh vËy nÒn .NET chØ lµ mét thµnh phÇn cña .NET.
NÒn .NET gåm hai thµnh phÇn chÝnh: Common language runtime ( CLR ) vµ th viÖn líp nÒn .NET. Hai thµnh phÇn nµy sÏ ®îc tr×nh bµy cô thÓ ë nh÷ng phÇn sau.
I.2. KiÕn tróc ph©n líp nÒn .NET
H×nh 1 biÓu diÔn kiÕn tróc nÒn .NET. Mçi ng«n ng÷ thuéc gia ®×nh .NET ( phiªn b¶n ®Çu tiªn gåm c¸c ng«n ng÷ : VC.NET, VB.NET, C#, sau ®ã cã thªm VJ# )
H×nh 1 KiÕn tróc nÒn .NET
®Òu ®îc dÞch sang ng«n ng÷ trung gian Microsoft ( MSIL hay gäi ng¾n lµ IL ) – ng«n ng÷ dùa theo tiªu chuÈn cña Common Language Specification ( CLS ). Cã 3 lo¹i øng dông c¬ b¶n lµ: c¸c øng dông Web, c¸c dÞch vô Web, c¸c øng dông Form trªn Windows. Nh÷ng øng dông nµy sö dông c¸c ®èi tîng, ph¬ng thøc tõ th viÖn líp c¬ së vµ ch¹y trong m«i trêng CLR.
I.3. Nh÷ng ®Æc trng cña nÒn .NET
Nh÷ng ®Æc trng chñ chèt cña nÒn .NET chñ yÕu n»m trong CLR, th viÖn líp c¬ s¬ vµ CLS. Chóng em chØ xin tr×nh bµy mét sè ®Æc trng chóng em cho lµ dÔ nhËn biÕt vµ n¾m b¾t nhÊt
I.3.1. Ph¸t triÓn ®a ng«n ng÷
Tríc ®©y, vÊn ®Ò sö dông ®a ng«n ng÷ ( multilanguage ) hay giao thoa ng«n ng÷ lËp tr×nh ( cross – language ) ®· ®îc ®Ò cËp nhiÒu khi ph¸t triÓn c¸c øng dông. §a ng«n ng÷ cã thÓ hiÓu lµ viÖc sö dông nhiÒu ng«n ng÷ ph¸t triÓn mét øng dung, mçi ng«n ng÷ viÕt lªn mét phÇn øng dông. Víi gi¶i ph¸p nµy, ngêi lËp tr×nh cã thÓ sö dông mét ng«n ng÷ mµ m×nh quen thuéc kÕt hîp sö dông l¹i nh÷ng ®o¹n m· ®îc viÕt trªn nh÷ng ng«n ng÷ kh¸c phï hîp víi môc ®Ých cña mét phÇn ch¬ng tr×nh nhÊt ®Þnh ®Ó x©y dùng lªn mét øng dông hoµn chØnh. Mét ph¬ng ph¸p truyÒn thèng ®Ó thùc hiÖn gi¶i ph¸p nµy lµ x©y dùng nªn c¸c th viÖn ®éng .dll. Ph¬ng ph¸p nµy ®îc ¸p dông trong VS 6.0. Mçi ng«n ng÷ ®Òu cã thÓ x©y dùng nªn mét th viÖn .dll. Mét ng«n ng÷ kh¸c sÏ sö dông file .dll ®ã nh lµ mét phÇn th viÖn cña m×nh. Ph¬ng ph¸p th hai lµ sö dông m« h×nh ®èi tîng híng thµnh phÇn – COM ( trong ®Ò tµi nµy sÏ kh«ng tr×nh bµy vÒ COM, ë ®©y chóng em chØ ®iÓm qua). C¶ hai ph¬ng ph¸p trªn ®Òu sö dông ng«n ng÷ ®Þnh nghÜa giao diÖn ( IDL ). Víi nÒn .NET, chóng ta cã thÓ thùc hiÖn viÖc phèi hîp ng«n ng÷ dÔ dµng h¬n. NÒn .NET cho phÐp ng«n ng÷ nµy cã thÓ tÝch hîp víi ng«n ng÷ kh¸c b»ng viÖc sö dông ng«n ng÷ trung gian lµ MSIL TÊt c¶ c¸c ng«n ng÷ khi so¹n th¶o cã thÓ kh¸c nhau, sau ®ã ®îc dich bëi mét ch¬ng tr×nh dÞch thÝch hîp, chóng ®Òu trë thµnh d¹ng ng«n ng÷ trung gian, kh¸c biÖt gi÷a c¸c ng«n ng÷ hoµn toµn bÞ xo¸ bá. Ng«n ng÷ trung gian sÏ ®îc ®a vµo CLR ®Ó thùc thi.
I.3.2. Ch¬ng tr×nh øng dông ®éc lËp víi hÖ ®iÒu hµnh vµ bé vi xö lÝ
Ng«n ng÷ trung gian IL lµ ng«n ng÷ ®éc lËp víi bé vi xö lÝ, nã lµ ng«n ng÷ ë cÊp cao h¬n ng«n ng÷ m¸y. Khi nµo cÇn thùc thi, IL sÏ ®îc dÞch ra ng«n ng÷ m¸y thÝch hîp. BÊt cø hÖ ®iÒu hµnh nµo hç trî nÒn .NET th× øng dông .NET sÏ ch¹y vµ kh«ng gÆp khã kh¨n g×. §èi víi c¸c hÖ ®iÒu hµnh thuéc hä Windows tõ Win 98 trë nªn ®Òu hç trî nÒn .NET. Th¸ng 6 – 2001, khi míi cho ra ®êi .NET, Microsoft ®· th«ng b¸o r»ng hä ®· ®¹t ®îc tho¶ thuËn ph¸t triÓn .NET trªn Unix, tuy nhiªn ®Õn nay vÉn cha cã kÕt qu¶ chÝnh thøc. Th¸ng 10 – 2001, Microsoft cho phÐp Ximian, ngêi ®· ph¸t triÓn giao diÖn GNOME th«ng dông trªn Linux, ph¸t triÓn mét ch¬ng tr×nh dÞch C# vµ CLR trªn Linux. Phiªn b¶n ®Çu tiªn cã tªn Mono cã thÓ t×m trªn www.go-mono.net. C«ng viÖc hiÖn ®ang tiÕn hµnh ë giai ®o¹n x©y dùng th viÖn c¬ së trªn Linux.
I.3.3. Qu¶n lÝ bé nhí tù ®éng
Rß rØ bé nhí lu«n lµ vÊn ®Ò phøc t¹p trong lËp tr×nh khi ta kh«ng qu¶n lý næi nh÷ng vïng nhí ®· ®îc cÊp ph¸t. Trong Visual Basic, qu¶n lý bé nhí ®îc thùc hiÖn bëi kÜ thuËt ®Õm sè lÇn truy cËp. Trong C vµ C++, c¸ch tèt nhÊt ®Ó qu¶n lý bé nhí lµ tù m×nh tr¶ l¹i cho hÖ ®iÒu hµnh nh÷ng vïng nhí kh«ng dïng n÷a. Trong .NET, cã mét bé phËn lµ GC( Garbage Collection ) lµm nhiÖm vô thu håi l¹i vïng nhí hiÖu qu¶ h¬n nh÷ng c¸ch trªn.
I.3.4. Hç trî phiªn b¶n
Nh÷ng lËp tr×nh viªn ®· tõng lËp tr×nh víi th viÖn ®éng DLL ch¾c h¼n ®Òu biÕt ®Õn thuËt ng÷ ‘DLL Hell’. DLL Hell cã thÓ miªu t¶ nh sau : b¹n ®ang sö dông mét ch¬ng tr×nh øng dông víi mét DLL phiªn b¶n 1.0, sau ®ã b¹n cµi thªm mét øng dông kh¸c còng sö dông mét DLL gièng nh vËy víi phiªn b¶n 1.1. Khi ®ã øng dông c÷ lËp tøc sÏ cã vÊn ®Ò, cã thÓ kh«ng ch¹y. Khi b¹n thay thÕ DLL ®ã víi DLL phï hîp víi øng dông cò th× øng dông míi l¹i kh«ng ch¹y. Trong .NET, c¸c thµnh phÇn cña ®èi tîng lu«n ®îc ph©n t¸ch riªng rÏ, mét øng dông chØ load nh÷ng thµnh phÇn ®· ®îc x©y dùng, kiÓm tra ch¹y thö víi øng dông ®ã. Sau khi mét øng dông ®· cµi ®Æt vµ ch¹y thö thµnh c«ng th× nã lu«n ch¹y. .NET thùc hiÖn vÊn ®Ò nµy b»ng c¸ch sö dông thªm thµnh phÇn lµ assemblies. Nh÷ng thµnh phÇn ®îc ®ãng gãi l¹i trong mét assembly. Assembly cã chøa th«ng tin vÒ phiªn b¶n, vµ CLR trong .NET sÏ sö dông th«ng tin nµy ®Ó n¹p ®óng nh÷ng thµnh phÇn phôc vô cho øng dông
I.4. Nh÷ng thµnh phÇn cña nÒn .NET
Nh chóng ta ®· xem ë phÇn tríc, cã nhiÒu thµnh phÇn trong nÒn .NET. Trong phÇn nµy chóng ta sÏ tr×nh bµy c¸c thµnh phÇn næi bËt vÒ tÝnh chÊt vµ vai trß cña chóng trong c¶ hÖ thèng.
I.4.1. CLR
CLR cã thÓ ®îc coi nh tr¸i tim cña nÒn .NET. CLR n»m ë cÊp cuèi cïng trong s¬ ®å ph©n cÊp cña nÒn .NET, trùc tiÕp giao tiÕp víi hÖ ®iÒu hµnh hay c¸c thiÕt bÞ phÇn cøng. Vai trß cña nã lµ nhËn m· IL, dÞch chuyÓn sang m· m¸y thÝch hîp. Tõ IL trë xuèng CLR gièng nhau cho mäi ng«n ng÷ thuéc dßng .NET, ®iÒu nµy gi¶i quyÕt ®îc vÊn ®Ò ®a ng«n ng÷ trong mét øng dông
Memory Management
Including
Garbage Collection
Execution Support
CIL Compiler
Common Type system
Security
C
I
L
Class
Loader
M
A
C
H
I
N
E
C
O
D
E
H×nh 2 CÊu tróc CLR
I.4.2. M· qu¶n lÝ vµ m· kh«ng qu¶n lÝ ( Managed/Unmanaged Code )
Nh÷ng m· ®îc so¹n th¶o, dÞch nh»m môc ®Ých ®îc ch¹y trong m«i trêng CLR th× ®îc gäi lµ m· m· qu¶n lÝ ( managed code ). Cã thÓ hiÓu ®¬n gi¶n h¬n, m· qu¶n lÝ lµ lo¹i m· mµ ch¬ng tr×nh thùc thi m· ®ã ®îc qu¶n lÝ bëi CLR vµ nã ®îc thõa hëng mäi dÞch vô mµ CLR cã. Th«ng thêng, m· qu¶n lÝ lµ nh÷ng m· ®îc tÝch hîp s½n ë trong c¸c th viÖn líp hay nh÷ng m· ®îc dÞch bëi mét ch¬ng tr×nh dÞch tu©n theo chuÈn CLS t¹o ra ng«n ng÷ trung gian. M· kh«ng qu¶n lÝ (unmanaged code) lµ nh÷ng m· kh«ng ®îc so¹n th¶o, dÞch trong m«i trêng .NET vµ kh«ng nh»m môc ®Ých ch¹y trong CLR tuy nhiªn CLR vÉn n¹p nh÷ng m· nµy vµo ch¹y, nã chØ kh«ng hç trî c¸c dÞch vô cho lo¹i m· nµy. §iÓn h×nh cho lo¹i m· nµy lµ c¸c th viÖn DLL cã tõ tríc .NET vµ th viÖn Windows APIs, nh÷ng ch¬ng tr×nh .NET sö dông Windows APIs cã nghÜa lµ nã ®· sö dông m· kh«ng qu¶n lý.
I.4.3. Ng«n ng÷ trung gian , hÖ thèng kiÓu th«ng thêng vµ CLS
Ng«n ng÷ trung gian MSIL trong .NET, hÖ thèng kiÓu th«ng thêng vµ CLS lµ 3 yÕu tè g¾n liÒn víi nhau t¹o nªn kh¶ n¨ng phèi hîp ®a ng«n ng÷ vµ ®éc lËp víi m«i trêng cña c¸c øng dông .NET.
HÖ thèng kiÓu th«ng thêng ( common type system ) bao gåm c¸c kiÓu d÷ liÖu mµ c¸c ng«n ng÷ .NET cã thÓ sö dông còng nh qui c¸ch ngêi dïng ph¶i tu©n theo ®Ó x©y dùng nªn nh÷ng kiÓu d÷ liÖu cña ngêi dïng. C¸c kiÓu d÷ liÖu trong hÖ thèng kiÓu th«ng thêng ®îc chia thµnh 2 lo¹i :
Lo¹i tham trÞ: nh÷ng kiÓu tham trÞ trùc tiÕp lu tr÷ c¸c d÷ liÖu, ®îc cÊp ph¸t ë vïng nhí stack. Nh÷ng d÷ liÖu kiÓu nµy thêng lµ kiÓu d÷ liÖu x©y dùng s½n nh Int, long, boolean,.. hay kiÓu struct do ngêi dïng ®Þnh nghÜa.
Lo¹i tham biÕn: kiÓu tham biÕn la gi÷ ®Þa chØ chØ tíi mét vïng d÷ liÖu, chóng ®îc cÊp ph¸t ë vïng nhí Heap. Nh÷ng d÷ liÖu kiÓu nµy thêng lµ c¸c biÕn ®èi tîng.
CLS ( common language specification) lµ mét tËp hîp c¸c ®Æc ®iÓm ng«n ng÷ mµ tÊt c¶ c¸c ng«n ng÷ lËp tr×nh trªn .NET ph¶i tu©n theo, nã còng bao gåm c¸c kiÓu d÷ liÖu vµ c¸c qui c¸ch trong hÖ thèng kiÓu th«ng thêng. Nh÷ng ngêi muèn ph¸t triÓn mét ng«n ng÷ trªn .NET th× còng ph¶i dùa theo CLS ®Ó x©y dùng ch¬ng tr×nh dÞch gäi lµ ch¬ng tr×nh dÞch CLS .
Ng«n ng÷ trung gian IL ®îc dÞch ra tõ m· nguån cña mét ng«n ng÷ lËp tr×nh cÊp cao b»ng mét ch¬ng tr×nh dÞch CLS, ng«n ng÷ trung gian IL sau ®ã ®îc CLR dÞch l¹i mét lÇn n÷a ra m· m¸y ®Ó thùc thi.
I.4.4. Th viÖn líp c¬ së cña .NET
.NET cã mét th viÖn ®è sé nh÷ng kiÓu d÷ liÖu cã thÓ sö dông l¹i, ®îc tÝch hîp chÆt chÏ víi CLR. Th viÖn líp nµy hoµn toµn híng ®èi tîng, cung cÊp nh÷ng kiÓu d÷ liÖu mµ chóng ta cã thÓ sö dông rÊt nhiÒu chøc n¨ng tõ ®ã. Nhê sö dông th viÖn líp c¬ së chóng ta cã thÓ ph¸t triÓn c¸c kiÓu øng dông sau:
øng dông vµo ra Console
Nh÷ng øng dông Windows víi giao diÖn ®å ho¹
Nh÷ng øng dông ASP.NET
DÞch vô Web
C¸c th viÖn
Khi muèn lËp tr×nh trªn Windows chóng ta cã thÓ sö dung c¸c líp Form, Button, CheckBox, Text… ®Ó ph¸t triÓn c¸c giao diÖn ®å ho¹. Khi muèn ph¸t triÓn mét øng dông Web, chóng ta cã thÓ sö dông c¸c líp Web Forms. TÊt c¶ c¸c ng«n ng÷ cña .NET ®Òu sö dông th viÖn nµy, ®iÒu nµy lµm cho viÖc sö dông ®a ng«n ng÷ còng dÔ dµng h¬n.
I.4.5. Assembly vµ metadata
NÕu chóng ta muèn tr×nh bµy kÜ vÒ assembly vµ metadata th× cÇn ph¶i cã mét ®Ò tµi chuyªn vÒ m¶ng nµy, trong giíi h¹n ®Ò tµi nµy, chóng em chØ xin tr×nh bµy mang tÝnh kh¸i niÖm vÒ hai vÊn ®Ò trªn. Assembly cã thÓ hiÓu nh lµ mét gãi c¶ m· ch¬ng tr×nh, c¸c thµnh phÇn, c¸c tµi nguyªn. Mét assembly bao gåm th«ng tin metadata, m· ch¬ng tr×nh ë d¹ng IL, c¸c file tµi nguyªn vÝ dô nh c¸c file ¶nh, ©m nh¹c, c¸c th viÖn thµnh phÇn.
Metadata lµ tËp hîp d÷ liÖu ë d¹ng nhÞ ph©n diÔn t¶ c¸c thµnh phÇn cña ch¬ng tr×nh. Metadata ®îc lu tr÷ ë file cã thÓ thùc thi ( executable hay .exe , .dll) cïng víi m· IL cña ch¬ng tr×nh. Metadata chøa nh÷ng lo¹i d÷ liÖu cô thÓ sau:
Tªn assembly
Sè hiÖu phiªn b¶n
Culture : th«ng tin vÒ lo¹i ng«n ng÷ mµ assembly hç trî
Th«ng tin vÒ strong name
Danh s¸ch tÊt c¶ c¸c file ®îc ®ãng gãi
Th«ng tin vÒ tham chiÕu kiÓu d÷ liÖu: CLR sö dông th«ng tin nµy ®Ó t×m ra nh÷ng file ®Þnh nghÜ kiÓu d÷ liÖu ®ã.
Th«ng tin phôc vô cho tham chiÕu ®Õn c¸c assembly kh¸c
CLR hoµn toµn dùa nh÷ng th«ng tin nµy ®Ó ®iÒu khiÓn øng dông. Assembly vµ metadata ®îc t¹o ra ngay khi ta biªn dÞch m· nguån
I.4.6. Ch¬ng tr×nh dÞch Just in time
Ch¬ng tr×nh dÞch Just In Time lµ n»m trong CLR, cã nhiÖm vô chuyÓn m· IL sang m· m¸y thÝch hîp. Trong .NET cã 3 lo¹i ch¬ng tr×nh dÞch JIT:
Pre-JIT: lo¹i JIT nµy dÞch ngay toµn bé m· IL sang m· m¸y khi nã ®îc gäi tíi.
Econo-JIT: lo¹i nµy sö dông cho c¸c hÖ thèng h¹n chÕ bé nhí, nã dÞch m· IL sang m· m¸y tõng bit mét, nh÷ng m· m¸y sau khi ®îc dÞch vµ ®a vµo thùc thi nã cßn ®îc ®Ó ë vïng nhí ®Öm, nÕu hÕt vïng nhí ®Öm JIT sÏ xo¸ c¸c m· m¸y nµy.
Normal JIT: ®©y lµ lo¹i ngÇm ®Þnh, dÞch m· IL chØ khi nã ®îc gäi tíi, m· m¸y sau khi dÞch sÏ ®îc ®a vµo thùc thi ®ßng thêi ®îc ®Æt vµo trong bé nhí ®Öm.
I.4.7. Qu¶n lÝ bé nhí ( Garbage Collection )
Nh÷ng ngêi lËp tr×nh thêng gÆp nhiÒu khã kh¨n khi gi¶i quyÕt vÊn ®Ò cÊp ph¸t bé nhí, rß rØ bé nhí, c«ng viÖc nµy lµm gi¶m n¨ng suÊt lËp tr×nh. §Ó gi¶i quyÕt vÊn ®Ò nµy, .NET ®a ra hÖ thèng thu gom bé nhí GC. Khi ch¬ng tr×nh ®ßi cÊp ph¸t thªm bé nhí, bé phËn cÊp ph¸t bé nhí trong phÇn qu¶n lÝ bé nhí trong CLR sÏ thc hiÖn, nÕu kh«ng cßn ®ñ bé nhí nã sÏ th«ng b¸o lµ kh«ng cßn bé nhí ®Ó cÊp ph¸t. GC b¾t ch¹y, nã gi¶ ®Þnh r»ng tÊt c¶ mäi thø trong bé nhí ®Òu cã thÓ thu håi. Sau ®ã, nã xem toµn bé bé nhí dµnh cho ch¬ng tr×nh øng dông, x©y dùng nªn mét ®å thÞ diÔn t¶ tÊt c¶ c¸c vïng bé nhí ®îc tham chiÕu bëi ch¬ng tr×nh vµ tham chiÕu lÉn nhau. Sau x©y dùng xong ®å thÞ, GC tiÕn hµnh thu gän bé nhí Heap b»ng c¸ch di chuyÓn tÊt c¶ c¸c vïng nhí thËt sù dïng vÒ vÞ trÝ míi b¾t ®Çu t¹i mét vïng nhí Heap cßn trèng. Cuèi cïng nã cËp nhËt l¹i c¸c con trá trá ®Õn c¸c vïng bé nhí võa ®îc di chuyÓn. Chóng ta cã thÓ thÊy dêng nh GC thùc hiÖn rÊt nhiÒu viÖc, tuy nhiªn nã ®îc thùc thùc hiÖn tù ®éng b»ng CLR, gi¶m nhÑ ®i rÊt nhiÒu c«ng viÖc cña ngêi lËp tr×nh.
I.4.8. Vßng ®êi cña m·
Trong phÇn nµy, chóng em sÏ giíi thiÖu vÒ tr×nh lµm viÖc cña mét øng dông .NET tõ khi so¹n th¶o m· nguån ®Õn khi ch¹y ch¬ng tr×nh :
B¾t ®Çu tõ viÖc so¹n th¶o m· nguån trªn mét ng«n ng÷ .NET quen thuéc trªn mét hÖ so¹n th¶o v¨n b¶n th«ng thêng.
Dïng mét ch¬ng tr×nh dÞch .NET dÞch m· nguån ra m· IL, ®ång thêi x©y dùng assembly cho øng dông.
Khi ch¬ng tr×nh øng dông thùc thi, hÖ ®iÒu hµnh sÏ ®äc header cña ch¬ng tr×nh vµ ®a CLR vµo qu¶n lÝ ch¬ng tr×nh, CLR ®äc c¸c th«ng tin metadata, ®iÒu khiÓn Loader n¹p c¸c th viÖn cÇn thiÕt vµo bé nhí.
Hµm _CorExeMain ®îc chÌn vµo ®iÓm nhËp cña ch¬ng tr×nh.
Bé phËn Loader nh¶y vµo ®iÓm nhËp ch¬ng tr×nh vµ gäi hµm _CorExeMain thùc thi.
Khi _CorExeMain thùc thi, nã gäi ch¬ng tr×nh dÞch JIT ra thùc thi.
JIT dÞch m· IL sang m· m¸y vµ ®a vµo thùc thi ®ång thêi ®îc dù tr÷ ë bé nhí ®Öm ®Ó khi cÇn kh«ng ph¶i dÞch l¹i.
II. Giíi thiÖu s¬ bé ng«n ng÷ lËp tr×nh C#
Cã thÓ coi ng«n ng÷ lËp tr×nh C# lµ ng«n ng÷ lËp tr×nh ®¬n gi¶n v× nã chØ cã kho¶ng 80 tõ kho¸ vµ kho¶ng 12 kiÓu d÷ liÖu x©y dùng s½n ( built-in) tuy nhiªn nã hç trî tÊt c¶ c¸c m« h×nh lËp tr×nh : lËp tr×nh cÊu tróc, lËp tr×nh híng ®èi tîng vµ lËp tr×nh híng thµnh phÇn ( COM ).
II.1. LËp tr×nh híng ®èi tîng trong C#
C# lµ ng«n ng÷ hoµn toµn híng ®èi tîng. TÝnh chÊt híng ®èi tîng cã thÓ tr×nh bµy tãm t¾t nh sau:
“TÊt c¶ ®Òu lµ ®èi tîng”. Trong C#, mäi thùc thÓ ®Òu ®îc biÓu diÔn lµ ®èi tîng, ®i cïng víi nã lµ c¸c thuéc tÝnh, hµnh vi ( method ) cña thùc thÓ ®ã. Nh vËy, mét thuéc tÝnh hay mét method ch¾c ch¾n ph¶i thuéc vÒ mét ®èi tîng nµo ®ã.
Mét ch¬ng tr×nh øng dông bao gåm nhiÒu ®èi tîng. Khi chóng muèn mét ®èi tîng thùc hiÖn mét c«ng viÖc hay ®èi tîng nµy muèn ®èi tîng kia thùc hiÖn mét c«ng viÖc, chóng ta hay c¸c ®èi tîng giao tiÕp víi nhau b»ng c¸ch göi th«ng ®iÖp. Th«ng ®iÖp cã thÓ hiÓu nh mét lêi gäi hµm gäi mét method cña ®èi tîng nµo ®ã lµm viÖc.
Mçi ®èi tîng cã mét vïng nhí riªng.
Mçi ®èi tîng cã mét kiÓu d÷ liÖu riªng, kiÓu d÷ liÖu ®îc ®Þnh nghÜa bëi mét class ( líp ).
Mçi ®èi tîng cã mét giao diÖn ®Ó giao tiÕp víi c¸c ®èi tîng kh¸c vµ mét phÇn d÷ liÖu ®îc che giÊu ®èi víi c¸c ®èi tîng kh¸c.
Ngoµi ra, C# cóng cho phÐp ngêi lËp tr×nh thùc hiÖn c¸c ho¹t ®éng sö dông l¹i d÷ liÖu nh kÕ thõa, ®a h×nh th¸i vµ kÕt tËp.
II.2. Nh÷ng ®Æc ®iÓm cña ng«n ng÷ C#
C# ®îc x©y dùng tõ nh÷ng ng«n ng÷ tiÒn ®Æc biÖt lµ C vµ C++ cho nªn nh÷ng ®Æc ®iÓm ng«n ng÷ cña C# rÊt gièng víi ng«n ng÷ C, C++. Trong phÇn nµy, chóng em sÏ tr×nh bµy mét vµi ®Æc ®iÓm cña C#.
II.2.1. C¸c to¸n tö
Trong C# cã c¸c to¸n tö th«ng thêng sau:
C¸c to¸n tö mét to¸n h¹ng: ++,- -, !,~
C¸c to¸n tö hai to¸n h¹ng: *, /, %, +, -
C¸c to¸n tö g¸n: =, *=, /=, %=, +=, -=, >=, &=, ^=, !=
C¸c to¸n tö quan hÖ: , =, is, as, ==, !=
C¸c to¸n tö l«- gÝc: &, ^, !, &, |, >
C¸c to¸n tö ®iÒu kiÖn: &&, ||, ?:
To¸n tö sizeof x¸c ®Þnh kÝch thíc mét kiÓu d÷ liÖu.
Trong C# còng cho phÐp chång to¸n tö vµ ®Þnh nghÜa c¸c to¸n tö míi theo c¸c qui t¾c sau:
To¸n tö mét to¸n h¹ng: type_of_x operation op(x)
To¸n tö hai to¸n h¹ng: type_of_x,y operation op(x,y)
Trong C# kh«ng cho phÐp ®Þnh nghÜa l¹i to¸n tö g¸n.
II.2.2. C¸c kiÓu d÷ liÖu:
C# hç trî hai lo¹i kiÓu d÷ liÖu lµ kiÓu tham trÞ vµ kiÓu tham biÕn. KiÓu tham trÞ bao gåm c¸c kiÓu ®¬n gi¶n nh char, int, float. KiÓu tham biÕn gåm c¸c kiÓu líp, kiÓu Interface, kiÓu m¶ng hay nãi c¸ch kh¸c tÊt c¶ c¸c ®èi tîng ®Òu lµ tham biÔn.
KiÓu tham trÞ kh¸c kiÓu tham biÕn ë chç: nh÷ng biÕn tham trÞ la tr÷ trùc tiÕp d÷ liÖu cña nã, tr¸i l¹i biÕn tham biÕn la tr÷ con trá trá tíi ®èi tîng.
C# cung cÊp mét tËp c¸c kiÓu ®îc ®Þnh nghÜa tríc hÇu hÕt ®· cã trong C vµ C++. Ngoµi ra , C# l¹i ®a thªm vµo kiÓu boolean, string gièng nh trong Pascal.
C# cho phÐp chuyÓn kiÓu gièng nh C nµ C++.
II.2.3. C¸c c©u lÖnh
C# kÕ thõa hÇu hÕt c¸c c©u lÖnh tõ C vµ C++, tuy nhiªn còng cã mét vµi bæ xung vµ thay ®æi ®¸nh chó ý. Chóng ta sÏ ®iÓm qua c¸c c©u lÖnh sau:
C¸c lÖnh ®îc g¸n nh·n vµ lÖnh goto: c¸c lÖnh ®îc g¾n nh½n cã mét nh·n ®øng ®»ng tríc. C¸c lÖnh goto sÏ nh¶y ®Õn c¸c nh·n nµy vµ thùc thi c©u lÖnh ®îc g¸n nh·n
LÑnh if: lÖnh if sÏ chän mét biÓu thøc ®Ó lµm viÖc dùa trªn gi¸ trÞ mét biÓu thøc l«- gic . Mét lÖnh if cã thÓ cã thªm lÖnh else ®Ó thùc thi c©u lÖnh kh¸c khi gi¸ trÞ biÓu thøc lµ sai.
LÖnh swich: lÖnh switch thùc thi mét nh÷ng lÖnh phô thuéc vµo gi¸ trÞ mét biÓu thøc cho tríc.
C¸c lÖnh lÆp: c¸c lÖnh lÆp trong C# bao gåm c¸c lÖnh lÆp while, do – while, for nh trong C
LÖnh lÆp foreach ( gièng nh trong VB): mét lÖnh lÆp foreach liÖt kª c¸c thµnh phÇn trong mét tËp hîp, thùc thi mét c©u lÖnh cho mçi thµnh phÇn cña tËp hîp ®ã.
C¸c lÖnh throw, try, catch: c¸c lÖnh phôc vô cho qu¸ tr×nh qu¶n lÝ lçi trong thêi gian ch¹y ( runtime – error ) gåm cã ph¸t ra mét lçi ( throw ), cÆp lÖnh try – catch ®ãn nhËn mét lçi vµ ®a ra hµnh ®éng xö lÝ lçi.
II.2.4. CÊu t¹o cña mét ch¬ng tr×nh C#
NÕu nh trong C, ®¬n vÞ ch¬ng tr×nh lín nhÊt lµ c¸c hµm ( modul), trong Java vµ C++, ®¬n vÞ ch¬ng tr×nh lín nhÊt lµ c¸c líp ( class) th× trong C#, ®¬n vÞ ch¬ng tr×nh lín nhÊt lµ kh«ng gian tªn (namespace). Mét ch¬ng tr×nh C# chøa mét hay nhiÒu kh«ng gian tªn, trong ®ã mét kh«ng gian tªn chøa d÷ liÖu cña ch¬ng tr×nh, c¸c kh«ng gian tªn cßn l¹i lµ c¸c kh«ng gian tªn chøa phÇn d÷ liÖu ë c¸c ch¬ng tr×nh kh¸c ®îc khai b¸o víi tõ kho¸ using sö dông nh lµ phÇn th viÖn, vÝ dô :
Namespace 1:
namespace Microsoft.CSharp.Introduction
{
public class HelloMessage
{
public string GetMessage() {
return "Hello, world";
}
}
}
Namespace 2:
using Microsoft.CSharp.Introduction;
class Hello
{
static void Main() {
HelloMessage m = new HelloMessage();
System.Console.WriteLine(m.GetMessage());
}
}
Trong mét namespace cã thÓ lång mét hay nhiÒu namespace kh¸c, vÝ dô:
namespace Microsoft
{
namespace CSharp
{
namespace Introduction
{....}
}
}
Díi namespace lµ c¸c ®¬n vÞ ch¬ng tr×nh cã thÓ coi lµ cïng cÊp : líp (class), cÊu tróc (struct), giao diÖn (Interface).
Líp: líp ®îc dïng ®Ó ®Þnh nghÜa nh÷ng kiÓu ®èi tîng míi. Trong mét líp cã thÓ cã c¸c h»ng sè, c¸c trêng, ph¬ng thøc, thuéc tÝnh, sù kiÖn, to¸n tö, hµm dùng, hµm huû. §èi víi mçi thµnh phÇn cña líp th× cã c¸c thuéc tÝnh truy cËp sau:
public: tÊt c¶ c¸c ®èi tîng kh¸c ®Òu cã thÓ truy cËp ®Õn c¸c thµnh phÇn nµy.
protected: chØ nh÷ng ®èi tîng kÕ thõa tõ mét ®èi tîng míi cã thÓ truy cËp vµo thµnh phÇn protected cña líp cha.
Internal: nh÷ng ®èi tîng ®îc ®Þnh nghÜa trong mét assembly ( c¸c file ®Þnh nghÜa chóng cïng n»m trong 1 assembly) cã thÓ truy cËp nh÷ng thµnh phÇn Internal cña nhau. Nh÷ng thµnh phÇn Internal lµ nh÷ng thµnh phÇn kh«ng khai b¸o thuéc tÝnh truy cËp.
Private: thµnh phÇn nµy chØ ®îc truy cËp tõ nh÷ng thµnh phÇn trong cïng 1 líp.
CÊu tróc ( struct): chóng ta cã thÓ x©y dùng mét lo¹i struct n»m ngoµi c¸c líp vµ n»m trong 1 namespace nªn cã thÓ coi nã lµ mét ®¬n vÞ ch¬ng tr×nh ngang víi class. Struct còng kh¸ gièng víi class khi nã còng cã c¸c biÕn d÷ liÖu thµnh phÇn víi thuéc tÝnh truy cËp cña chóng, hµm khëi t¹o. Tuy nhiªn struct l¹i lµ d÷ liÖu kiÓu tham trÞ cßn class lµ d÷ liÖu kiÓu tham biÕn, struct kh«ng cho phÐp kÕ thõa.
Giao diÖn ( Interface ): ng«n ng÷ C++ cho phÐp ®a thõa kÕ, tõ ®ã sinh ra c¸c nhËp nh»ng, r¾c rèi khi truy cËp c¸c thµnh phÇn cña c¸c líp cha. Trong C# kh«ng cho phÐp chóng ta thùc hiÖn ®a thõa kÕ tõ nhiÒu líp. Tuy nhiªn ®Ó thùc hiÖn ®a thõa kÕ, C# t¹o ra mét ®¬n vÞ ch¬ng tr×nh míi lµ Interface, thay v× khai b¸o thõa kÕ tõ nhiÒu líp, chóng ta cã thÓ khai b¸o thõa kÕ tõ mét líp vµ thùc thi nhiÒu Interface. Qua ®ã, chóng ta còng cã thÓ thùc hiÖn ®a kÕ thõa. Mét Interface cã thÓ chøa c¸c ph¬ng thøc, thuéc tÝnh, sù kiÖn…, vÝ dô:
interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);
Mäi øng dông trªn C# ®Òu cã hµm main. Hµm main chÝnh lµ ®iÓm vµo cña ch¬ng tr×nh (entry point), ch¬ng tr×nh b¾t ®Çu tõ hµm main vµ kÕt thóc ë ®©y. Trong hµm main chóng ta cã thÓ khëi t¹o c¸c ®èi tîng ( trong lËp tr×nh giao diÖn Windows) hay gäi c¸c hµm kh¸c thùc thi ( trong lËp tr×nh Console ). Hµm main ph¶i lµ static vµ x©y dùng trong mét líp, cã thÓ tr¶ l¹i gi¸ trÞ Int hay kh«ng tr¶ vÒ gi¸ trÞ.
II.3. C# vµ nh÷ng vÊn ®Ò n©ng cao
II.3.1. C# víi c¬ së d÷ liÖu
C# cho phÐp thao t¸c thuËn tiÖn víi c¸c lo¹i c¬ së d÷ liÖu SQL Server 2000, MS access, Oracle,… b»ng th viÖn líp ADO.NET. ADO.NET lµ phiªn b¶n míi nhÊt cña chiÕn lîc truy cËp c¬ së d÷ liÖu v¹n n¨ng cña Microsoft. Th viÖn líp ADO.NET chia thµnh 2 lo¹i lµ líp kÕt nèi vµ líp kh«ng kÕt nèi. Líp kÕt nèi lµ tr×nh ®iÒu khiÓn kÕt nèi c¬ së d÷ liÖu (Data Provider) cô thÓ, cã nghÜa lµ chóng ta ph¶i sö dông mét .NET Data Provider mµ chóng hç trî c¬ së d÷ liÖu cÇn lµm viÖc. Trong khi ®ã líp kh«ng kÕt nèi sö dông bÊt k× .NET data Provider nµo. Khi chóng ta cÇn thiÕt ph¶i truy cËp, xö lÝ d÷ liÖu nguån víi c¸c thao t¸c select, insert, delete, update chóng ta ph¶i sö dông líp kÕt nèi, ngîc l¹i nÕu chØ thao t¸c trªn d÷ liÖu t¹m thêi th× dïng líp kh«ng kÕt nèi.
Lo¹i líp kÕt nèi gåm 4 líp sau:
Connection: Líp kÕt nèi c¬ së d÷ liÖu.
DataAdapter: Líp chøa d÷ liÖu.
Command: líp chøa lÖnh.
DataReader: Líp ®äc d÷ liÖu.
Lo¹i líp kh«ng kÕt nèi gåm c¸c líp sau:
Líp DataSet: DataSet n¾m gi÷ Tables vµ Relations
Líp DataTable: DataTable n¾m gi÷ c¸c Rows, Column
Líp DataView: DataView t¹o nªn c¸c view cho d÷ liÖu
II.3.2. C# víi Internet
Tõ gi÷a nh÷ng n¨m 90, thÕ giíi lËp tr×nh cã sù thay ®æi tõ lËp tr×nh øng dông trªn c¸c m¸y riªng lÎ chuyÓn sang lËp tr×nh c¸c øng dông trªn Internet. C¸c ch¬ng tr×nh øng dông trªn Web cã c¸c u ®iÓm nh : chi phÝ thÊp, truy cËp thuËn tiÖn tõ c¸c n¬i kh¸c nhau…§èi víi c¸c site tÜnh (static site) dï lµ ®¬n gi¶n nhÊt còng cÇn ph¶i lËp tr×nh ®Ó qu¶n lÝ Web Form. Líp HttpHandler cung cÊp nh÷ng ph¬ng thøc ®¬n gi¶n, râ rµng ®Ó qu¶n lÝ c¸c Web Form. §èi víi c¸c site ®éng (Dynamic site), ASP.NET lµ th viÖn hoµn h¶o ®Ó t¹o ra nh÷ng trang Web cã néi dung thay ®æi theo thêi gian ®Æc biÖt lµ th¬ng m¹i ®iÖn tö. §èi víi m¹ng ngang hµng Peer-To-Peer, C# cã c¸c c«ng cô m¹nh ®Ó t¹o nªn c¸c hÖ thèng m¹ng ngang hµng cã kh¶ n¨ng chia sÎ c¸c tµi nguyªn.
PhÇn II: §å häa trong C#
Đồ họa là một phần không thể thiếu trong các ngôn ngữ lập trình cũng như các bộ công cụ phát triển nhất là trong thời đại các giao diện đồ họa người sử dụng phát triển mạnh như hiện nay. Thực tế là hiện nay giao diện đẹp và thân thiện đóng góp một phần không nhỏ trong thành công của các phần mềm. Trong phần này chúng ta sẽ khảo sát các công cụ đồ họa GDI+ của C# và tổng quát hơn là của môi trường phát triển ứng dụng .NET.
I. Giíi thiÖu vÒ GDI+
GDI+ là một phân hệ của hệ điều hành MS Windows XP cung cấp những tính năng dựng hình 2D cơ bản như đồ họa vector, xử lý hình ảnh. Đúng như tên của nó đã hàm ý, GDI+ là phiên bản cải tiến của GDI (thế hệ giao diện thiết bị đồ họa trước của Windows). Nó chịu trách nhiệm hiển thị và dựng hình trên màn hình, máy in. GDI+ được trang bị thêm nhiều tính năng mới và tối ưu các tính năng sẵn có.
GDI+ cho phép lập trình viên viết mã độc lập ứng dụng. Điều này có nghĩa là lập trình viên chỉ việc viết mã để hiển thị thông tin mà không cần quan tâm đến thiết bị hiển thị cụ thể bên dưới. Người lập trình chỉ việc gọi các hàm cung cấp bởi các lớp của GDI+ và các hàm này đến lượt chúng sẽ chịu trách nhiệm giao tiếp với một driver của thiết bị cụ thể. GDI cách ly ứng dụng khỏi phần cứng và như vậy cho phép lập trình viên viết mã độc lập thiết bị.
Các lớp được quản lý của GDI+ là một phần của kiến trúc Microsoft .NET, môi trường để xây dựng, phân phối và chạy các dịch vụ Web XML và các ứng dụng khác.
II. KiÕn tróc cña GDI+
Các dịch vụ của GDI+ được chia thành 3 lớp rộng sau:
Hình học vector 2D
Hình ảnh.
Typography.
Sau đây chúng ta sẽ xem xét lần lượt từng lớp này:
II.1. §å häa Vector 2D
Đồ họa vector liên quan đến việc vẽ các thực thể đồ họa cơ sở như đường thẳng, đường cong hay khối hình được cho bởi một tập hợp các điểm trên một hệ tọa độ. Ví dụ, một đường thẳng có thể được xác định bằng 2 điểm cuối của nó, 1 hình chữ nhật có thể được xác định bằng cách chỉ ra 1 điểm xác định đỉnh trái trên và 1 cặp số xác định chiều cao và chiều rộng của nó. Một đồ thị đơn giản có thể được xác định bởi 1 mảng các điểm được nối với nhau bởi đường thẳng. 1 đường Bézier spline là một đường cong tinh vi được xác định bởi 4 điểm điều khiển.
GDI+ cung cấp các lớp và cấu trúc lưu trữ thông tin về các thực thể cơ sở, các lớp lưu trữ thông tin về cách thức mà các thực thể này được dựng và các lớp chịu trách nhiệm hiển thị hình ảnh lên thiết bị. Ví dụ, cấu trúc Rectangle lưu trữ thông tin về vị trí và kích cỡ của hình chữ nhật; lớp Pen lưu trữ thông tin về màu sắc, độ rộng đường thẳng và kiểu đường thẳng; Còn lớp Graphics có các phương thức cho dựng đường thẳng, hình chữ nhật, đồ thị và các hình hình học khác. Còn có thêm vài lớp Brush lưu trữ thông tin về cách thức mà các hình này được tô màu.
Ta có thể ghi lại hình ảnh vector (thực chất là một chuỗi các lệnh dựng hình) trong một metafile. GDI+ cung cấp lớp Metafile để ghi lại, hiển thị và lưu các metafile. Các lớp MetafileHeader và MetaHeader cho phép ta lưu trữ thông tin trong phần header của metafile.
II.2. H×nh ¶nh
Có một số loại hình ảnh có thể rất khó hoặc không thể được hiển thị với các kỹ thuật của đồ họa vector. Ví dụ, hình ảnh trên thanh công cụ hoặc các hình icon có thể khó mô tả bởi một tập các đường thẳng và đường cong. Một bức ảnh độ phân giải cao thậm chí còn khó tạo hơn với các ký thuật đồ họa vector. Các hình ảnh dạng này được lưu trữ dưới dạng các ảnh bitmap (một dãy các số biểu diễn màu sắc của từng điểm trên màn hình. GDI+ cung cấp lớp Bitmap để xử lý, hiển thị và lưu các ảnh bitmap.
II.3. In Ên và hiÓn thÞ font ch÷
Phần in ấn và hiển thị font chữ chịu trách nhiệm hiển thị văn bản bằng nhiều loại font, cỡ chữ và kiều khác nhau. GDI+ cung cấp một số lượng rất ấn tượng hỗ trợ cho các nhiệm vụ phức tạp này. Một trong những các đặc tính mới của GDI+ là chống răng cưa, cho phép hiển thị chữ viết mịn hơn trên các màn hình CRT phẳng và màn hình LCD.
III. KiÕn tróc líp cña GDI+
Giao diện lớp được quản lý của GDI+ chứa 60 lớp, 50 kiểu liệt kê, 8 kiểu cấu trúc. Lớp Graphics là phần trung tâm của các chức năng của GDI+, nó chịu trách nhiệm dựng đường thẳng, đường cong, hình ảnh và văn bản.
Rất nhiều lớp khác hoạt động chung với lớp Graphics. Ví dụ, phương thức Graphics.DrawLine sử dụng một đối tượng Pen lưu trữ các thông tin về màu sắc, độ rộng, kiểu mẫu... của đường thẳng cần vẽ. Phương thức Graphics.FillRectangle có thể nhận 1 con trỏ đến một đối tượng LinearGradientBrush, nó chịu trách nhiệm tô màu cho một hình chữ nhật có đổi màu theo 1 bảng màu Gradient. Các đối tượng Font và StringFormat tác động lên cách thức mà đối tượng Graphics sẽ hiển thị văn bản. Một đối tượng Matrix lưu trữ và thực hiện các thao tác chuyển đổi tọa độ trong đối tượng Graphics được dùng để thực hiện các phép quay, tỉ lệ và lật ảnh.
GDI+ cung cấp một vài cấu trúc (ví dụ như Rectangle, Point hay Size) để tổ chức dữ liệu đồ họa. Một vài lớp khác cũng phục vụ chủ yếu cho mục đích lưu trữ các cấu trúc dữ liệu. Ví dụ lớp BitmapData hỗ trợ lớp Bitmap, lớp PathData hỗ trợ cho lớp GraphicsPath.
GDI+ định nghĩa một vài kiểu liệt kê. Chúng là các tập hợp của các hằng có liên quan. Ví dụ, tập liệt kê LineJoin bao gồm các thành phần Bevel, Milter và Round xác định các kiểu nối 2 đoạn thẳng.
IV. Mét sè ®iÓm míi trong GDI+
IV.1. Bót vÏ Gradient
GDI+ mở rộng tính năng của GDI bằng cách thêm các bút vẽ gradient để tô màu hình vẽ, đường thẳng và miền hình vẽ. Ta có thể dùng một bút vẽ Gradient tuyến tính để phủ màu một hình vẽ với màu sắc thay đổi dần dần qua từng vùng trong hình vẽ này. Hình vẽ sau minh họa điều này.
H×nh 3 T« mµu b»ng bót vÏ Gradient tuyÕn tÝnh
Khi ta phủ một hình vẽ với một bút vẽ gradient có rất nhiều tùy chọn quy định cách thức màu sắc sẽ thay đổi từ vùng này đến vùng khác của hình. Một lựa chọn là quy định màu ở trung tâm và màu ở biên, như vậy các điểm ảnh sẽ thay đổi màu sắc một cách từ từ tính từ trung tâm ra biên. Hình sau minh họa của một ảnh được tạo ra từ một cặp đường Bézier được tô bởi một bút phủ Gradient.
H×nh 4 §êng BÐzier ®îc t« bëi bót phñ Gradient
IV.2. §êng cong Spline
GDI+ hỗ trợ đường cong Spline. Một đường cong Spline là một chuỗi các đường cong độc lập được hợp lại để tạo thành một đường cong lớn hơn. Đường spline được xác định bởi một mảng các điểm và đi qua tất cả các điểm trong mảng đó. Một đường spline là 1 đường cong trơn đi qua các mỗi điểm trong mảng. Hình sau cho thấy 2 đồ thị: 1 đường được tạo bởi 1 đường cong spline và đường còn lại được tạo bằng cách nối bằng các đoạn thẳng.
IV.3. §èi tîng ®å häa ®éc lËp
Trong GDI, một đồ thị thuộc về 1 ngữ cảnh thiết bị, và đồ thị bị hủy khi mà nó được vẽ ra. Trong GDI+, chức năng vẽ được thực hiện bởi 1 đối tượng Graphics và ta có thể tạo và duy trì một vài đối tượng GraphicsPath riêng rẽ với đối tượng Graphics. Một đối tượng GraphicsPath không bị hủy bởi hành động vẽ, vì vậy ta có thể dùng một đối tương GraphicsPath để vẽ nhiều lần.
IV.4. Chøc n¨ng chuyÓn ®æi và ®èi tîng ma trËn
GDI+ cung cấp đối tượng Matrix, một công cụ mạnh để thực hiện các phép biến đổi như quay, dịch... một cách dễ dàng và mềm dẻo. Một đối tượng ma trận hoạt động cùng với đối tượng sẽ chịu biến đổi. Ví dụ đối tượng GraphicsPath có phương thức Tranform nhận vào đối số là một ma trận. 1 ma trận 3x3 có thể được dùng để thực hiên một phép biến đổi hay một dãy các phép biến đổi. Hình sau minh họa 1 đồ thị trước và sau khi thực hiện một dãy các chuyển đổi ( đầu tiên là phép tỉ lệ, sau là phép quay).
H×nh 5 ChuyÓn ®æi ®å thÞ
IV.5. Vïng ¶nh co gi·n ®îc
GDI+ mở rộng rất nhiều khả năng hỗ trợ vùng ảnh của nó. Trong GDI, vùng được lưu trong hệ tọa độ thiết bị và phép biến đổi duy nhất có thể áp dụng với 1 vùng ảnh là phép dịch chuyển. GDI+ lưu trữ vùng ảnh trong hệ tọa độ chung và cho phép vùng này chịu bất kỳ phép chuyển đổi nào lưu trữ được trong 1 ma trận chuyển đổi. Hình sau minh họa 1 vùng ảnh trước và sau 1 chuỗi 3 phép chuyển đổi: tỉ lệ, quay và dịch chuyển.
H×nh 6 Co gi·n vïng ¶nh
IV.6. §æ bãng Alpha
Trong hình trên ta có thể thấy vùng chưa được chuyển đổi (được phủ bởi màu đỏ) qua phần đã được chuyển đổi (phủ bởi các đường sọc màu xanh). Điều này được thực hiện thông qua kỹ thuật đổ bóng Alpha được hỗ trợ bởi GDI+. Với kỹ thuật đổ bóng Alpha ta có thể quy định độ trong suốt của 1 màu. Khi một màu phối hợp với 1 màu nền, nếu màu càng trong suốt ta nhìn thấy màu nền càng rõ. Hình sau minh họa các mức độ trong suốt.
H×nh 7 C¸c møc ®é trong suèt cña mµu nÒn
V. Thay ®æi trong m« h×nh lËp tr×nh
V.1. Ng÷ c¶nh thiÕt bÞ, Handles và c¸c ®èi tîng ®å häa
Nếu đã viết chương trình dùng GDI, lập trình viên chắc hẳn đã quen với khái niệm ngữ cảnh thiết bị. Một ngữ cảnh thiết bị là một cấu trúc của Windows lưu trữ khả năng của một thiết bị hiển thị cụ thể và các thuộc tính xác định cách thức mà các đối tượng sẽ được vẽ lên thiết bị đó. Một ngữ cảnh thiết bị cho 1 màn hình video cũng được liên kết với 1 cửa sổ trong màn hình hiển thị. Đầu tiên ta sẽ nhận được một handle trỏ đến 1 ngữ cảnh thiết bị (HDC). Ta sẽ chuyển handle này cho hàm GDI thực hiện công việc vẽ.
Với GDI+ ta không phải lo về việc sử dụng các handle cũng như ngữ cảnh thiết bị. Đơn giản là ta chỉ phải tạo 1 đối tượng Graphics và gọi các phương thức của nó với 1 phong cách hướng đối tượng quen thuộc. Đối tượng Graphics là trung tâm của GDI+ cũng như ngữ cảnh thiết bị là trung tâm của GDI. Ngữ cảnh thiết bị và đối tượng Graphics có vai trò tương tự nhau nhưng có một số khác biệt cơ bản giữa mô hình lập trình dựa trên các handle (hay con trỏ) trong GDI và mô hình lập trình hướng đối tượng trong GDI+.
Đối tượng Graphics, giống như ngữ cảnh thiết bị, được liên kết với một cửa sổ cụ thể trên màn hình và có các thuộc tính quy định cách thức vẽ các đối tượng. Tuy nhiên đối tượng Graphics lại không bị trói chặt với một đối tượng bút vẽ, bút tô, đồ thị, hình ảnh hay font chữ như một ngữ cảnh thiết bị. Ví dụ, trước khi ta dùng một ngữ cảnh thiết bị để vẽ một đường thẳng ta phải gọi phương thức SelectObject để liên kết một đối tượng bút vẽ với 1 ngữ cảnh thiết bị. Điều này thường được biết đến như việc chọn một bút vẽ vào ngữ cảnh thiết bị. Mọi đường thẳng được vẽ trong ngữ cảnh thiết bị sẽ dùng bút đã chọn. Với GDI+, ta chuyển đối tượng bút vẽ Pen như một tham số cho phương thức vẽ đường thẳng DrawLine của lớp Graphics. Ta có thể dùng các bút vẽ khác nhau trong một dãy các thao tác vẽ đường thẳng mà không cần phải liên kết một đối tượng bút vẽ với 1 đối tượng Graphics.
V.2. Bót vÏ, bót phñ, ®å häa, h×nh ¶nh và Font ch÷
Các đối tượng Bút vẽ, bút phủ, đồ họa, hình ảnh và Font chữ có thể được tạo ra và lưu trữ riêng biệt với đối tượng Graphics. Rất nhiều phương thức vẽ của lớp Graphics nhận cá đối tượng này làm các tham số. Đây là điều trái ngược với GDI khi ta phải chọn các đối tượng này vừo ngữ cảnh thiết bị và chuyển handle của ngữ cảnh thiết bị như một đối số đến hàm vẽ.
VI. Giíi thiÖu c¸c ®èi tîng ®å häa c¬ b¶n trong GDI+
VI.1. §å häa Vector
GDI+ vẽ các đường thẳng, hình chữ nhật và các hình khác trên 1 hệ trục tọa độ. Ta có thể chọn rất nhiều hệ tọa độ nhưng hệ tọa độ mặc định có điểm gốc là góc trái trên của màn hình. Đơn vị đo của hệ trục tọa độ mặc định là pixel.
H×nh 8 HÖ trôc to¹ ®é cña GDI+
Đồ họa vector của GDI+ hỗ trợ một số lớp cơ bản rất hữu ích sau:
Lines
Rectangles
Ellipses
Arcs
Polygons
Cardinal splines
Bézier splines
Lớp Graphics trong GDI+ cung cấp các phương thức để vẽ các đối tượng trên DrawLine, DrawRectangle, DrawEllipse, DrawPolygon, DrawArc, DrawCurve và DrawBezier. DrawBezier. Mỗi phương thức trên đều được overload để nhận một vài danh sách tham số. Tất cả các phương thức đều làm việc kết hợp với một đối tượng bút vẽ Pen. Để vẽ bất kỳ thứ gì ta phải tạo ít nhất 2 đối tượng: một đối tượng Graphics và một đối tượng Pen. Đối tượng Pen lưu trữ thông tin về thuộc tính như độ rộng đường và màu sắc cho hình được vẽ.
VI.2. H×nh ¶nh và Metafile
Lớp Image là một lớp cơ sở trừu tượng cung cấp các phương thức làm việc với các ảnh raster (dạng ảnh bitmap) và các ảnh vector. Các lớp Bitmap và Metafile đều kế thừa lớp Image. Lớp Bitmap mở rộng khả năng của lớp Image bằng cách cung cấp thêm các phương thức cho tải, lưu giữ và xử lý các ảnh raster. Lớp Metafile mở rộng thêm khả năng ghi lại các hình ảnh vector.
GDI+ cung cấp lớp Metafile để ta có thể ghi lại và hiển thị các metafile. Một metafile còn gọi là một hình ảnh vector là một hình ảnh được lưu lại như một chuỗi các lệnh vẽ. Những lệnh vẽ được lưu trong 1 đối tượng Metafile có thể được lưu trong bộ nhớ hay lưu trong 1 file hoặc một đối tượng stream.
GDI+ có thể hiển thị các metafile được lưu dưới các định dạng sau:
Windows Metafile (WMF)
Enhanced Metafile (EMF)
EMF+
GDI+ có thể ghi lại được metafile trong định dạng EMF và EMF+ nhưng không trong định dạng WMF. EMF là một phần mở rộng của GDI+ cho phép GDI+ ghi và lưu lại. Chỉ có 2 biến đổi với định dạng EMF: EMF+ đơn và EMF+ kép. EMF+ đơn chỉ chứa các bản ghi GDI+ . Các metafile như vậy có thể được hiển thị bởi GDI+ nhưng không phải GDI. EMF+ kép có chứa cả bản ghi GDI+ và GDI . Mỗi bản ghi GDI+ lưu trong 1 EMF+ metafile là một cặp với 1 bản ghi thay thế của GDI. Mỗi metafile như vậy có thể được hiển thị bởi GDI+ hay GDI.
Ví dụ sau hiển thị 1 metafile đã được lưu trước đó dưới dạng 1 file. 1 Metafile được hiển thị với góc trên tại điểm (100,100).
public void Example_DisplayMetafile(PaintEventArgs e)
{
Graphics myGraphics = e.Graphics;
Metafile myMetafile = new Metafile("SampleMetafile.emf");
myGraphics.DrawImage(myMetafile, 100, 100);
}
VI.3. C¸c lo¹i hÖ täa ®é
GDI+ dùng 3 loại hệ tọa độ không gian: thế giới thực, trang và thiết bị. Khi ta có một lời gọi đến hàm myGraphics.DrawLine(myPen, 0, 0, 160, 80) điểm mà ta sẽ truyền cho phương thức DrawLine – (0,0) và (160,80) là ở trong hệ tọa độ thực. Trước khi GDI+ có thể vẽ đường thẳng lên màn hình, hệ tọa độ trải qua một dãy các biến đổi. 1 phép chuyển đổi sẽ chuyểntọa độ thực về tọa độ trang và một phép chuyển đổi khác chuyển hệ tọa độ trang thành hệ tọa độ thiết bị.
Chẳng hạn khi ta muốn làm việc với 1 hệ thống tọa độ có điểm 0 nằm ở giữa vùng client thay vì là ở góc trái trên, ví dụ bắt đầu từ pixel 100 từ cạnh trái của vùng client và 50 pixel từ đỉnh của vùng client. Hình sau minh họa hệ tọa độ như vậy và kết quả khi gọi hàm myGraphics.DrawLine(myPen, 0, 0, 160, 80):
H×nh 9 DÞch chuyÓn hÖ to¹ ®é
Phép chuyển đổi thực hiện việc ánh xạ hệ tọa độ thực vào hệ tọa độ trang được gọi là phép chuyển đổi hệ tọa độ thực và được lưu trong thuộc tính Transform của lớp Graphics. Phép chuyển đổi thực hiện việc ánh xạ tọa độ trang vào hệ tọa độ thiết bị được gọi là một phép chuyển đổi trang. Lớp Graphics cung cấp các thuộc tính PageUnit và PageScale để xử lý các chuyển đổi trang. Lớp này cũng cung cấp các thuộc tính DpiX và DpiY để xác định độ phân giải điểm ảnh dọc và ngang của thiết bị hiển thị.
VI.4. C¸c phÐp chuyÓn ®æi
Một phép chuyển đổi tổng thể là một phép chuyển đổi áp dụng lên tất cả các đối tượng được vẽ bởi 1 đối tượng Graphics. Để thực hiện một phép chuyển đổi ta tạo 1 đối tượng Graphics, thao tác với thuộc tính Transform của nó. Thuộc tính Transform là một đối tượng ma trận, do vậy nó có thể lưu giữ một số lượng bất kỳ dãy các phép biến đổi Affine. Phép chuyển đổi được lưu trong thuộc tính Transform được gọi là phép chuyển đổi hệ tọa độ thế giới thực. Lớp Graphics cung cấp một vài phương thức để tổng hợp một phép biến đổi phức tạp: MultiplyTransform, RotateTransform, ScaleTransform, và TranslateTransform. Sau đây là một ví dụ về phép chuyển đổi này:
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
Một phép chuyển đổi cục bộ là một phép biến đổi áp dụng cho một đối tượng cụ thể. Đối tượng Graphics cho phép tạo một ảnh đồ họa và áp dụng các phép chuyển đổi lên đó. Ví dụ:
Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
PhÇn III: §a luång trong C#
§a luång ( multithreading) dêng nh lµ mét thuËt ng÷ míi, tuy vËy nã l¹i rÊt quen thuéc víi chóng ta nhÊt lµ trong cuéc sèng h»ng ngµy. Mét vÝ dô ®iÓn h×nh cña ®a luång mµ ai còng cã thÓ nhËn ra lµ ho¹t ®éng cña c¸c c¬ quan trong c¬ thÓ. C¬ thÓ chóng ta cã thÓ thùc hiÖn cïng mét lóc v« sè c«ng viÖc nh h« hÊp, tuÇn hoµn, tiªu ho¸… C¸c ho¹t ®éng nµy diÔn ra ®ång thêi. Chóng ta còng cã thÓ t×m thÊy h×nh ¶nh cña ®a luång trong vÝ dô kh¸c lµ ho¹t ®éng cña mét chiÕc xe m¸y. Mét chiÕc xe m¸y cã thÓ thùc hiÖn nhiÒu ®éng t¸c nh lµ rÏ, t¨ng tèc, nh¸y ®Ìn… ®ång thêi. Trong c¸c phÇn sau, chóng ta sÏ t×m hiÓu ®a luång trong thùc hiÖn ch¬ng tr×nh m¸y tÝnh.
I. Kh¸i niÖm ®a luång
Tríc khi hiÓu hoµn toµn vÒ luång, chóng ta sÏ t×m hiÓu thÕ nµo hÖ ®iÒu hµnh Windows ho¹t ®éng nh thÕ nµo trong chÕ ®é ®a nhiÖm:
I.1. §a nhiÖm ( multitasking )
Tríc hÕt ta cã thÓ nãi Windows lµ mét hÖ thèng ®a nhiÖm. Trong chÕ ®é ®a nhiÖm, hÖ ®iÒu hµnh sÏ ph©n bè thêi gian gi÷a c¸c tiÕn tr×nh vµ quyÕt ®Þnh tiÕn tr×nh nµo nªn ®îc ch¹y kÕ tiÕp khi tiÕn tr×nh hiÖn hµnh kÕt thóc thêi gian ®îc chia sÎ trªn vi xö lý. Do ®ã hÖ ®iÒu hµnh ng¾t tiÕn tr×nh ®Òu ®Æn gi÷a c¸c kho¶ng thêi gian ®Ó ®a tiÕn tr×nh kÕ tiÕp trong hµng ®îi vµo thùc hiÖn v× vËy kh«ng cã tiÕn tr×nh nµo cã ®éc quyÒn chiÕm CPU t¹i bÊt cø thêi ®iÓm cña thêi gian. Sè lîng thêi gian ®a tíi mçi tiÕn tr×nh phô thuéc vµo bé vi xö lý vµ hÖ ®iÒu hµnh. Thêi gian xö lý cho mçi tiÕn tr×nh rÊt nhá ®iÒu nµy ®a ra c¶m tëng r»ng mét tËp hîp c¸c tiÕn tr×nh ch¹y ®ång thêi nhng thùc tÕ mçi tiÕn tr×nh ch¹y trong m«t sè miligi©y nµo ®ã sau ®ã tíi tiÕn tr×nh kh¸c vµ sù chuyÓn ®æi nµy x¶y ra rÊt nhanh. §©y lµ ph¬ng c¸ch mµ c¸c Windows 95/98/NT hay ngay c¶ Unix dïng ®Ó qu¶n lý c¸c tiÕn tr×nh. Tuy nhiªn ë c¸c hÖ ®iÒu hµnh ban ®Çu nh Win 3.x vµ DOS th× nã l¹i qu¶n lý ë chÕ ®é ®¬n nhiÖm (monotasking). Trong chÕ ®é nµy mçi tiÕn tr×nh cã thÓ ®iÒu khiÓn CPU trong bao l©u mµ nã cÇn, víi c¸ch thùc hiÖn nµy mét tiÕn tr×nh ng¨n chÆn c¸c tiÕn tr×nh kh¸c ®îc xö lÝ ®ång thêi.
I.2. §a luång ( multitasking)
Kh«ng gian bé nhí, trong ®ã mét øng dông ®îc thùc hiÖn ®îc gäi lµ tiÕn tr×nh (process). Trong ph¹m vi mét tiÕn tr×nh thêng cã nhiÒu c«ng viÖc cÇn ®îc thùc hiÖn. Qu¸ tr×nh thùc hiÖn mét c«ng viÖc ®îc gäi lµ mét luång (tiÓu tr×nh). C¸c c«ng viÖc trong mét tiÕn tr×nh cã thÓ thùc hiÖn tuÇn tù, lóc nµy chØ cã mét luång ch¹y thùc hiÖn c¸c c«ng viÖc, ta gäi ®©y lµ chÕ ®é ®¬n luång. C¸c c«ng viÖc cña tiÕn tr×nh còng cã thÓ thùc hiÖn ®ång thêi, lóc nµy cã nhiÒu luång thùc hiÖn nhiÒu c«ng viÖc.
Nh vËy ta gÆp l¹i h×nh ¶nh ®a nhiÖm trong ®a luång, chóng cã thÓ ph©n biÖt chóng ®¬n gi¶n nh sau:
§a nhiÖm: bao gåm c¸c øng dông kh¸c nhau ch¹y ®ång thêi díi sõ ®iÒu khiÓn cña hÖ ®iÒu hµnh, chóng chia sÎ CPU vµ bé nhí.
§a luång: chØ tån t¹i trong mét øng dông, bao gåm c¸c c«ng viÖc cña mét øng dông ®îc ch¹y ®ång thêi, chóng chia sÎ tµi nguyªn CPU vµ bé nhí mµ hÖ ®iÒu hµnh ph©n cho øng dông ®ã, chóng ®îc ®iÒu khiÓn bëi mét m« ®un trong øng dông.
Trong mét øng dông Window cã c¸c lo¹i luång sau:
Luång ®¬n ( Single Threading ): chØ cã mét luång trong øng dông vµ nã ph¶i lµm tÊt c¶ c¸c c«ng viÖc. Luång ®ã cã tÊt c¶ c¸c kh«ng gian ph©n phèi cho process. Lóc nµy ta cã thÓ ®ång nhÊt luång víi øng dông.
Luång Apartment ( ë ®©y lÊy h×nh ¶nh øng dông lµ khu nhµ, mçi luång lµ mé c¨n hé): cã nhiÒu luång trong øng dông. øng dông sÏ ®Þnh khi nµo vµ bao l©u cho mét luång nªn thùc hiÖn. Mçi luång cã g¸n cho mét kh«ng gian riªng trong ph¹m vi kh«ng gian cho øng dông vµ c¸c luång kh¸c kh«ng chia sÎ c¸c nguån tµi nguyªn ®ã.
Luång tù do ( Free Threading ): cã nhiÒu luång trong mét øng dông vµ nh÷ng luång nµy chia sÎ nguån tµi nguyªn chung. C¸c luång kh¸c nhau cã thÓ gäi cïng mét ph¬ng thøc vµ thuéc tÝnh t¹i mét thêi ®iÓm. M« h×nh Apartment th× hiÖu qu¶ h¬n m« h×nh single threading bëi v× c«ng viÖc ®îc ph©n chia gi÷a nhiÒu ®èi tîng trong khi m« h×nh free th× nhanh nhÊt vµ h÷u hiÖu nhÊt. Nhng chÕ ®é free Èn chøa nhiÒu rñi ro bëi v× sù chia sÎ tµi nguyªn gi÷a nhiÒu ®èi tîng, ngêi lËp tr×nh cÇn ph¶i chó ý nhiÒu ®Õn sù ®ång bé vµ tr¸nh c¸c xung ®ét x¶y ra.
II. §a luång trong C#
Trong phÇn trªn ta thÊy ®îc phÇn nµo hÖ ®iÒu hµnh qu¶n lý c¸c øng dông cïng ch¹y ®ång thêi.Tõ thùc tÕ ta còng cã nh÷ng øng dông tÝnh to¸n phøc t¹p cÇn nhiÒu thêi gian thùc hiÖn hay c¸c øng dông cÇn xö lý song song (paralell), hay øng dông cÇn lÊy d÷ liÖu tõ xa ®ång thêi hiÓn thÞ d÷ liÖu trªn mµn h×nh cho ta thÊy ®a luång ®ãng vai trß quan träng trong cuéc sèng cña chóng ta. Tuy nhiªn kh«ng ph¶i hÇu hÕt c¸c ng«n ng÷ lËp tr×nh ®Òu cho phÐp lËp tr×nh viªn chØ ®Þnh c¸c hµnh ®éng diÔn ra ®ång thêi. Thay vµo ®ã ng«n ng÷ lËp tr×nh cung cÊp cho chóng ta mét tËp cÊu tróc ®¬n gi¶n ®Ó cho mét ch¬ng tr×nh ho¹t ®éng t¹i mét thêi ®iÓm vµ chØ tiÕp tôc hµnh ®éng tiÕp theo khi hµnh ®éng thø nhÊt ®· kÕt thóc. KiÓu ho¹t ®éng ®ång thêi mµ c¸c m¸y tÝnh ngµy nay thêng cµi ®Æt lµ tÝnh n¨ng ho¹t ®éng ®ång thêi nguyªn thñy cña hÖ ®iÒu hµnh vèn chØ sö dông bëi c¸c lËp tr×nh viªn hÖ thèng cùc kú kinh nghiÖm. Ng«n ng÷ C# cïng víi c¸c ng«n ng÷ kh¸c trong bé .NET ®· biÕn c¸c tÝnh n¨ng nguyªn thñy ®ång thêi trë nªn s½n sµng cho ngêi lËp tr×nh x©y dùng c¸c øng dông c¸ nh©n.LËp tr×nh viªn C# cã thÓ x©y dùng øng dông cã nhiÒu luång thi hµnh mµ mçi luång chØ ®Þnh râ mét phÇn c«ng viÖc trong sè nhiÒu phÇn viÖc cña mét ch¬ng tr×nh vµ cã thÓ thi hµnh ®ång thêi víi c¸c luång kh¸c.Mét øng dông cô thÓ cña kü thuËt ®a luång lµ kh¶ n¨ng tù gom r¸c cña C# trong ®ã C# cung cÊp mét luång gom r¸c tù ®éng ch¹y thu håi phÇn bé nhí ®· ®îc ph©n phèi cÊp ph¸t mµ ch¬ng tr×nh chÝnh kh«ng dïng n÷a.Tuy nhiªn bªn c¹nh t¹o ra c¸c ra c¸c øng dông ®a luång cã thÓ c¶i thiÖn ®îc hiÖu suÊt cña øng dông tuy nhiªn viÖc thªm nhiÒu tiÓu tr×nh cã thÓ lµm t¨ng ®é phøc t¹p cña øng dông cña chóng ta còng nh lµm lµm chËm viÖc tÝnh to¸n (do vi xö lý ph¶i chuyÓn ®æi liªn tôc tõ luång nµy sang thùc hiÖn luång tiÕp theo sau ®ã l¹i quay l¹i thùc hiÖn luång ®ã) vµ lµm cho viÖc b¶o tr× vµ gì rèi t¨ng lªn.
II.1. CÊu tróc c¸c líp ®iÒu khiÓn luång cña C#
Trong ng«n ng÷ lËp tr×nh C# kh«ng gian tªn System.Threading cung cÊp c¸c líp, c¸c giao diÖn cho viÖc lËp tr×nh ®a luång. Trong kh«ng gian tªn nµy bao gåm líp ThreadPool qu¶n lý c¸c nhãm c¸c luång, líp Timer cho phÐp mét ®¹i diÖn chuyÓn giao ®îc gäi sau mét lîng thêi gian chØ ®Þnh vµ líp Mutex cho sù ®ång bé gi÷a c¸c luång víi nhau. Ngoµi ra System.Threading còng cung cÊp c¸c líp cho viÖc ®Þnh møc u tiªn cña c¸c luång, chê ®îi th«ng b¸o…
Sau ®©y ta cã mét s¬ ®å cÊu tróc cña kh«ng gian tªn System.Threading:
Classes
Class
M« t¶
AutoResetEvent
Th«ng b¸o mét or nhiÒu luång ®ang chê ®îi cho mét sù kiÖn ®· x¶y ra vµ tù ®éng khëi ®éng.
InterLocked
Cung cÊp ho¹t ®éng tèi thiÓu cho c¸c biÕn ®îc chia sÎ bëi nhiÒu luång
ManualResetEvent
X¶y ra khi th«ng b¸o mét hoÆc nhiÒu luång cã mét sù kiÖn võa x¶y ra
Monitor
Cung cÊp mét c¬ chÕ c¸i ®ång bé hãa truy nhËp c¸c ®èi tîng
RegisteredWaitHandle
DiÔn t¶ mét ®¨ng ký c¸i mµ ®· ®îc ®¨ng ký khi goi ®èi tîng RegisterWaitForSingleObject.
SynchronizationLockException
Ngo¹i lÖ ®îc ®a ra khi mét ph¬ng thøc ®ång bé hãa ®îc ®a ra tõ mét khèi m· ®ãng kh«ng ®ång bé hãa
Thread
T¹o vµ ®iÒu khiÓn luång, vµ nhËn c¸c tr¹ng th¸i cña nã
ThreadAbortException
Mét ngo¹i lÖ c¸i mµ ®îc ®a ra khi mét lêi gäi ®îc chÕ tíi ph¬ng thøc Abort
ThreadExceptionEventArgs
Cung cÊp d÷ liÖu cho mét sù kiÖn ThreadException
ThreadInterruptedException
Mét ngo¹i lÖ ®îc ®a ra khi mét luång bÞ ng¾t trong khi nã ë trong tr¹ng th¸i chê ®îi.
ThreadPool
Cung cÊp mét sù dïng chung cña c¸c luång cã thÓ sö dông xö lý kh«ng ®ång bé vµo ra, chê ®îi ,xö lý thêi gian, xö lý chuyÓn c«ng viÖc.
ThreadStateException
Ngo¹i lÖ ®îc ®a ra khi luång trong mét tr¹ng th¸i kh«ng hîp cho lêi gäi ph¬ng thøc.
Timeout
Chøa ®ùng mét h»ng chØ ®Þnh cho mét kho¶ng thêi gian nhÊt ®Þnh.
Timer
ChØ ®Þnh mét c¬ chÕ cho thùc hiÖn mét ph¬ng thøc gi÷a kho¶ng thêi gian chØ ®Þnh,
Structure:
Structure
M« t¶
LockCookie
§Þnh nghÜa mét lock thùc hiÖn c¸c v¨n ph¹m singer_writer hoÆc multiple_writer
NativeOverlapped
Cung cÊp mét cÊu tróc râ rµng c¸i mµ hiÖn tõ code kh«ng qu¶n lý vµ c¸i ®ã cã c©ø tróc gièng cÊu tróc Win32 overlapped víi c¸c trêng dù tr÷ thªm vµo tai cuèi.
Delegates
Delegate
M« t¶
ThreadStart
M« t¶ ph¬ng thøc c¸i mµ b¾t ®Çu víi Thread class
ThreadExceptionEventHandler
M« t¶ ph¬ng thøc c¸i mµ ®iÒu khiÓn sù kiÖn ThreadException cña øng dông.
IOCompletionCallback
NhËn m· lçi ,sè c¸c bytes ,vµ c¸c gi¸ trÞ trïng khi ho¹t ®éng vµo ra hoµn thµnh trªn threadpool
TimerCallback
M« t¶ ph¬ng thøc c¸i mµ ®iÒu khiÓn t/th¸i cña Timer
Enumeration:
Enumeration
M« t¶
ApartmentState
ChØ ®Þnh tr¹ng apartment cña mét Thread
ThreadPriority
ChØ ®Þnh thêi gian biÓu cho Thread
ThreadState
ChØ ®Þnh tr¹ng th¸i cña Thread
II.2. Tæng qu¸t c¸c ph¬ng thøc cña líp Thread
II.2.1. T¹o luång ( create thread )
§Ó t¹o mét luång víi líp Thread, tríc hÕt ta cÇn cã mét ph¬ng thøc lµm viÖc nh mét ®¹i diÖn chuyÓn giao luång. Trong .NET dïng ®¹i diÖn chuyÓn giao ®Ó ®Þnh nghÜa mét ph¬ng thøc mµ luång míi sÏ dïng. Gi¶ sö r»ng chóng ta cã mét ph¬ng thøc MyThread, th× ph¬ng thøc nµy ®ãng vai trß ®¹i diÖn, ®Þnh nghÜa cho luång. Sau ®ã t¹o mét ®èi tîng cña líp Thread vµ constructor cho mét Thread sÏ lµ mét th«ng sè cho ®¹i diÖn ThreadStart. Nh vËy ®¹i diÖn ThreadState ®Þnh nghÜa c¸c ph¬ng thøc mµ luång míi t¹o thµnh sÏ thi hµnh.
Vi dô:
ThreadStart mt=new ThreadStart(MyThread);
//Doan tren tao ra mot dai dien chuyen giao
//Tao mot ®èi tîng cña líp Thread l©y tham s« lµ ®ai diÖn chuyÓn giao.
Thread myluong=new Thread(mt);
Tuy nhiªn ®Õn bíc trªn luång vÉn cha thùc hiÖn ®îc vµ vÉn ë tr¹ng th¸i Unstarted vµ khi ta gäi ph¬ng thøc Start cña líp Thread th× hÖ ®iÒu hµnh sÏ thay ®æi tr¹ng th¸i cña luång tíi tr¹ng th¸i ThreadState.Running. Khi Start ®îc gäi th× thùc hiªn dßng ®Çu tiªn cña ph¬ng thøc ( ë vi dô nµy MyThread ) tham chiÕu bëi ®¹i diÖn chuyÓn giao Delegate. Khi ph¬ng thøc Start ®îc gäi th× nã cã thÓ g©y ra mét sè ngo¹i lÖ mµ ta cÇn chó ý :
ThreadStateException
Lu«ng ®· b¾t råi.
SecurityException
Lêi gäi kh«ng cã cho phÐp thùc hiÖn
OutOfMemoryException
Kh«ng ®ñ bé nhí thùc hiÖn luång
NullReferenceException
Lêi gäi tham chiÕu mét luång mµ null
ë ®©y ta còng chó ý lµ mét khi luång ®· ng¾t th× kh«ng thÓ cã lêi gäi Start lÇn n÷a. Khi phong thøc Start khëi ®Çu luång nµy, ph¬ng thøc Start sÏ tr¶ ®iÒu khiÓn cho luång gäi ngay lËp tøc. Khi ®ã luång gäi sÏ thi hµnh ®ång thêi luång võa ph¸t ®éng.
§Ó biÕt ®îc tr¹ng th¸i cña mét luång ta cã thÓ sö dông thuéc tÝnh
Thread.ThreadSate hay thuéc tÝnh Thread.isAlive
[C#]
public ThreadState ThreadState {get;} (**)
[C#]
public bool IsAlive {get;}) (*)
(*) - Thuéc tÝnh nµy cã gi¸ trÞ lµ true khi mµ luång ®· ®îc gäi vµ cha chÕt ( tøc lµ ph¬ng thøc stop cña nã cha ®îc gäi vµ ph¬ng thøc kiÓm so¸t run cña nã cha hoµn tÊt nhiÖm vô) ngîc l¹i nã cã gi¸ trÞ false khi luång ®· kÕt thóc .
(**)- Gi¸ trÞ cña thuéc tÝnh nµy tr¶ vÒ lµ tr¹ng th¸i hiÖn hµnh cña luån vµ khëi ®Çu víi gi¸ trÞ unstarted.
Khi t¹o mét luång ta cã thÓ g¸n tªn cho luång ®ã ®Ó nhÊn d¹ng tªn luång ®ang ch¹y b»ng c¸ch sö dông thuéc tÝnh Thread.Name ®Ó g¸n thuéc tªn cho luång. §iÒu cÇn lu ý khi sö dông thuéc tÝnh nµy lµ ®©y lµ thuéc tÝnh chØ ghi vµ mét luång chØ ®îc dÆt tªn cho mét lÇn duy nhÊt mµ th«i nÕu kh«ng sÏ g©y ra mét lçi ngo¹i lÖ InvalidOperationException (thiÕt ®Æt mét yªu cÇu mµ tªn ®ã ®· ®îc ®Æt råi).
II.2.2. NhËp luång ( join thread )
Khi ta cÇn dõng xö lý mét luång vµ chê ®îi cho luång thø hai kÕt thóc gäi lµ luång thø nhÊt gia nhËp luång thø hai hay nãi c¸ch kh¸c lµ g¾n ®Çu luång mét vµo ®u«i luång thø hai. C# cung cÊp cho chóng ta ba ph¬ng thøc :
public void Join() ;(*)
public bool Join(int);(**)
public bool Join(TimeSpan);(***)
(*) Khi dïng ph¬ng thøc nµy th× nã sÏ ®ãng luång cho ®Õn khi luång thø hai bÞ ng¾t. Tuy nhiªn sù chê ®îi kh«ng h¹n ®Þnh nµy cã thÓ g©y ra vÊn ®Ò nghiªm träng ®ã lµ bÕ t¾c hoµn toµn (deadlock) vµ tr× ho·n v« h¹n (infinitive postponement). Ph¬ng thøc nµy tung ra hai lçi ngo¹i lÖ lµ ThreadSateException khi mµ lêi gäi cè g¾ng gia nhËp luång trong khi ®ang ë tr¹ng thai ThreadState.Unstarted vµ ngo¹i lÖ thø hai x¶y ra lµ ThreadInterruptException tøc lµ luång bÞ ng¾t trong khi ®ang chê ®îi.
(**) Khi dïng ph¬ng thøc nµy th× luång sÏ bÞ ®ãng cho ®Õn khi luång thø hai ng¾t hay thêi gian chØ ®Þnh hÕt. Ph¬ng thøc nµy tr¶ l¹i gi¸ trÞ true nÕu luång hai kÕt thóc hoÆc tr¶ l¹i false khi hÕt thêi gian mµ luång hai cha kÕt thóc. Ph¬ng thøc nµy còng sinh ra hai ngoai lÖ lµ ThreadSateException tøc luång cha b¾t ®Çu hoÆc do thêi gian lµ ©m ArgumentOutOfRangeException.
Khi thùc hiÖn c¸c ph¬ng thøc nµy th× chóng ®Òu lµm thay ®æi tr¹ng th¸i cña luång gäi tíi ThreadState.WaitSleepJoin vµ ta cÇn chó ý lµ kh«ng gäi ph¬ng thøc nµy khi luång ®ang ë tr¹ng th¸i ThreadState.Unstarted.
VÝ dô:
using System;
using System.Thread;
class test
{ public static void thuyet() {
Console.WriteLine(“Trangthai:”+Second.CurrentState.ThreadSate);
/*sö dông thuéc tÝnh CurrentThread ®Ó tr¶ vÒ tr¹ng th¸i cña luång cña luång
hiÖn thêi */
}
public static void Main()
{
Console.WriteLine(“Luong chinh”);
ThreadStart my=new ThreadStart(thuyet);
Thread second=new Thread(my);
second.Start();
second.Join();
Console.WriteLine(“Ket thuc:”+second.ThreadState);
}
}
Trong ch¬ng tr×nh trªn khi thùc hiÖn nÕu ta bá ®i dßng lÖnh second.Join() th× ch¬ng tr×nh cho ta ®Çu ra :
Luong chinh.
Ketthuc:unstarted
Trangthai:Running.
Tuy nhiªn khi ta cho dßng lÖnh vµo th× khi ®ã luång ch¬ng tr×nh chÝnh sÏ ®i vµo tr¹ng th¸i Thread.WaitSleepJoin vµ chê cho luång võa t¹o ra kÕt thóc míi tiÕp tôc lµm tiÕp do ®ã ®Çu ra cña ch¬ng tr×nh trªn:
Luong chinh.
Trangthai:Running
Ketthuc:unstarted
II.2.3. Dõng mét luång
§Ó dïng mét luång trong C# ta cã thÓ sö dông ph¬ng thøc
Thread.Susppend [ public void suspend();]
Tuy nhiªn khi ta gäi ph¬ng thøc nµy, hÖ thèng kh«ng thùc hiÖn ngay hµnh ®éng nµy ngay lËp tøc. Thay vµo ®ã, nã ghi nhËn mét luång ®×nh chØ võa yªu cÇu vµ chê ®îi cho ®Õn khi luång ®¹t ®Õn mét ®iÓm an toµn (safe point) tríc khi thùc sù ®×nh chØ luång ®ã ho¹t ®éng. Mét ®iÓm an toµn cho mét luång lµ mét ®iÓm an toµn cho gom r¸c. Ph¬ng thøc nµy chØ sÏ kh«ng hiÖu qu¶ khi chóng ta gäi ph¬ng thøc nµy khi mµ luång ®· bÞ dõng vµ ®Ó kh«i phôc luång bÞ ®×nh chØ ta sö dông ph¬ng thøc Thread.Resume() ®Ó kh«i phôc l¹i ho¹t ®éng cña luång.
Líp Thread cßn ®a ra cho ta mét ph¬ng thøc Thread.Sleep còng dïng cho môc ®Ých nh trªn. Ph¬ng thøc nµy lÊy tham sè lµ thêi gian chØ ®Þnh luång sÏ dõng trong bao l©u sau ®ã kh«i phôc thùc hiÖn. §©y kh«ng ph¶i lµ sù ®Þnh thêi khãa biÓu cho luång thùc hiÖn vµ khi thùc hiÖn th× ph¬ng thøc nµy ®a luång vµo tr¹ng th¸i WaitSleepJoin. §Ó gäi mét luång ra khái tr¹ng th¸i WaitSleepJoin chóng ta cã thÓ sö dông ph¬ng thøc Thread.Interrupt() ®Ó lµm luång trë l¹i ho¹t ®éng.
II.2.4. Hñy mét luång
Ph¬ng thøc Thread .Abort ®Ó lµm ngng h¼n mét luång ®ang ho¹t ®éng, cã hai ph¬ng thøc cho ho¹t ®éng nµy: mét lµ kh«ng ®èi sè hai lµ cã ®èi sè tuy nhiªn chóng ta thêng sö dông ph¬ng thøc kh«ng ®èi sè lµ chñ yÕu:
public void Abort();
public void Abort(Object);
Khi gäi ph¬ng thøc nµy ®a ra mét ngo¹i lÖ ThreadAbortException trong luång ®Ó b¾t ®Çu hñy luång. §©y lµ mét ngo¹i lÖ ®Æc biÖt cã thÓ ®ãn b¾t bµng ®o¹n m· cña øng dông, tuy nhiªn cuèi cña ®o¹n m· nÕu ta ®a ra mét ph¬ng thøc ResetAbort() th× Abort() sÏ bÞ bá qua vµ ng¨n chÆn ThreadAbortException dõng luång hiÖn hµnh.
Trªn ®©y lµ nh÷ng ph¬ng thøc chñ yÕu cña líp Thread mµ chóng ta thêng hay sö dông trong viÖc thao t¸c vµ xö lý víi luång .Cßn nh÷ng ph¬ng thøc kh¸c quan träng kh¸c n÷a sÏ kh¶o s¸t trong c¸c phÇn tiÕp theo.
II.3. Vßng ®êi cña mét luång
Trong phÇn nµy chóng ta sÏ t×m hiÓu c¸c tr¹ng th¸i vµ sù chuyÓn ®æi gi÷a c¸c tr¹ng th¸i cña luång vµ hai líp ¶nh hëng ®Õn c¸c øng dông ®a luång ë ®©y lµ líp Thread vµ Monitor.
Khi mét luång míi t¹o thµnh nã ë tr¹ng th¸i unstarted, luång duy tr× ë tr¹ng th¸i nµy cho ®Õn khi ph¬ng thøc Thread.Start() ®Æt luång vµo tr¹ng th¸i b¾t ®Çu ch¹y Started vµ lËp tøc chuyÓn ®iÒu khiÓn ®Õn luång võa gäi. Luång víi møc ®é u tiªn cao nhÊt sÏ b¾t ®Çu víi tr¹ng th¸i Running khi hÖ ®iÒu hµnh g¸n CPU cho øng dông.
Luång sÏ ®i vµo tr¹ng th¸i chÕt khi ®¹i diÖn chuyÓn giao cña nã bÞ ng¾t. Mét ch¬ng tr×nh cã thÓ buéc mét luång ph¶i dõng b»ng Thread.Abort() trªn mét ®èi tîng Thread thÝch hîp. Ph¬ng thøc nµy ®a ra mét ngo¹i lÖ ThreadAbortException trong luång. Khi luång ë trong tr¹ng th¸i stopped th× kh«ng cã tham chiÕu tíi ®èi tîng luång do ®ã bé thu gom r¸c tù déng sÏ dì bá ®èi tîng luång ra khái bé nhí.
Cã ba ph¬ng c¸ch ®Ó cho mét luång ®ang Running vµo tr¹ng th¸i WaitSleepJoin. Mét luång cã thÓ gäi ph¬ng thøc Monitor.Wait() ®Ó vµo tr¹ng th¸i WaitSleepJoin vµ mét luång khi ë tr¹ng th¸i nµy nã chØ trë l¹i tr¹ng th¸i Running khi ta gäi ®Õn ph¬ng thøc Pulse hay PulseAll cña líp Monitor. Ph¬ng thøc Pulse sÏ ®a luång tiÕp trong hµng ®îi vÒ tr¹ng th¸i Running, cßn ph¬ng thøc PulseAll sÏ ®a tÊt c¶ c¸c luång trong hµng ®îi vÒ Running. Hai ph¬ng thøc cßn l¹i Sleep hay Join cïng víi tham sè sÏ còng lµm t¬ng tù nh trªn.
BÊt cø mét luång nµo ®ang ë tr¹ng th¸i WaitSleepJoin b»ng c¸c ph¬ng thøc ë trªn cã thÓ trë l¹i tr¹ng th¸i Running b»ng c¸ch sö dông ph¬ng thøc Thread.Interrupt() ®Ó kh«i phôc vÒ tr¹ng th¸i Running.
Khi mét ph¬ng thøc Suspend ®îc dïng nã sÏ ®a mét luång ®ang ho¹t ®éng vÒ tr¹ng th¸i bÞ ®×nh chØ. Mét luång chØ s½n sµng khi mµ ph¬ng thøc resume gäi ®Ó phôc håi luång ®ã.
H×nh 9 minh ho¹ mét vßng ®êi cña kuång
II.4. Sù u tiªn cña luång vµ ®Þnh thêi gian biÓu cho luång
Mçi luång cã møc ®é u tiªn trong kho¶ng ThreadPriority.Lowest ®Õn ThreadPriority.Highest. Hai gi¸ trÞ nµy cã tõ thuéc tÝnh ThreadPriority(kh«ng gian tªn System.Threading ). Luång cã thÓ g¸n mét trong c¸c gi¸ trÞ u tiªn sau ®©y:
Highest :Luång cã thÓ ®Þnh thêi gian biÓu tríc c¸c u tiªn kh¸c.
AboveNormal :Luång thiÕt ®Æt sau c¸c lu«ng møc uu tiªn Highest vµ tríc c¸c luång co møc u tiªn Normal.
Normal :Luång ®Þnh tríc møc u tiªn BelowNormal vµ sau AboveNormal. §©y lµ thiÕt ®Æt mÆc ®Þnh cho luång ®îc t¹o ra.
BelowNormal : §îc thiÕt ®Æt tríc Lowest vµ sau Normal.
Running
Thread.Start
WaitSleepJoin
SuspendRequested
Suspended
AbortRequested
Aborted
Thread.Abort
Thread.Resume
Thread.Sleep
Thread.Join
Monitor.Wait
Thread.Suspend
Thread.Abort
Thread.Abort
Thread.Interrupt
H×nh 10 Vßng ®êi cña mét luång
Lowest :§îc thiÕt ®Æt sau bÊt cø luång nµo cã møc u tiªn kh¸c.
HÖ ®iÒu hµnh Windows hç trî mét kh¸i niÖm gäi lµ timeslicing cho phÐp nhiÒu luång cïng møc u tiªn cïng chia sÎ mét vi xö lý. Kh«ng cã timeslicing, mçi luång cã møc u tiªn ngang nhau sÏ sö dông processor cho ®Õn khi hoµn thµnh råi c¸c luång kh¸c míi cã CPU ®Ó thùc hiÖn. Víi timeslicing, mçi luång nhËn ®îc mét kho¶ng thêi gian ng¾n nhÊt ®Þnh cña bé vi xö lý ®îc gäi lµ thêi luîng (quantum) xuyªn suèt qu¸ tr×nh thùc hiÖn luång. T¹i mét thêi lîng hoµn thµnh, thËm chÝ nÕu luång cha hoµn thµnh th× processor sÏ vÉn lÊy luång trong hµng ®îi cña c¸c luång ®ång u tiªn vµo thùc hiÖn, nÕu nh cã luång chê ®îi.
C«ng viÖc cña bé ®Þnh luång lµ gi÷ luång ë møc u tiªn cao nhÊt vµo thùc hiÖn t¹i tÊt c¶ c¸c thêi ®iÓm. NÕu cã h¬n mét luång u tiªn cao nhÊt th× ®¶m b¶o r»ng mçi luång cã mét thêi lîng ho¹t ®éng theo kiÓu vßng lu©n phiªn.
H×nh 11 Vßng lu©n phiªn thùc hiÖn luång
Trong s¬ ®å trªn ta gi¶ thiÕt chØ cã mét processor, luång A,B ®îc cho mét thêi lîng lµm viÖc trong mét vßng lu©n phiªn cho ®Õn khi c¶ hai luång ®Òu kÕt thóc. §iÒu nµy cã nghÜa lµ luång A sÏ nhËn ®îc mét thêi gian thùc hiÖn, sau ®ã lu«ng B sÏ thùc hiÖn, sau ®ã luång A l¹i nhËn ®îc mét lîng thêi gian lµm viÖc ®iÒu nµy cø tiÕp tôc cho ®Õn khi hai luång kÕt thóc. Sau ®ã processor sÏ chuyÓn xuèng c¸c luång cã møc ®é u tiªn thÊp h¬n ë møc díi ®Ó thùc hiÖn.
Møc ®é u tiªn cña luång cã thÓ ®iÒu chØnh víi thuéc tÝnh Priority cho phÐp lÊy gi¸ trÞ trong tËp c¸c gi¸ trÞ cã thÓ cña ThreadPriority mµ c¸c gi¸ trÞ nµy ta ®· ®Ò cËp ë trªn:
public enum ThreadPriority
NÕu kh«ng cã tham sè hîp lÖ cho mét luång trong tËp ThreadPriority, mét ngo¹i lÖ sÏ x¶y ra ArgurmentException hoÆc mét ngo¹i lÖ kh¸c lµ ThreadStateException nÕu luång ®· kÕt thóc råi. Mét luång khi ®îc t¹o ra khi ch¹y sÏ cã cµi ®Æt mÆc ®Þnh møc ®é u tiªn Normal vµ c¸c luång sÏ ch¹y trªn c¬ së møc ®é u tiªn cña chóng.ThuËt to¸n ®Þnh thêi gian biÓu cho luång nh»m x¸c ®Þnh trËt tù cña c¸c luång ®a ra thùc hiÖn biÕn ®æi theo hÖ ®iÒu hµnh.
Mét luång sÏ thùc hiÖn cho ®Õn khi kÕt thóc hoÆc bÞ dõng hay t¾c nghÏn do ho¹t ®éng vµo ra hay gäi ph¬ng thøc Sleep cña líp Thread hay ph¬ng thøc wait cña líp Monitor hay bÞ giµnh quyÒn bëi c¸c luång cã møc u tiªn cao h¬n hoÆc thêi lîng cña nã hÕt hiÖu lùc. Mét luång cã møc ®é cao h¬n cã thÓ trë lªn s½n sµng hoÆc nÕu mét luång ®ang bÞ ®×nh chØ (suspend) ®îc phôc håi (resume)....
II.5. §ång bé hãa c¸c luång:
Khi chóng ta sö dông nhiÒu luång trong mét øng dông béc lé nhiÒu rñi ro bëi v× cã nhiÒu h¬n mét luång truy nhËp ®Õn ®Õn cïng d÷ liÖu t¹i mét thêi ®iÓm vÝ dô cè g¾ng ghi vµo mét biÕn. Do ®ã ®Ó ng¨n chÆn ®iÒu nµy chóng ta sö dông ®Õn sù ®ång bé hãa, ®ång bé ®¶m b¶o r»ng t¹i mét thêi ®iÓm chØ cã mét luång truy nhËp ®Õn biÕn cña chóng ta. §ång bé hãa cung cÊp c¬ chÕ lock khãa ®èi tîng cho ®Õn khi nã kÕt thóc lµm viÖc th× luång kh¸c míi ®îc sö dông.
Cã ba c¬ chÕ ®ång bé hãa cung cÊp bëi CLR :
Líp Interlock.
LÖnh lock C#.
Líp Monitor.
II.5.1. Líp Interlocked:
Líp nµy cung cÊp mét c¬ chÕ ho¹t ®éng tèi gi¶n trªn c¸c biÕn ®îc sö dông bëi nhiÒu luång. C¸c ph¬ng thøc cña líp nµy cho ta mét c¬ chÕ b¶o vÖ chèng l¹i c¸c lçi cã thÓ x¶y ra trong khi mét luång ®ang cËp nhËt mét biÕn mµ c¸c luång kh¸c l¹i truy nhËp nhËp vµo.
II.5.2. Sö dông lÖnh C# lock:
MÆc dï ®èi tîng Interlocked trªn cho ta mét ph¬ng c¸ch tèt nÕu ta muèn t¨ng gi¶m d÷ liÖu. Tuy nhiªn chóng ta muèn thao t¸c trªn d÷ liÖu theo nhiÒu môc ®Ých kh¸c n÷a mµ tr¸nh x¶y ra xung ®ét gi÷a c¸c luång. C# cung cÊp cho ta c¬ chÕ lock ®¶m ch¾c r»ng kh«ng cã luång nµo thùc hiÖn trªn ®o¹n g¨ng trong khi mét luång kh¸c ®ang sö dông nã. Có ph¸p :
lock(expression) statement_block
Trong ®ã:
expression: chØ ®Þnh mét ®èi tîng mµ b¹n muèn logon. expression cã thÓ lµ lo¹i tham biÕn.
statement_block: thÓ hiÖn ®o¹n code chÞu ¶nh hëng cña lock.
VÝ dô sau ®©y m« pháng c¸ch sö dông lock b»ng c¸ch söa l¹i ®o¹n m· cña vÝ dô trªn.
try{
while(counter<1000){
lock(this){
int temp=counter;
temp++;
Thread.Sleep(1);
counter=temp;
}
Console.WriteLine("Thread {0}. Incrementer:{1}",
Thread.CurrentThread.Name,counter);
}
}
KÕt qu¶ ®Çu ra còng t¬ng tù nh vÝ dô trªn.
II.5.3. Monitor:
Trong c¸c ®iÒu khiÓn phøc t¹p truy nhËp ®Õn tµi nguyªn chóng ta sö dông bé gi¸m s¸t Monitor. Líp Monitor ®iÒu khiÓn truy nhËp ®Õn ®èi tîng b»ng c¸ch ®¶m b¶o mét lock trªn ®èi tùîng cho mét luång duy nhÊt. §èi tîng lock ®¶m b¶o sù giíi h¹n trong viÖc truy xuÊt ®Õn mét ®o¹n m· nµo ®ã, thêng ®îc gäi lµ ®o¹n g¨ng. Trong khi mét luång së h÷u mét lock ®èi tîng, c¸c luång kh¸c kh«ng thÓ chiÕm lÊy lock trõ khi luång thùc hiÖn xong vµ tr¶ vÒ lock cho c¸c luång trong hµng.
C¸c th«ng tin sau ®©y cÇn duy tr× cho mçi ®èi tùong ®ång bé hãa:
Mét tham chiÕu tíi luång n¾m gi÷ khãa.
Mét tham chiÕu ®Õn hµng ®îi chøa c¸c luång s½n sµng cho nhËn lÊy khãa.
Mét tham chiÕu tíi hµng ®îi chøa ®ùng c¸c luång ®ang chê ®îi th«ng b¸o cho sù thay ®æi tr¹ng th¸i cña ®èi tîng khãa.
B¶ng sau d©y cho ta c¸c hµnh ®éng cã thÓ lÊy bëi c¸c luång truy nhËp ®Õn ®èi tîng lock:
Hµnh ®éng
M« t¶
Enter,TryEnter
Hµnh ®éng yªu cÇu mét lock ®Õn mét ®èi tîng, hµnh ®éng nµy ®¸nh dÊu sù b¾t ®Çu cña mét ®o¹n g¨ng.
Wait
Gi¶i phãng lock trªn mét ®èi tîng t¹o c¬ héi cho c¸c luång kh¸c chiÕm lÊy lock vµ truy nhËp ®Õn ®èi tîng.
Pusle,PusleAll
Göi mét hay nhiÒu tÝn hiÖu ®Õn mét hay nhiÒu luång ®ang ®îi. TÝn hiÖu th«ng b¸o tíi c¸c luång ®ang ®îi r»ng tr¹ng th¸i cña ®èi tîng lock ®· thay ®æi vµ së h÷u lock cña nã s½n sµng nhêng lock.
Exit
Gi¶i phãng mét lock, ho¹t ®éng nµy ®¸nh dÊu chÊm hÕt cho mét ®o¹n g¨ng b¶o vÖ b»ng lock.
ë ®©y ta sö dông ph¬ng thøc Enter hoÆc Exit ®Ó ®¸nh ®Êu sù b¾t ®Çu vµ kÕt thóc cña mét ®o¹n g¨ng. NÕu ®o¹n g¨ng lµ mét dßng lÖnh liªn tôc, lock yªu cÇu bëi ph¬ng thøc Enter ®¶m b¶o r»ng chØ mét luång ch¹y trªn ®o¹n code víi ®èi tùîng lock. Trong nhiÒu trêng hîp chóng ta nªn ®Æt Enter trong try vµ Exit trong finally. §iÒu nµy thuËn tiÖn nµy ®îc sö dông ®ång bé hãa truy nhËp trªn ph¬ng thøc tÜnh hoÆc thÓ hiÖn cña mét líp.
Sau ®©y lµ mét vÝ dô sö dông Monitor:
namespace Programming_CSharp
{
using System;
using System.Threading;
class Tester
{
static void Main( )
{
Tester t = new Tester( ); //chÕ nªn mét thÓ hiÖn cña líp hiÖn hµnh
t.DoTest( ); //ch¹y bªn ngoµi static Main
}
public void DoTest( )
{
//t¹o mét m¶ng c¸c luång
Thread[] myThreads =
{
new Thread( new ThreadStart(Decrementer) ),
new Thread( new ThreadStart(Incrementer) )
};
int ctr = 1;//b¾t ®Çu víi mçi luång
foreach (Thread myThread in myThreads)
{
myThread.IsBackground=true;
myThread.Start( );
myThread.Name = "Thread" + ctr.ToString( );
ctr++;
Console.WriteLine("Started thread {0}", myThread.Name);
Thread.Sleep(50);
}
//chê ®îi cho c¸c luång kÕt thóc míi lµm tiÕp
foreach (Thread myThread in myThreads)
{
myThread.Join( );
}//sau khi kÕt thóc in ra c©u nµy
Console.WriteLine("All my threads are done.");
}
void Decrementer( )
{
try
{
Monitor.Enter(this);//®ång bé hãa c¸c truy nhËp
if (counter < 10)
{
Console.WriteLine("[{0}] In Decrementer. Counter: {1}. Gotta Wait!",
Thread.CurrentThread.Name, counter);
Monitor.Wait(this);//nÕu counter nhá h¬n muêi th× cho luång nµy chê
}
while (counter >0)
{
long temp = counter;
temp--;
Thread.Sleep(1);
counter = temp;
Console.WriteLine("[{0}] In Decrementer. Counter: {1}. ",
Thread.CurrentThread.Name, counter);
}
}
finally
{
Monitor.Exit(this);
}
}
void Incrementer( )
{
try
{
Monitor.Enter(this);
while (counter < 10)
{
long temp = counter;
temp++;
Thread.Sleep(1);
counter = temp;
Console.WriteLine("[{0}] In Incrementer. Counter: {1}",
Thread.CurrentThread.Name, counter);
}
Monitor.Pulse(this);//th«ng b¸o cho luång kh¸c ®Õn lÊy khãa mµ dïng
}
finally
{
Console.WriteLine("[{0}] Exiting...",Thread.CurrentThread.Name);
Monitor.Exit(this);
}
}
private long counter = 0;
}
}
§Çu ra cña ch¬ng tr×nh trªn nh sau:
Started thread Thread1
[Thread1] In Decrementer. Counter: 0. Gotta Wait!
Started thread Thread2
[Thread2] In Incrementer. Counter: 1
[Thread2] In Incrementer. Counter: 2
[Thread2] In Incrementer. Counter: 3
[Thread2] In Incrementer. Counter: 4
[Thread2] In Incrementer. Counter: 5
PhÇn IV: XML vµ C#
I. LÞch sö c¸c ng«n ng÷ ®¸nh dÊu
I.1. Kh¸i niÖm “®¸nh dÊu” (markup)
Nh chóng ta ®· biÕt, kh¸i niÖm “®¸nh dÊu” ë ®©y ¸m chØ viÖc g¸n thÎ (tagging) cho c¸c tµi liÖu ®iÖn tö v× hai môc ®Ých: ®Þnh d¹ng v¨n b¶n hoÆc t¹o nªn c¸c cÊu tróc theo mét ý nghÜa nµo ®ã cho mét tµi liÖu ®Ó cã thÓ kÕt xuÊt hoÆc trao ®æi, vÝ dô nh kÕt xuÊt ra m¸y in hoÆc t¶i lªn World Wide Web.
NÕu chóng ta ®· tõng sö dông mét tr×nh so¹n th¶o HTML vÝ dô nh Microsoft FrontPage hay ch¬ng tr×nh so¹n th¶o vÝ dô nh MicrosoftWord th× ch¾c h¼n chóng ta ®· quen víi kh¸i niÖm thay ®æi ®Þnh d¹ng v¨n b¶n trong mét tµi liÖu. VËy c¸c ch¬ng tr×nh ®ã thùc hiÖn thao t¸c nµy ra sao? Thùc ra c¸c tr×nh so¹n th¶o ®ã ®· dïng c¸c kÝ tù “®¸nh dÊu” ®Ó ®Þnh d¹ng v¨n b¶n. Ta xÐt mét vÝ dô sau ®¬n gi¶n. Gi¶ sö ta t¹o mét v¨n b¶n theo ®Þnh d¹ng .rtf(rich text format) trong tr×nh so¹n th¶o WordPad:
H×nh 12 Minh ho¹ so¹n th¶o trong WordPad
Ta cã thÓ xem code cña v¨n b¶n trªn (vÝ dô trong NodePad):
H×nh 13 M· cña v¨n b¶n ®äc b»ng NotePad
Nh ta thÊy phÇn code cña v¨n b¶n kh¸c h¬n nhiÒu so víi phÇn hiÓn thÞ cña nã .Nh vËy tr×nh so¹n th¶o (ë ®©y lµ WordPad) xö lÝ c¸c thÎ ®¸nh dÊu trong code ®Ó hiÓn thÞ cho ngêi sö dông. VÝ dô nh thÎ \rtf1 b¸o cho tr×nh so¹n th¶o biÕt ®©y lµ v¨n b¶n theo ®Þnh d¹ng .rtf, thÎ \par b¾t ®Çu mét dßng míi ... Tr×nh so¹n th¶o chØ cã nhiÖm vô ®äc c¸c thÎ g¸n vµ diÔn dÞch ý nghÜa c¸c thÎ sau ®ã hiÓn thÞ cho ngêi sö dông.
Tuy nhiªn nÕu ta t¹o mét v¨n b¶n nh trªn theo ®Þnh d¹ng Word. PhÇn code cña v¨n b¶n cã d¹ng sau :
H×nh 14 M· cña v¨n b¶n Word ®äc b»ng NotePad
Tr×nh so¹n th¶o Word ®· thªm mét sè thµnh phÇn vµo c¸c thÎ ®Þnh d¹ng .rtf vµ lu toµn bé tµi liÖu díi d¹ng file nhÞ ph©n vµ ta kh«ng thÓ ®äc ®îc díi d¹ng file v¨n b¶n. Ta cßn gäi ®©y lµ ®Þnh d¹ng theo kiÓu ®ãng tøc lµ c¸c h·ng kh¸c nhau cã thÓ ®a ra c¸c ®Þnh d¹ng kh¸c nhau cho file tËp tin nhÞ ph©n vµ c¸c tr×nh so¹n th¶o riªng biÖt ph¶i hiÓu râ ý nghÜa cña luång c¸c bit vµo tõ ®ã phiªn dÞch ra kÕt qu¶ cho ngêi sö dông. Cßn ®Þnh d¹ng theo kiÓu më tøc lµ c¸c file nhÞ ph©n ®ã ®· ®îc chuÈn ho¸ .VÝ dô nh khi tr×nh so¹n th¶o ®äc ®îc c¸c bit 1100001 th× nã sÏ diÔn gi¶i thµnh sè ‘97’ vµ tËp tin nhÞ ph©n ®îc chuÈn ho¸ cßn ®îc gäi lµ tËp tin v¨n b¶n hay lµ mang tÝnh chÊt më.
Bªn c¹nh viÖc dïng ®Ó ®Þnh d¹ng v¨n b¶n, kh¸i niÖm “®¸nh dÊu” cßn ®îc sö dông ®Ó t¹o ra c¸c cÊu tróc hay ng÷ c¶nh cña c¸c thµnh phÇn.VÝ dô nh ta cã thÓ x¸c ®Þnh mét tµi liÖu chØ chøa c¸c thµnh phÇn nh tªn, tuæi, ngµy sinh. Ngoµi ra ta cßn cã thÓ ®Þnh d¹ng tµi liÖu nÕu kh«ng chøa thµnh phÇn tªn th× kh«ng chøa c¸c thµnh phÇn nh tuæi, ngµy sinh. MÆt kh¸c kiÓu cña c¸c thµnh phÇn còng ®îc x¸c ®Þnh nh thµnh phÇn tªn ë díi d¹ng v¨n b¶n, thµnh phÇn ngµy sinh díi d¹ng ngµy th¸ng vµ thµnh phÇn tuæi díi d¹ng sè. Nh vËy ë ®©y kh¸i niÖm “®¸nh dÊu” ®îc dïng ®Ó thiÕt lËp cÊu tróc cña tµi liÖu vµ ng÷ nghÜa cña c¸c thµnh phÇn. Ta t¹o ra mét tµi liÖu cã néi dung nh vÝ dô trªn b»ng ng«n ng÷ “®¸nh dÊu” HTML .Díi ®©y lµ phÇn code:
H×nh 15 T¹o v¨n b¶n HTML trong NotePad
Theo ®Þnh d¹ng cña ng«n ng÷ HTML th× tµi liÖu ®· ®îc cÊu tróc ho¸ mÆc dï cha ®îc chÆt chÏ. HTML sö dông c¸c thÎ ®Ó “®¸nh dÊu”, vÝ dô nh néi dung cña mét trang HTML n»m trong cÆp thÎ vµ . Sau ®ã lµ ®Õn c¸c thµnh phÇn nh Head, Title, Body... TÊt c¶ c¸c ®o¹n code ®Òu cã chç x¸c ®Þnh vµ mang ý nghÜa trong trang HTML vÝ dô nh thÎ “®¸nh dÊu” vµ cho biÕt phÇn néi dung n»m gi÷a hai thÎ nµy ph¶i ®îc in ®Ëm, thÎ x¸c ®Þnh mét chç xuèng dßng...
I.2. Ng«n ng÷ ®¸nh dÊu
HiÖn nay cã hai lo¹i ng«n ng÷ ®¸nh dÊu ®ang ®îc sö dông ®ã lµ ng«n ng÷ ®¸nh dÊu chuyªn dông vµ ng«n ng÷ ®¸nh dÊu chung. Ng«n ng÷ ®¸nh dÊu chuyªn dông ®îc sö dông ®Ó t¹o ra code chuyªn dông cho mét tr×nh øng dông nµo ®ã hoÆc thiÕt bÞ nµo ®ã. C¸c ng«n ng÷ nµy ®îc x©y dùng phôc vô cho c¸c môc ®Ých chuyªn biÖt. VÝ dô vÒ ng«n ng÷ ®¸nh dÊu chuyªn dông nh ng«n ng÷ HTML ®Ó ®Þnh d¹ng tµi liÖu cho môc ®Ých Web hay ng«n ng÷ RTF ®Ó ®Þnh d¹ng v¨n b¶n. C¸c ng«n ng÷ nµy cã ®Æc ®iÓm lµ: sè lîng c¸c thÎ h¹n chÕ, c¸c tµi liÖu kh«ng cã tÝnh kh¶ chuyÓn do ®îc thiÕt kÕ cho mét tr×nh øng dông cô thÓ.
Vµo nh÷ng n¨m 70 gi¸o s C.F.Goldfarb (h·ng IBM) vµ c¸c ®ång nghiÖp ®a ra mét ph¬ng ph¸p diÔn ®¹t v¨n b¶n kh«ng x¸c ®Þnh riªng cho mét tr×nh øng dông hay mét thiÕt bÞ nµo. Ph¬ng ph¸p ®ã cã hai ®iÓm c¬ b¶n, ®ã lµ: c¸c ‘®¸nh dÊu’ biÓu thÞ cÊu tróc cña tµi liÖu chø kh«ng diÔn ®¹t cho viÖc ®Þnh d¹ng kiÓu v¨n b¶n vµ c¸c qui t¾c vÒ ‘®¸nh dÊu’ ph¶i ®îc thiÕt lËp nghiªm ngÆt sao cho code dÔ hiÓu ®èi víi c¸c ch¬ng tr×nh vµ con ngêi. KÕt qu¶ cña ý tëng trªn lµm tiÒn ®Ò cho sù ra ®êi ng«n ng÷ DCF GML(Document Composition Facility Generalized Markup Language) do IBM ph¸t triÓn .Sau ®ã vµo n¨m 1986 tæ chøc ISO(International Srandard Organization) phª chuÈn ng«n ng÷ SGML(Standard Generalized Markup Language)
II. Tæng quan vÒ ng«n ng÷ XML
II.1. Ng«n ng÷ XML lµ g×?
Ng«n ng÷ XML lµ ng«n ng÷ thÕ hÖ sau cña SGML hay nãi c¸ch kh¸c XML lµ tËp con cña SGML. Kh«ng gièng nh ng«n ng÷ HTML ( HTML ®îc coi lµ mét øng dông cña SGML bëi v× HTML ®îc t¹o ra dùa trªn chuÈn SGML vµ nã kÕ thõa nhiÒu chi tiÕt tõ SGML), XML lµ tËp con cña SGML vµ XML còng ®îc coi lµ mét ‘siªu ng«n ng÷’ (ng«n ng÷ cã thÓ t¹o ra c¸c ng«n ng÷ kh¸c). XML ®îc tèi u ho¸ cho viÖc sö dông trªn World Wide Web vµ nã cung cÊp cho ngêi sö dông thªm mét sè tiÖn Ých kh¸c mµ SGML kh«ng hç trî.
NÕu nh HTML thiªn vÒ biÓu diÔn th«ng tin th× XML thiªn vÒ viÖc m« t¶ th«ng tin. XML lµ mét chuÈn ®îc sö dông ®Ó cÊu tróc vµ m« t¶ d÷ liÖu mµ c¸c øng dông kh¸c nhau cã thÓ sö dông ®îc. TÝnh n¨ng u viÖt cña XML lµ ë chç nã t¸ch biÖt gi÷a giao diÖn ngêi dïng vµ d÷ liÖu.
Nh vËy XML cã thÓ ®îc sö dông nh lµ ®Þnh d¹ng ®Ó trao ®æi d÷ liÖu. RÊt nhiÒu c¸c hÖ thèng, ®îc gäi lµ c¸c hÖ di s¶n (legacy systems), cã thÓ chøa d÷ liÖu theo c¸c ®Þnh d¹ng riªng biÖt vµ c¸c nhµ ph¸t triÓn ®ang cè g¾ng kÕt nèi c¸c hÖ thèng nµy sö dông Internet. VÊn ®Ò lµ lµm sao trao ®æi d÷ liÖu gi÷a c¸c hÖ thèng kh«ng t¬ng thÝch víi nhau. XML sÏ lµ gi¶i ph¸p cña vÊn ®Ò. C¸c d÷ liÖu cã thÓ ®îc chuyÓn sang ®Þnh d¹ng v¨n b¶n XML mµ c¸c øng dông hay c¸c hÖ thèng kh¸c nhau ®Òu sö ®ông ®îc.
Bªn c¹nh ®ã, ta cã thÓ sö dông XML cho c¸c d÷ liÖu Web. Lóc ®ã trang HTML chØ cã nhiÖm vô ®Þnh d¹ng vÒ mÆt tr×nh bµy cßn d÷ liÖu ®îc chøa trong file XML. Do ®ã ta cã thÓ cËp nhËt néi dung hay thËm chÝ lµ chuyÓn ®æi néi dung cña d÷ liÖu sang ®Þnh d¹ng kh¸c mµ kh«ng ph¶i thay ®æi code HTML.
Ngoµi ra XML cßn ®îc sö dông ®Ó t¹o ra c¸c kho d÷ liÖu c«ng céng. Mét vÝ dô ®iÓn h×nh lµ, nÕu ngêi sö dông ®ang viÕt mét bµi b¸o cho mét t¹p chÝ. Toµ so¹n b¸o muèn ®ång thêi ®a bµi b¸o lªn Web site vµ t¹p chÝ. NÕu nh bµi b¸o ®îc ®Þnh d¹ng theo RTF th× nã cã thÓ ph¶i ®îc ®Þnh d¹ng l¹i ®Ó cã thÓ t¶i lªn Web, sau ®ã nã ph¶i ®Þnh d¹ng mét lÇn n÷a ®Ó ®a vµo t¹p chÝ xuÊt b¶n. Tuy nhiªn nÕu bµi b¸o ®ã ®îc viÕt theo chuÈn XML th× nã cã thÓ ®îc kÕt xuÊt ra c¸c m«i trêng kh¸c nhau mét c¸ch ®ång thêi bëi v× d÷ liÖu cña bµi b¸o vµ c¸ch hiÓn thÞ t¬ng øng lµ t¸ch biÖt nhau. H¬n thÕ n÷a c¸c ch¬ng tr×nh øng dông ®Ó hiÓn thÞ d÷ liÖu chØ cÇn ®îc t¹o ra mét lÇn vµ ta cã thÓ cã thÓ sö dông nã ®Ó hiÓn thÞ mét sè lîng bµi b¸o tuú ý.
Nh vËy , XML lµ ph¬ng thøc h÷u hiÖu ®Ó lu tr÷ d÷ liÖu kh«ng nh÷ng chØ cho môc ®Ých sö dông trªn Web mµ cßn ®îc sö dông trong c¸c øng dông kh¸c nhau.
II.2. C¸c u ®iÓm cña XML
Ng«n ng÷ XML nhá h¬n vµ ®¬n gi¶n h¬n so víi SGML. Nh ®· nãi ë trªn XML ®îc t¹o ra víi môc ®Ých chñ yÕu cho viÖc øng dông trªn Web nªn nã ®· ®îc c¾t bá nhiÒu thµnh phÇn kh«ng cÇn thiÕt. C¸c ®Æc t¶ vÒ SGML dµi 155 trang trong khi ®Æc t¶ vÒ XML chØ dµi 35 trang.
XML bao gåm thªm tÝnh n¨ng siªu liªn kÕt ®îc m« t¶ nh mét ng«n ng÷ t¸ch biÖt cã tªn lµ XLL(Extensible Linking Language). Trong khi ®ã SGML kh«ng bao gåm tÝnh n¨ng nµy mµ nã chØ coi ®ã lµ mét thµnh phÇn ®îc phÐp thªm vµo.
XML bao gåm mét ®Æc t¶ vÒ ng«n ng÷ ®Þnh kiÓu cã tªn lµ :XSL(Extensible Stylesheet Language). §©y lµ ng«n ng÷ cung cÊp cho ngêi sö dông c¸c hç trî vÒ øng dông b¶n ®Þnh kiÓu(style-sheets) mµ SGML kh«ng cã. C¸c b¶n ®Þnh kiÓu cho phÐp ngêi sö dông t¹o ra c¸c b¶n mÉu (template) cã c¸c kiÓu c¸ch kh¸c nhau (vÝ dô nh in ®Ëm, in nghiªng ...) hoÆc kÕt hîp c¸c kiÓu c¸ch kh¸c nhau vµo trong c¸c thµnh phÇn trong mét tµi liÖu.
HiÖn nay W3C ®a ra khuyÕn c¸o vÒ ®Æc t¶ XML1.0. XML ®ang tiÕn dÇn ®Õn viÖc ®¸p øng cho nhu cÇu sö dông réng r·i. Tuy nhiªn ®©y míi chØ lµ khuyÕn c¸o cña mét tæ chøc chø cha ph¶i lµ mét chuÈn.
II.3. C¸c øng dông XML
II.3.1. Mathematical Markup Language (MathML)
MathML 1.0 míi ®îc tæ chøc W3C khuyÕn c¸o gÇn ®©y. MathML lµ mét øng dông XML ®îc thiÕt kÕ ®Ó t¹o thuËn lîi cho viÖc sö dông c¸c c«ng thøc to¸n häc còng nh c¸c néi dung mang tÝnh khoa häc trªn Web .
II.3.2. Resource Description Framework(RDF)
RDF lµ tr¹m m« h×nh d÷ liÖu phôc vô nh lµ mét kho ®Ó xö lÝ c¸c siªu d÷ liÖu .RDF sö dông XML ®Ó lµm có ph¸p m· ho¸ mÆc dï tån t¹i nhiÒu c¸ch kh¸c ®Ó biÓu thÞ m« h×nh RDF. Tuy nhiªn c¸c ®Æc t¶ có ph¸p vµ m« h×nh RDF míi chØ trong giai ®o¹n thö nghiÖm.
II.3.3. XML Linking Language(XLink)
XLink lµ øng dông XML t¹o ra bé m¸y ®Ó kÕt nèi c¸c tµi liªô XML. XLink bao gåm kh¶ n¨ng kÕt nèi nhiÒu nguån kh¸c nhau. MÆt kh¸c, XLinhk cho phÐp liªn kÕt c¸c ®Þnh d¹ng d÷ liÖu kh¸c nhau nh lµ h×nh ¶nh ... Ngoµi ra XLink cßn cung cÊp tiÖn Ých liªn kÕt ‘th«ng minh’ cã thÓ liªn kÕt ®éng vµ läc liªn kÕt dùa trªn néi dung vµ ng÷ c¶nh.
II.3.4. Synchronized Multimedia Intergration Language(SMIL)
SMIL lµ øng dông XML cho phÐp sö dông c¸c truyÒn th«ng ®a ph¬ng tiÖn trªn Web. §iÓm m¹nh cña SMIL lµ nã cho phÐp ngêi sö dông t¹o ra c¸c truyÒn th«ng ®a ph¬ng tiÖn phøc t¹p, ®ång bé mµ kh«ng ph¶i chuyÓn néi dung sang ®Þnh d¹ng kh¸c nh lµ video hay sö dông c¸c ng«n ng÷ script phøc t¹p. Tæ chøc W3C võa ®a ra khuyÕn c¸o vÒ SMIL 1.0.
II.3.5. Extensible Stylesheet Language(XSL)
XSL lµ ng«n ng÷ ®Þnh d¹ng v¨n b¶n ®îc thiÕt kÕ mét c¸ch linh ho¹t vµ cã tÝnh më. XSL lÊy c¸c CSS ( Cascading Style Sheets – b¶n kiÓu d¸ng liªn hoµn) ®Ó thùc hiÖn c¸c t¸c vô ®Þnh d¹ng phøc t¹p nh thÓ lµ code ®îc nhóng trong c¸c b¶n kiÓu d¸ng. XSL míi trong giai ®o¹n thö nghiÖm.
II.4. T¬ng lai XML
XML sÏ ®îc sö dông réng r·i vµ trùc tiÕp trªn Internet. Tríc hÕt XML lµm viÖc tèt trªn Internet vµ phôc vô tèt cho c¸c ch¬ng tr×nh ch¹y trªn m«i trêng m¹ng ph©n t¸n. §iÓm tiÕp theo lµ tÝnh trùc tiÕp cña XML. SGML qu¸ phøc t¹p ®èi víi c¸c nhµ ph¸t triÓn vµ cÊu tróc cña nã qu¸ rêm rµ ®èi víi c¸c client ®Ó cã thÓ xö lÝ trong m«i trêng m¹ng. XML lo¹i bá hÇu hÕt c¸c thµnh phÇn phøc t¹p vµ chØ gi÷ l¹i c¸c thµnh phÇn g× lµ cÇn thiÕt.
T¬ng lai XML sÏ hç trî tÊt c¶ c¸c øng dông. Môc tiªu nµy muèn ®¹t ®îc th× XML ph¶i cã ®Çy ®ñ c¸c tiÖn Ých hç trî cho c¸c øng dông kh¸c nhau nh lµ c¸c c«ng cô chuyªn gia, bé m¸y hiÓn thÞ, c«ng cô dÞch vµ c¶ tiÖn Ých vÒ c¬ së d÷ liÖu.
XML sÏ t¬ng thÝch hoµn toµn víi SGML. §©y còng lµ nhiÖm vô cã tÝnh chÊt quyÕt ®Þnh cña viÖc thiÕt kÕ XML ®ång thêi còng lµ nhiÖm vô khã ®¹t ®îc. Môc tiªu lµ bÊt cø mét tµi liÖu XML hîp lÖ nµo còng sÏ lµ mét tµi liÖu SGML hîp lÖ. §iÒu nµy cã thÓ ®¹t ®îc b»ng c¸ch t¹o ra mét c«ng cô mµ c¸c tr×nh xö lÝ XML cã thÓ xö lÝ ®îc code SGML.
ViÖc t¹o ra c¸c ch¬ng tr×nh xö lÝ tµi liÖu XML trë nªn dÔ dµng. C¸ch lµm ë ®©y dùa trªn ý tëng lµ mçi mét ng«n ng÷ sÏ cã mét c«ng cô xö lý t¬ng øng. HiÖn nay cã nhiÒu c«ng cô XML ®ang ®îc thö nghiÖm vµ ®îc sö dông miÔn phÝ.
C¸c ®Æc tÝnh lùa chän trong XML sÏ ®îc gi¶m tèi ®a. §Æc ®iÓm sÏ kh¾c phôc ®îc vÊn ®Ò mµ SGML gÆp ph¶i. SGML cho phÐp nhiÒu ®Æc tÝnh lùa chän mµ ta kh«ng bao giê dïng ®Õn. ChÝnh v× ®iÒu nµy mµ nhiÒu tr×nh xö lÝ SGML chØ xö víi tµi liÖu SGML cã lùa chän nµy mµ kh«ng t¬ng thÝch víi tµi liÖu SGML cã lùa chän kh¸c.
XML sÏ dÔ ®äc vµ cã nghÜa víi ngêi sö dông. XML sö dông v¨n b¶n th« ®Ó m« t¶ d÷ liÖu vµ mèi quan hÖ gi÷a d÷ liÖu nªn ngêi sö dông dÔ lµm viÖc víi nã h¬n lµ lµm viÖc víi ®Þnh d¹ng nhÞ ph©n. Ngêi sö dông kh«ng cÇn sö dông c¸c c«ng cô phøc t¹p mµ chØ cÇn mét tr×nh so¹n th¶o v¨n b¶n cã thÓ t¹o ra ®îc code XML.
XML sÏ ®îc thiÕt kÕ theo mét chuÈn. §Ó cã thÓ cã ®îc c¸c ®Æc t¶ mét chuÈn mét c¸ch chÝnh x¸c, c¸c ®Æc t¶ nµy sö dông EBNF(Extended Backus – Naur Form) -mét chuÈn ®Æc t¶ ®îc dïng m« t¶ c¸c ng«n ng÷ lËp tr×nh cã khai b¸o .
III. CÊu tróc vµ có ph¸p XML
III.1. CÊu tróc XML
Nh ®· tr×nh bµy ë trªn,u ®iÓm cña XML lµ nã cã t¹o ra c¸c tµi liÖu cã cÊu tróc. Mçi tµi liÖu XML cã hai cÊu tróc lµ: cÊu tróc vËt lÝ vµ cÊu tróc logic. VÝ dô ë h×nh vÏ díi ®©y:
H×nh 16 CÊu tróc cña XML
III.1.1. CÊu tróc logic
CÊu tróc logic cña XML ®îc xem nh lµ mét b¶n mÉu thÓ hiÖn c¸c thµnh tè trong mét tµi liÖu theo mét thø tù nhÊt ®Þnh. CÊu tróc logic m« t¶ c¸ch x©y dùng mét tµi liÖu chø kh«ng ph¶i m« t¶ tµi liÖu ®ã chøa c¸i g×.
Thµnh phÇn ®Çu tiªn cña tµi liÖu lµ tïy chän ‘prolog’. ’Prolog’ bao gåm hai phÇn chÝnh lµ khai b¸o XML vµ khai b¸o kiÓu tµi liÖu.
Khai b¸o XML: khai b¸o XML x¸c ®Þnh phiªn b¶n cña ®Æc t¶ XML mµ tµi liÖu tu©n theo. Ngoµi ra khai b¸o XML cßn cã thÓ chøa khai b¸o m· ho¸ x¸c ®Þnh c¸ch m· ho¸ c¸c kÝ tù trong tµi liÖu vµ khai b¸o tµi liÖu t¸ch biÖt (stand-alone declaration) x¸c ®Þnh c¸c khai b¸o ‘®¸nh dÊu’ cã n»m ngoµi tµi liÖu hay kh«ng.VÝ dô :
Khai b¸o kiÓu tµi liÖu: khai b¸o kiÓu tµi liÖu chøa c¸c code ‘®¸nh dÊu’ x¸c ®Þnh c¸c quy t¾c ng÷ ph¸p hay cßn gäi lµ DTD ( Document Type Definition) cho mét líp ®Æc biÖt nµo ®ã trong tµi liÖu. Khai b¸o nµy cßn cã trá tíi c¸c file kh¸c chøa c¸c DTD. Khai b¸o nµy ph¶i ®i sau khai b¸o kiÓu XML vµ ®øng tríc c¸c thµnh phÇn cña tµi liÖu.VÝ dô nh khai b¸o sau:
Khai b¸o nµy b¸o cho tr×nh xö lÝ XML biÕt ®îc tµi liÖu nµy thuéc líp Detail vµ nã ph¶i tu©n theo c¸c quy ®Þnh ®îc ®Þnh nghÜa trong file ‘Dtl.dtd’.
TiÕp theo lµ c¸c thµnh phÇn cña tµi liÖu, phÇn chÝnh cña mét tµi liÖu XML, n¬i chøa c¸c néi dung chÝnh. C¸c thµnh phÇn tµi liÖu nµy cßn cã thÓ bao gåm c¸c thµnh phÇn tµi liÖu con vµ c¶ c¸c thùc thÓ ngoµi. XML cã cÊu tróc c©y, nã bao gåm mét thµnh phÇn gèc vµ c¸c thµnh phÇn con sau ®ã lµ c¸c thµnh phÇn kÕ tiÕp (cã thÓ rçng). Mçi thµnh phÇn cã tªn vµ cã thÓ cã c¸c thuéc tÝnh. VÝ dô:
H×nh 17 Khai b¸o thµnh phÇn trong XML
III.1.2. CÊu tróc vËt lÝ
CÊu tróc vËt lÝ cña XML chøa d÷ liÖu thùc ®îc sö dông trong tµi liÖu XML. C¸c d÷ liÖu nµy cã thÓ lµ v¨n b¶n chøa trong bé nhí m¸y tÝnh, file h×nh ¶nh trªn World Wide Web... NÕu nh cÊu tróc logic lµ b¶n thiÕt kÕ ng«i nhµ th× cÊu tróc vËt lÝ chÝnh lµ kh«ng gian thËt chøa ng«i nhµ ®ã. Ng«i nhµ cã chøa c¸c ®å ®¹c hay gäi lµ c¸c thùc thÓ. Mçi mét thùc thÓ cã tªn riªng vµ cã néi dung riªng, néi dung nµy cã thÓ n»m trong tµi liÖu hoÆc lµ mét file ngoµi tµi liÖu. C¸c thùc thÓ ®îc khai b¸o trong phÇn ‘prolog’ vµ ®îc tham chiÕu trong c¸c thµnh phÇn cña tµi liÖu. Thùc thÓ chia lµm hai lo¹i lµ thùc thÓ ph©n t¸ch vµ thùc thÓ kh«ng ph©n t¸ch.
Thùc thÓ ph©n t¸ch hay cßn ®îc gäi lµ thùc thÓ v¨n b¶n ,chøa c¸c d÷ liÖu v¨n b¶n ,trê thµnh mét phÇn cña tµi liÖu XML .Khi mét tr×nh xö lÝ XML ph©n t¸ch c¸c thùc thÓ nµy ,néi dung cña chóng xuÊt hiÖn nh mét phÇn cña tµi liÖu t¹i n¬i tham chiÕu thùc thÓ .VÝ dô nh ta cã khai b¸o nh sau :
.
Mçi khi thùc thÓ ®îc tham chiÕu trong tµi liÖu th× néi dung cña nã sÏ ®îc ®Æt vµo n¬i tham chiÕu ®ã. NÕu muèn thay ®æi néi dung cña thùc thÓ th× ta chØ cÇn thay ®æi ë khai b¸o, sau ®ã thay ®æi nµy ®îc ¸nh x¹ tíi nh÷ng n¬i mµ tham chiÕu tíi thùc thÓ.
Thùc thÓ kh«ng ph©n t¸ch ®îc coi nh lµ mét thïng chøa mµ néi dung cña nã cã thÓ cã hay kh«ng cã v¨n b¶n .Thùc thÓ kh«ng ph©n t¸ch ®îc ®«i khi cßn cã tªn lµ thùc thÓ nhÞ ph©n bëi v× néi dung cña nã thêng lµ file nhÞ ph©n(vÝ dô nh file ¶nh) vµ tr×nh xö lÝ XML kh«ng trùc tiÕp th«ng dÞch ®îc .Khai b¸o mét thùc thÓ kh«ng ph©n t¸ch ®îc cÇn mét chó thÝch ®Ó x¸c ®Þnh kiÓu ®Þnh d¹ng hay kiÓu hay nguån cña thùc thÓ .VÝ dô nh khai b¸o sau :
.
Ngoµi ra c¸c chó thÝch còng cÇn ®îc khai b¸o. C¸c khai b¸o chó thÝch gióp cho tr×nh xö lÝ XML thao t¸c trªn c¸c file nhÞ ph©n. VÝ dô nh ta cã thÓ khai b¸o chó thÝch cho vÝ dô trªn :.
Thùc thÓ tiÒn ®Þnh nghÜa:Trong XML mét sè kÝ tù nµo ®ã ®îc sö dông ®Ó ‘®¸nh dÊu’ tµi liÖu.Trong vÝ dô sau thµnh phÇn Person ®îc xem nh lµ mét ‘®¸nh dÊu’ vµ kh«ng ®îc coi lµ d÷ liÖu kÝ tù : Bill. Theo W3C tÊt c¶ c¸c tr×nh xö lÝ XML ®Òu nhËn biÕt c¸c tham chiÕu thùc thÓ tiÒn ®Þnh nghÜa mÆc dï c¸c thùc thÓ nµy kh«ng ®îc khai b¸o. V× vËy chØ cã c¸c thùc thÓ ®îc khai b¸o trong DTD cña tµi liÖu míi ®îc xem lµ hîp lÖ.
Néi thùc thÓ trong vµ ngo¹i thùc thÓ: Thùc thÓ trong lµ c¸c thùc thÓ mµ néi dung cña nã xuÊt hiÖn trong phÇn khai b¸o (vÝ dô trªn E lµ néi thùc thÓ ) tøc lµ kh«ng tån t¹i mét ®¬n vÞ vËt lÝ t¸ch biÖt nµo chøa nã. Thùc thÓ ngoµi lµ nãi ®Õn mét ®¬n vÞ chøa trong khai b¸o cña nã b»ng c¸ch sö dông c¸c ®Þnh danh hÖ thèng hoÆc ®Þnh danh c«ng céng. VÝ dô nh khai b¸o sau:
<!ENTITY MyImage SYSTEM “
NDATA GIF>
Trong vÝ dô nµy tr×nh xö lÝ XML ph¶i ®äc file I1.gif ®Ó lÊy néi dung. Ngoµi ra c¸c ®Þnh danh c«ng céng ®îc sö dông nÕu nh tr×nh øng dông ®îc kÕt nèi víi mét th viÖn tµi liÖu c«ng céng. VÝ dô khai b¸o sau:
<!ENTITY MyImage
PUBLIC “-//Image//TEXT Standard images//EN”
“
NDATA GIF>
III.2. Có ph¸p XML
Trong phÇn nµy chóng ta t×m hiÓu có ph¸p c¬ b¶n cña tµi liÖu XML. V× HTML vµ XML ®Òu lµ c¸c øng dông tõ SGML nªn ®èi víi nh÷ng ai ®· tõng lµm viÖc víi HTML sÏ thÊy mét sè ®iÓm t¬ng ®ång vÒ có ph¸p gi÷a chóng tuy lµ chóng kh«ng hoµn toµn cã cïng ý nghÜa.
III.2.1. C¸c thÎ g¸n vµ phÇn tö
Trong HTML, c¸c thµnh phÇn thêng sö dông c¸c thÎ ®ãng vµ thÎ më vÝ dô nh “ vµ “”. Do HTML ®îc gi¶n lîc bít nªn ë mét sè chç mÆc dï kh«ng cã thÎ ®ãng nhng tr×nh xö lÝ vÉn hiÓu ®îc. Tuy nhiªn XML kh«ng cho phÐp ®iÒu ®ã, mçi mét thÎ më trong XML ph¶i lu«n tån t¹i mét thÎ ®ãng t¬ng øng. §iÒu nµy lµm cho có ph¸p cña XML chÆt chÏ vµ s¸ng sña h¬n so víi HTML.
Ta xem vÝ dô sau:
John
Bill
H×nh 18 Minh häa cÊu tróc c©y cña vÝ dô
Trong XML c¸c kÝ tù gi÷a ®îc gäi lµ thÎ g¸n XML. C¸c thÎ g¸n ph¶i ®i cÆp víi nhau lµ thÎ g¸n ®Çu vµ thÎ g¸n cuèi. C¸c thÎ g¸n cuèi gièng nh thÎ g¸n ®Çu nhng cã thªm mét dÊu ‘/’ n»m sau kÝ tù më ‘ vµ thÎ g¸n cuèi . Trong XML kh«ng cho phÐp c¸c thÎ g¸n ®îc lång nhau.
Toµn bé th«ng tin n»m tõ ®Çu cña thÎ g¸n ®Çu ®Õn cuèi cña thÎ g¸n cuèi gäi lµ mét phÇn tö . V¨n b¶n gi÷a thÎ ®Çu vµ thÎ cuèi gäi lµ néi dung thµnh phÇn. VÝ dô nh John lµ mét thµnh phÇn.
C¸c thÎ thµnh phÇn rçng kh«ng chøa néi dung vµ cã cÊu tróc nh sau : . XML cho phÐp viÕt rót gän l¹i thµng :
Toµn bé t liÖu b¾t ®Çu t¹i vµ kÕt thóc t¹i còng lµ mét thµnh phÇn, cã thÓ bao gåm c¸c thµnh phÇn kh¸c. Trong trêng hîp nµy nã ®îc gäi lµ thµnh phÇn gèc. Mçi t liÖu XML ®Òu ph¶i cã mét thµnh phÇn gèc. TÊt c¶ c¸c thµnh phÇn kh¸c ®Òu lµ thµnh phÇn hËu duÖ cña thµnh phÇn gèc nµy.
XML cho phÐp ngêi sö dông ®Æt tªn c¸c thµnh phÇn rÊt tho¶i m¸i v× XML kh«ng cã c¸c tõ kho¸ cÇn ph¶i tr¸nh nh trong c¸c ng«n ng÷ lËp tr×nh. Tuy nhiªn ta cÇn tu©n theo c¸c qui t¾c sau :
C¸c tªn b¾t ®Çu b»ng c¸c kÝ tù hoÆc dÊu ‘_’ nhng kh«ng ®îc lµ c¸c con sè.
C¸c tªn kh«ng ®îc chøa kho¶ng c¸ch ,kÝ tù ‘;’... vµ kh«ng ®îc b¾t ®Çu b»ng xml
Kh«ng thÓ cã dÊu c¸ch ngay sau kÝ tù ‘’
Trong XML ph©n biÖt ch÷ hoa vµ ch÷ thêng.
VÝ dô ®Æt tªn kh«ng hîp lÖ : , , ...
III.2.2. C¸c thuéc tÝnh vµ chó gi¶i
C¸c thuéc tÝnh cung cÊp ph¬ng ph¸p g¾n gi¸ trÞ vµo c¸c thµnh phÇn mµ kh«ng cÇn coi nã lµ mét phÇn cña néi dung thµnh phÇn .C¸c thuéc tÝnh t¸ch biÖt d÷ liÖu mµ hÇu hÕt c¸c øng dông cÇn ra khái d÷ liÖu mµ c¸c øng dông kh«ng cÇn .VÝ dô nh:
Bill
C¸c chó gi¶i trong XML b¾t ®Çu b»ng chuçi ‘
XML kh«ng cho phÐp viÕt chó gi¶i trong mét thÎ g¸n.
Cã mét vµi kÝ tù mµ XML kh«ng cho phÐp chóng xuÊt hiÖn trùc tiÕp trong thµnh phÇn d÷ liÖu vÝ dô nh ‘&’,’>’...Muèn sö dông chóng ta cã hai c¸ch:
Dïng tham chiÕu thùc thÓ :& thay cho kÝ tù & ,> thay cho kÝ tù >...
Dïng c¸c ®o¹n CDATA(Character DATA) .§©y lµ mét ®Æc ®iÓm XML kÕ thõa tõ SGML.Mäi néi dung xuÊt hiÖn gi÷a ®Òu ®îc c¸c tr×nh xö lÝ XML bá qua .VÝ dô : =6 & 7.
IV. XML trong C#
Trong phÇn nµy chóng ta t×m hiÓu c¸ch thøc C# hç trî chuÈn XML. Trong C# cã cung cÊp mét kh«ng gian tªn System.Xml bao gåm nhiÒu tiÖn Ých ®Ó ta cã thÓ lµm viÖc víi c¸c tµi liÖu XML. Do giíi h¹n vÒ thêi gian, tµi liÖu nªn trong phÇn nµy chóng em chØ ®i s©u vµo mét sè vÊn ®Ò chÝnh.
IV.1. T¹o mét tµi liÖu XML
Gi¶ sö ta muèn t¹o mét tµi liÖu XML cã cÊu tróc nh sau:
Ch¬ng tr×nh sau sÏ t¹o ra file ‘c:\car.xml’
using System;
using System.IO;
using System.Xml;
using System.Text;
class CarDomWriter {
CarDomWriter(Stream outStr){
XmlDocument doc = new XmlDocument();
XmlDeclaration decl =
doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(decl);
XmlNode root = CreateCarNode(doc);
doc.AppendChild(root);
XmlTextWriter writer =
new XmlTextWriter(outStr, new UTF8Encoding());
writer.Formatting = Formatting.Indented;
doc.WriteTo(writer);
writer.Flush();
writer.Close();
}
XmlNode CreateCarNode(XmlDocument doc){
XmlElement car = doc.CreateElement("Car");
car.SetAttribute("VIN","123");
XmlNode model = CreateModelNode(doc);
car.AppendChild(model);
XmlNode miles = CreateMilesNode(doc);
car.AppendChild(miles);
return car;
}
XmlNode CreateModelNode(XmlDocument doc){
XmlElement model = doc.CreateElement("Model");
XmlElement year = doc.CreateElement("Year");
year.InnerText = "1998";
model.AppendChild(year);
XmlElement mfr =
doc.CreateElement("Maker");
mfr.InnerText = "Honda";
model.AppendChild(mfr);
XmlElement make = doc.CreateElement("Make");
make.InnerText = "Civic";
model.AppendChild(make);
return model;
}
XmlNode CreateMilesNode(XmlDocument doc){
XmlElement miles = doc.CreateElement("Mileage");
miles.SetAttribute("Units", "Miles");
miles.InnerText = "80000";
return miles;
}
public static void Main(){
FileStream outStr = new FileStream(
"c:\\car.xml",FileMode.Create);
try {
new CarDomWriter(outStr);
} finally {
outStr.Close();
}
}
}///:~
Thao t¸c ®Çu tiªn lµ t¹o mét ®èi tîng XmlDocument, sau ®ã ta lÇn lît t¹o ra c¸c node vµ g¾n chóng vµo XmlDocument. Ta g¾n mét node võa t¹o b»ng ph¬ng thøc XmlDocument.AppendChild(). Sau khi t¹o khai b¸o ( coi nh mét node vµ g¾n vµo XmlDocument ), ta t¹o node gèc lµ Car. Cø tiÕp tôc qu¸ tr×nh t¹o ra c¸c node tiÕp theo, nÕu node nµo ®ã cã thuéc tÝnh ta dïng ph¬ng thøc XmlElement.SetAttribute(). Sau khi h×nh thµnh ®îc cÊu tróc XML, ta t¹o mét ®èi tîng XmlTextWriter ®Ó cã thÓ ghi lªn luång file ra FileStream.XmlDocument.WriteTo() nhËn XmlTextWriter lµm tham sè, vµ ghi lªn ®ã cÊu tróc cña tµi liÖu XML. Thao t¸c cuèi cïng lµ ®Èy d÷ liÖu ë bé nhí vµo luång file ra b»ng viÖc gäi ph¬ng thøc XmlTextWriter.Close().
Xem kÕt qu¶ b»ng tr×nh duyÖt IE 6.0:
H×nh 19 KÕt qu¶ ch¬ng tr×nh t¹o tµi liÖu trªn IE 6.0
IV.2. DuyÖt tµi liÖu XML
Gi¶ sö sau khi ®· t¹o ra tµi liÖu XML nh trªn, ta muèn duyÖt tµi liÖu ®ã. Trong C# tån t¹i hai kiÓu duyÖt ®ã lµ duyÖt theo luång vµ duyÖt theo c©y. DuyÖt theo luång lµ duyÖt mµ ë ®ã ta më mét luång d÷ liÖu vµo vµ duyÖt luång d÷ liÖu nµy mét c¸ch liªn tôc kh«ng qua bé ®Öm vµ kh«ng cÇn t¹o ra ®èi tîng cho mçi node. C¸ch duyÖt nµy t¨ng hiÖu n¨ng cña qu¸ tr×nh duyÖt vµ øng dông cho c¸c tµi liÖu XML cì lín. C¸ch duyÖt thø hai lµ duyÖt theo c©y, ë ®©y toµn bé cÊu tróc cña file ®îc t¶i vµo bé nhí sau ®ã ta tiÕn hµnh duyÖt theo tõng node. Qu¸ tr×nh duyÖt sö dông thuËt to¸n ®Ö qui. Trong vÝ dô díi ®©y ta sö dông c¸ch duyÖt theo c©y:
Ch¬ng tr×nh sau sÏ duyÖt file ‘c:\car.xml’
using System;
using System.IO;
using System.Xml;
class CarReader {
CarReader(string fileName){
XmlDocument doc = new XmlDocument();
doc.Load(fileName);
WriteInfo(doc);
}
void WriteInfo(XmlNode node){
Console.WriteLine("Current node is of type {0}",
node.NodeType);
if (node.NodeType == XmlNodeType.Element) {
Console.WriteLine("", node.Name);
foreach(XmlAttribute att
in node.Attributes){
Console.WriteLine("[{0}] = {1}",
att.Name, att.Value);
}
}
if (node.NodeType == XmlNodeType.Text) {
Console.WriteLine("Text = " + node.Value);
}
foreach(XmlNode child in node.ChildNodes){
WriteInfo(child);
}
}
public static void Main(){
new CarReader("c:\\car.xml");
}
}///:~
KÕt qu¶ thu ®îc nh sau:
IV.3. Qu¸ tr×nh Serializing
Kh«ng gian tªn System.Xml.Serialization cung cÊp cho chóng ta kh¶ n¨ng chuyÓn ®æi tõ t liÖu XML sang c¸c d¹ng cÊu tróc d÷ liÖu kh¸c trªn cïng mét miÒn (Deserializing) vµ chuyÓn tõ tËp c¸c ®èi tîng cã thÓ t¹o ra mét t liÖu XML chuÈn (Serializing).
Qu¸ tr×nh serializing chØ chuyÓn ho¸ c¸c thuéc tÝnh public cña mét ®èi tîng (hoÆc lµ trêng public cña mét ®èi tîng –tuy nhiªn Ýt dïng). Bªn c¹nh ®ã qu¸ tr×nh chuyÓn ho¸ yªu cÇu líp cña ®èi tîng lµ líp public vµ hµm khëi t¹o kh«ng cã tham sè truyÒn vµo. §iÒu nµy ®Ó tr¸nh xung ®ét gi÷a tr¹ng th¸i trong cña mét ®èi tîng.
Ta xÐt vÝ dô trªn, ta t¹o mét ®èi tîng tõ líp Car, víi c¸c thuéc tÝnh public vµ øng víi mçi thuéc tÝnh cña ®èi tîng nÕu ta muèn sau qu¸ tr×nh chuyÓn ho¸ nã ®îc chuyÓn thµnh thuéc tÝnh cña thµnh phÇn cña XML th× ta thªm [XmlAttribute] vµo tríc ®o¹n code ®ã. Sau khi t¹o ®èi tîng råi, ta tiÕn hµnh chuyÓn ho¸ b»ng c¸ch t¹o ra mét XmlSerializer vµ dïng ph¬ng thøc XmlSerializer.Serialize() víi tham sè lµ ®èi tîng c vµ mét XmlTextWriter ®Ó ghi ra dßng file. Sau ®©y lµ code:
using System;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Xml;
public class Car {
public Car(){ }
string vin;
[XmlAttribute]
public string VIN{
get { return vin;}
set { vin = value;}
}
Model model;
public Model Model{
get { return model;}
set { model = value;}
}
Mileage miles;
public Mileage Mileage{
get { return miles;}
set { miles = value;}
}
public static void Main(){
Car c = new Car();
c.VIN = "123";
c.Model = new Model(1998, "Honda", "Civic");
c.Mileage = new Mileage("Miles", 80000);
XmlSerializer xs = new XmlSerializer(typeof(Car));
FileStream outStr=new FileStream(“c:\\ser_car.xml”,
FileMode.Create);
XmlTextWriter writer=new XmlTextWriter(outStr,
new UTF8Encoding());
writer.Formatting=Formatting.Indented;
xs.Serialize(writer, c);
writer.Flush();
writer.Close();
}
}
public class Model {
public Model(){
}
public Model(int yr, string mfr, string make){
this.yr = yr;
this.mfr = mfr;
this.make = make;
}
int yr;
public int Year{
get { return yr;}
set { yr = value;}
}
string mfr;
[XmlElement("Maker")]
public string Maker{
get { return mfr;}
set { mfr = value;}
}
string make;
public string Make{
get { return make;}
set { make = value;}
}
}
public class Mileage {
string units;
[XmlAttribute("Units")]
public string Units{
get { return units;}
set { units = value;}
}
int val;
[XmlText]
public int Quantity{
get { return val;}
set { val = value;}
}
public Mileage(){ }
public Mileage(string units, int val){
this.units = units;
this.val = val;
}
}
H×nh 20 KÕt qu¶ vÝ dô Serializing trªn IE 6.0
IV.4. Qu¸ tr×nh Deserializing
§©y lµ qu¸ tr×nh ngîc l¹i so víi qu¸ tr×nh Serializing. Qu¸ tr×nh chuyÓn ho¸ sÏ chuyÓn mét t liÖu XML thµnh mét ®èi tîng cïng kiÓu.
VÝ dô sau ,ta chuyÓn tµi liÖu XML ‘c:\car.xml’ thµnh ®èi tîng car t¬ng øng víi ®iÒu kiÖn ta ph¶i khai b¸o líp Car trong ch¬ng tr×nh (nh vÝ dô phÇn tríc).KÕt qu¶ ®îc kÕt xuÊt ra console:
using System;
using System.IO;
using System.Xml.Serialization;
public class CarFromFile {
public static void Main(){
XmlSerializer xs = new XmlSerializer(typeof(Car));
FileStream str =
new FileStream("c:\\car.xml", FileMode.Open);
Car c = (Car) xs.Deserialize(str);
str.Close();
Console.WriteLine("{0} {1} {2}, {3} {4}",
c.Model.Year, c.Model.Maker, c.Model.Make,
c.Mileage.Quantity, c.Mileage.Units);
}
}///:~
KÕt qu¶ nh sau:
1998 Honda Civic, 80000 Miles
PhÇn V: LËp tr×nh m¹ng trong C#
Công nghệ Web có tính thương mạ
Các file đính kèm theo tài liệu này:
- 27033.DOC