You are on page 1of 111

TRNG I HC LT

KHOA CNG NGH THNG TIN

Thc s TRN THNG

BI GING TM TT

LP TRNH HNG I TNG


Dnh cho sinh vin ngnh Cng Ngh Thng Tin

(Lu hnh ni b)

Mc lc
Mc lc ...........................................................................................................................1 M u............................................................................................................................3 Chng 1: Kin trc .NET ...........................................................................................4 1. 1 Quan h gia C# v.NET .........................................................................................4 1. 2 CLR (Common Language Runtime) ........................................................................4 1. 3 Gii thiu IL (Intermediate Language) ....................................................................5 1. 4 Th vin (Assembly) ................................................................................................5 1. 5 Cc lp trong .NET ..................................................................................................5 1. 6 To ng dng .NET s dng C#...............................................................................6 1. 7 Vai tr ca .NET trong kin trc .NET Enterprise...................................................6 Chng 2: Cn bn C# .................................................................................................7 2. 1 Vit chng trnh C# u tin ..................................................................................7 2. 2 Bin.........................................................................................................................11 2. 3 Kiu d liu c bn.................................................................................................12 2. 4 iu khin lung ....................................................................................................14 2. 5 Kiu lit k..............................................................................................................19 2. 6 Mng.......................................................................................................................21 2. 7 Khng gian tn (Namespace) .................................................................................22 2. 8 Phng thc Main() ...............................................................................................23 2. 9 Bin dch nhiu tp tin C# ......................................................................................23 2. 10 Xut nhp qua Console.........................................................................................24 2. 11 S dng ch thch .................................................................................................25 2. 12 Ch dn tin x l trong C# ..................................................................................25 Chng 3: i tng v kiu ....................................................................................27 3. 1 Lp v cu trc .......................................................................................................27 3. 2 Thnh vin ca lp .................................................................................................29 3. 3 Cu trc (Struct) .....................................................................................................46 3. 4 Lp Object ..............................................................................................................53 Chng 4: S k tha .................................................................................................56 4. 1 Cc kiu k tha .....................................................................................................56 4. 3 T kha b tr ........................................................................................................59 1

4. 4 a hnh (polymorphism) ........................................................................................60 Chng 5: Ton t v chuyn kiu............................................................................72 5. 1 Ton t....................................................................................................................72 5. 3 Qu ti ton t ........................................................................................................74 5. 4 Chuyn kiu do ngi dng nh ngha .................................................................79 Chng 6: S y nhim, s kin v qun l li........................................................81 6. 1 S y nhim (delegate)...........................................................................................81 6. 2 S kin (Event).......................................................................................................82 6. 3 Qun l li v bit l ..............................................................................................85 Chapter 7: Qun l b nh v con tr.......................................................................89 7. 1 Qun l b nh .......................................................................................................89 7. 2 Gii phng ti nguyn ............................................................................................90 7. 3 M khng an ton ...................................................................................................93 Chng 8: Chui, biu thc quy tc v tp hp ......................................................97 8. 1 System.String..........................................................................................................97 8. 2 Biu thc quy tc....................................................................................................98 8. 3 Nhm cc i tng .............................................................................................100 Chng 9: Reflection.................................................................................................104 9. 1 Thuc tnh (attribute) ty chn.............................................................................104 9. 2 Reflection..............................................................................................................106 Hng dn phn thc hnh......................................................................................110 Ti liu tham kho.....................................................................................................110

M u
Lp trnh hng i tng (OOP) ng mt vai tr quan trng trong vic xy dng v pht trin ng dng. c bit trong cc ngn ng lp trnh th h th 4 (nh java hay c#) hu nh c xy dng l nhng ngn ng thun i tng nhm h tr nhng nguyn l cn bn trong lp trnh hng i tng cng nh cc tnh nng nng cao da trn OOP gip cho vic xy dng v pht trin ng dng trn OOP d dng v nhanh chng hn. Do vic tip cn v nm vng cc nguyn l lp trnh hng i tng rt quan trng i vi sinh vin cho vic s dng v ng dng n cho cc mn hc lin quan n lp trnh v cc mn hc chuyn ngnh cc hc k tip theo. Mc tiu ca mn hc: n tp li cc vn v k thut lp trnh, cch thc pht trin ng dng n gian trn C#. Cung cp cho sinh vin tip cn v s dng ngn ng lp trnh C#. Cung cp cho sinh vin kin thc v lp trnh hng i tng trn ngn ng lp trnh C# bao gm tnh ng gi, k tha, a hnh, giao tip, attribute, reflection. Cung cp cc kin thc v x l v thao tc d liu trn tp tin vn bn v nh phn, XML. Cung cp cc kin thc v s dng cc cu trc d liu c dng sn trn .Net trong qu trnh pht trin ng dng nh Stack, Queue, ArrayList, HashTable. Gii thiu vic xy dng v pht trin ng dng trn mi trng mi trng .Net. Cung cp cho sinh vin tip cn v lm quen vi mi trng pht trin ng dng da trn Visual Studio 2005. 3

Chng 1: Kin trc .NET


Microsoft Visual C# l mt ngn ng mnh m nhng n gin ch yu hng n cc nh pht trin xy dng ng dng trn nn tng .NET ca Microsoft. C# k tha nhng c trng tt nht ca ngn ng C++ v Microsoft Visual Basic, v loi b i mt s c trng khng thng nht v lc hu vi mc tiu to ra mt ngn ng r rng v logic hn. S k vng ca C# c b sung mt s c trng mi quan trng bao gm Generic, c ch lp v phng thc n tn... Mi trng pht trin cung cp bi Visual Studio 2005 lm cho nhng c trng ny tr nn d s dng v nng cao nng sut cho cc nh pht trin ng dng. Mc ch ca chng: Gii thiu ngn ng C#. Gii thiu cc thnh phn quan trng ca nn tng .Net. So snh C# vi ngn ng lp trnh C v mt s cc ngn ng lp trnh khc. 1. 1 Quan h gia C# v.NET C# l mt ngn ng lp trnh mi v c cc c trng: N c thit k ring dng cho nn tng.NET. N l mt ngn ng thun i tng c thit k da trn kinh nghim ca cc ngn ng hng i tng khc. C# l mt ngn ng c lp. N c thit k c th sinh ra m ch trong mi trng .NET, n khng phi l mt phn ca .NET bi vy c mt vi c trng c h tr bi .NET nhng C# khng h tr. 1. 2 CLR (Common Language Runtime) im tp trung ca nn tng.NET l mi trng thc hin vic thc thi ng dng c gi l CLR (Commong Language Runtime-CLR). Trong .NET chng trnh khng bin dch thnh tp tin thc thi, chng c bin dch theo hai bc: Bin dch m ngun thnh IL (Intermediate Language). Dng CLR bin dch IL thnh m my theo tng nn tng thch hp. Vic thc hin nh trn cung cp nhiu thun li cho .NET nh: c lp nn tng v phn cng. Nng cao hiu sut. Gip cho cc ngn ng pht trin trn cc ngn ng lp trnh khc nhau c th tng tc vi nhau. 4

1. 3 Gii thiu IL (Intermediate Language) IL hot ng nh l bn cht ca nn tng .NET. M C# s lun c dch sang IL trc khi n c thc thi. Bt k ngn ng no hng .NET cng s h tr cc c tnh chnh ca IL. Sau y l nhng c tnh chnh ca IL: Hng i tng v dng giao tip. S tch bit gia kiu gi tr v kiu tham chiu. nh kiu mnh. Qun li thng qua cc ngoi l. S dng cc thuc tnh. 1. 4 Th vin (Assembly) Mt assembly l mt tp tin cha m c bin dch sang .NET. N c th cha trong nhiu tp tin. Nu mt assembly c lu trong nhiu tp tin, th s c mt tp tin chnh cha cc con tr v cc m t v cc tp tin khc ca assembly. Cu trc assembly c dng chung cho c m thc thi v m th vin. S khc bit duy nht l assembly thc thi c cha hm main trong khi assembly th vin th khng c. Mt im quan trng trong cc assembly l chng cha cc siu d liu (metadata) dng m t cc kiu v phng thc c nh ngha tng ng trong m. Mt assembly cng cha siu d liu dng m t chnh assembly . Siu d liu cha trong mt vng c gi l tp tin m t (manifest), n cho php kim tra phin bn v tnh trng ca assembly. Vi vic assembly cha siu d liu, n cho php chng trnh, ng dng hay cc assembly khc c th gi m trong mt assembly m khng cn tham chiu n Registry, hoc mt d liu ngun khc. 1. 5 Cc lp trong .NET Mt trong nhng li ch ln nht ca vit m l vic s dng cc th vin lp c s sn c ca .NET. Th vin lp c s ca .NET l mt tp hp rt nhiu cc lp m c pht trin bi Microsoft, nhng lp ny cho php thao tc rt nhiu cc tc v sn c trong Windows. Chng ta c th to cc lp ca mnh t cc lp c sn trong th vin lp c s ca .NET thng qua s k tha. Th vin lp c s.NET l kt hp tnh n gin ca cc th vin Visual Basic v Java vi hu ht cc c tnh trong cc th vin hm API. C nhiu c tnh l, t s dng ca Windows khng c cung cp trong cc lp ca th vin .NET. Nhng c tnh thng dng u c h tr y trong th vin lp ca.NET. Nu chng ta mun gi mt hm API trong .NET, chng ta thc hin c ch "platform-invoke", c ch ny lun bo m tnh ng n ca kiu d liu khi gi v h tr cho c C#, C++, v VB.NET. Thao tc gi ny khng kh hn vic gi trc tip API t m C++. 5

1. 6 To ng dng .NET s dng C# C# c th to cc ng dng dng lnh (console) cng nh cc ng dng thun vn bn chy trn DOS hay Window. Tt nhin, chng ta c th dng C# to cc ng dng dng cho cc cng ngh tng thch vi .NET. Cc ng dng c th vit trn C#: ng dng ASP.NET. ng dng WinForm. Cc dch v da trn Windows. 1. 7 Vai tr ca .NET trong kin trc .NET Enterprise C# yu cu khi chy phi c .NET runtime, do bt buc chng ta phi ci t .Net runtime trc khi mun chy cc ng dng c pht trin trn .Net. Tuy nhin, trong mt s phin bn mi ca h iu hnh Windows, .Net c ci t mc nh. Tht vy, C# c coi nh l mt c hi ni bt cho cc t chc c th to nhng ng dng mnh m, nhng ng dng client-server theo kin trc N-lp. Khi kt ni d liu thng qua ADO.NET, C# c kh nng truy cp ti cc c s d liu tng qut v nhanh chng nh c s d liu SQL Server v Oracle. D liu tr v t cc thao tc d liu thng qua DataSet gip d dng thao tc thng qua cc i tng ca ADO.NET. Kt ni d liu t ng tr v kiu XML gip cho vic truyn thng trn mng d dng.

Chng 2: Cn bn C#
Mc ch ca chng: Khai bo bin. Khi to v phm vi hot ng ca bin. Cc kiu d liu c bn. Cch s dng cc vng lp v cu lnh. Gi, hin th lp v phng thc. Cch s dng mng. Ton t. An ton kiu v cch chuyn kiu d liu. Kiu lit k (enum). Khng gian tn (namespace). Hm Main( ). Bin dch trong C#. Xut nhp dng System.Console. S dng ch thch trong C#. Cc nh danh v t kho trong C#. 2. 1 Vit chng trnh C# u tin u tin chng ta vit mt chng trnh ng dng Hello World n gin s dng C#:
class HelloWorld { static void Main( ) { System.Console.WriteLine("Chuong Trinh Dau Tien"); System.Console.Readline(); } }

ng dng dng lnh l ng dng khng c giao din ngi dng. Vic xut nhp thng qua dng lnh chun. Phng thc Main() trong v d Hello World vit chui Chuong Trinh Dau Tien ln mn hnh. Mn hnh c qun l bi mt i tng tn Console. i tng ny c mt phng thc WriteLine(), nhn mt chui v xut chng ra thit b xut chun (mn hnh). 7

Cch chy chng trnh Hello world thc hin c chng trnh chng ta s dng Visual Studio.NET Intergated Development Environment (IDE) trong cng c Visual Studio.NET IDE. Chng cung cp nhng cng c rt mnh cho vic d li v h tr mt s tnh nng khc. Son tho chng trnh Hello Wolrd Chy chng trnh IDE. Chn Visual Studio.NET t thc n Start Chn File New Project. Chn kiu d n l Visual C# Project v dng Console Application. Chng ta c th nhp vo tn d n v ng dn lu tr d n. Sau khi chn nt OK, mt ca s mi s xut hin nh hnh 2.1 Hnh 2.1:To ng dng dng lnh trong Visual Studio.NET

Sau a lnh sau vo trong hm Main()


System.Console.WriteLine("Chuong Trinh Dau Tien");

Hnh 2.2: Ca s son tho cho mt d n mi

Bin dch v chy chng trnh Hello Wolrd C nhiu cch bin dch v chy chng trnh trong Visual Studio.NET Chn Ctl+Shift+B hay Build build t thc n. Chn nt Build nh trong hnh 2.3. Hnh 2.3: Nt build chy chng trnh m khng thc hin d li: Nhn Ctrl + F5 hay Debug Start Without Debugging t thc n. Chn nt Start Without Debugging nh trong hnh 2.4 Hnh 2.4: Nt Start Without Debugging

S dng cng c d li ca Visual Studio.NET 3 k nng quan trng khi d li: Bng cch no t cc im dng (breakpoint) v chy cc im dng nh th no? Bng cch no chy tng bc qua cc li gi phng thc. Bng cch no kim tra v thay i gi tr ca bin, d liu thnh vin ca lp.

D li c th c thc hin theo nhiu cch. Thng thng qua thc n. n gin nht l t im dng bn thc tri nh trong hnh 2.5

Hnh 2.5: Mt im dng

chy Debug chng ta c th nhn F5 v sau chng trnh s chy n im dng nh trong hnh 2.6. Hnh 2.6: Chn im dng

Bng cch t con chut vo v tr cc bin chng ta c th thy c gi tr hin ti ca bin nh trong hnh 2.7. Hnh 2.7: Hin th mt gi tr

Trnh d li ca Visual Studio.NET cng cung cp mt s ca s hu dng khc d li nh l ca s Local d cc bin cc b nh trong hnh 2.8 Hnh 2.8: Ca s Local

Chng ta c th m rng ca s xem chi tit thng tin bin nh trong hnh 2.9. Hnh 2.9: M rng ca s Local

10

Chng ta c th lp qua cc phng thc bng cc nhn F11. V d lp qua phng thc DrawWindow() ca lp WindowClass nh trong hnh 2.10. Hnh 2.10: Lp qua mt phng thc

2. 2 Bin Mt bin dng lu tr gi tr ca mt kiu d liu no . C php C# sau y khai bo mt bin: [ b_t ] kiu_d_liu nh_danh; Vi b_t l mt trong nhng t kho: public, private, protected, ... cn kiu_d_liu l cc kiu d liu nh s nguyn (int), thc (float) v nh_danh l tn bin. V d di y mt bin tn i kiu nguyn v c th c truy cp bi bt c hm no.
public int i;

Ta c th gn cho bin mt gi tr bng ton t "=".


i = 10;

Ta cng c th khai bo bin v khi to gi tr cho bin nh sau: 11

int

10;

Chng ta c th khai bo nhiu bin c cng kiu d liu nh sau:


int int x = 10, y = 20; x = 10; // khai bo trn ng // khai bo trn c li

bool y = true ;

int x = 10, bool = true

Mt hng (constant) l mt bin nhng gi tr khng th thay i trong sut thi gian thc thi chng trnh. i lc ta cng cn c nhng gi tr bao gi cng bt bin.
const int a = 100; // gi tr ny khng th b thay i

Hng c nhng c im sau: Hng bt buc phi c gn gi tr lc khai bo. Mt khi c khi gn th khng th vit ln. Tr ca hng c th c tnh ton vo lc bin dch. Do khng th gn mt hng t mt tr ca mt bin. Nu mun lm th th phi s dng read-only field. Hng bao gi cng static, tuy nhin ta khng th a t kho static vo khi khai bo hng. C ba thun li khi s dng hng: Hng lm cho chng trnh c d dng hn, bng cch thay th nhng con s v cm bi nhng tn mang y ngha hn. Hng lm cho chng trnh d sa hn. Hng lm cho vic trnh li d dng hn, nu bn gn mt tr khc cho mt hng u trong chng trnh sau khi bn gn gi tr cho hng, th trnh bin dch s thng bo li. 2. 3 Kiu d liu c bn C# l mt ngn ng c kim sot cht ch v mt kiu d liu, ngoi ra C# cn chia cc kiu d liu thnh hai loi: kiu gi tr (value type) v kiu tham chiu (reference type). Ngha l trn mt chng trnh C# d liu c lu tr mt hoc hai ni ty theo c th ca kiu d liu. Ch th nht l stack: mt vng b nh dnh lu tr d liu vi chiu di c nh, chng hn s nguyn chim dng 4 bytes. Mi chng trnh khi ang thc thi u c cp pht ring mt stack m cc chng trnh khc khng c truy cp ti. Khi mt hm c gi thc thi th tt c cc bin cc b ca hm c a vo trong stack v sau khi gi hm hon thnh th nhng bin cc b ca hm u b y ra khi stack. Ch th hai l heap: mt vng b nh dng lu tr d liu c dung lng thay i nh kiu chui chng hn, hoc d liu c thi gian sng di hn phng thc ca mt i tng. Chng hn, khi to th hin ca mt i tng, i tng uc lu tr trn heap, v n khng b tng ra khi hm hon thnh ging nh stack, m nguyn ti ch v c th trao cho cc phng thc khc thng qua mt tham chiu. 12

Trn C#, heap ny c gi l managed heap, v c b dn rc (garbage collector) chuyn lo thu hi nhng vng nh khng c tham chiu n. Kiu gi tr c nh ngha trc Kiu s nguyn(integer): C# h tr 8 kiu d liu s nguyn sau: Tn sbyte short int Kiu System.SByte System.Int16 System.Int32 M t Min(min:max) S nguyn c du 8-128:127 (-27:27-1) bit S nguyn c du -32,768:32, 767 (16-bit 215:215-1) S nguyn c du 2,147,483,648:2,147, 32-bit 483,647 (-231:231-1) -9,223,372,036,854, S nguyn c du 775,808: 9,223, 372, 036,854, 775,807 (64-bit 263:263-1) S nguyn c du 80:255 (0:28-1) bit S nguyn c du 0:65, 35 (0:216-1) 16-bit S nguyn c du 0:4,294,967,295 32-bit (0:232-1) S nguyn c du 0:18,446,744,073, 64-bit 709,551,615(0:264-1)

long byte ushort uint ulong V d:

System.Int64 System.Byte System.UInt16 System.UInt32 System.UInt64

long x = 0x12ab;// ghi theo hexa uint ui = 1234U; long l = 1234L; ulong ul = 1234UL;

Kiu d liu s thc du chm di ng (Floating Point Types): Tn Float Double V d:


float f = 12.3F;

Kiu System.Single System.Double

M t 32-bit 64-bit

Min 1.5 10-45 n 3.4 1038 5.0 10-324 n 1.7 10308

Kiu d liu s thp phn (Decimal Type):

13

Tn decimal V d:
decimal d =

Kiu System.Decimal

M t 128-bit

Min 1.0 10-28 n 7.9 1028

12.30M ;

//c th vit

decimal

12. 30m;

Kiu Boolean: Tn Bool Kiu System.Boolean Gi tr true hoc false

Kiu Character Type: Tn char Kiu System.Char Gi tr Dng unicode 16 bit

Kiu tham chiu nh ngha trc: C# h tr hai kiu d liu c nh ngha trc: Tn object string Kiu System.Object System.String M t Kiu cha ca tt c cc kiu trong CLR Chui k t unicode

Cc k t escape thng dng: Th t \' \" \\ \0 \a \b \f \n \r \t \v 2. 4 iu khin lung 14 K t Nhy n Nhy kp Du xuyt Null Cnh bo Phm lui Form feed Xung hng Xung hng Tab Tab dc

C php:
if ( biu thc) lnh 1 else lnh 2

V d minh ha lnh r nhnh


using System; class Values { static void Main( ) { int valueOne = 10; int valueTwo = 20; if ( valueOne > valueTwo ) { Console.WriteLine("Gi tr mt: {0} ln hn gi tr hai: {1}", valueOne, valueTwo); } else { Console.WriteLine("Gi tr hai: {0} ln hn gi tr mt: {1}", valueTwo, valueOne); } valueOne = 30; //gn li gi tr mi if ( valueOne > valueTwo ) { valueTwo = valueOne++; Console.WriteLine("\nGn gi tr mt cho gi tr hai, "); Console.WriteLine("v tng gi tr mt ln hai. \n"); Console.WriteLine("Gi tr mt: {0}, Gi tr hai: {1}", valueOne, valueTwo); } else { valueOne = valueTwo; tr hai. "); Console.WriteLine("Gn hai gi tr bng nhau v bng gi Console.WriteLine("Gi tr mt: {0} gi tr hai: {1}", valueOne, valueTwo); } }

15

Lnh switch C php:


switch (biu thc) { case biu_thc_hng: lnh lnh_nhy [default: lnh] }

V d:
class Values { static void Main( ) { int chonThucDon; chonThucDon = 2; switch (chonThucDon) { case 1: System.Console.WriteLine(" Chn mn 1"); break; case 2: System.Console.WriteLine(" Chn mn 1"); break; default: System.Console.WriteLine(" Phi chn mn c trong thc n 1"); break; } } }

Lnh lp Lnh goto s dng lnh goto chng ta cn: To nhn Goto trn nhn V d minh ha s dng lnh goto
using System;

16

public class Tester { public static int Main( ) { int i = 0; repeat: // gn nhn cho lnh goto Console.WriteLine("i: {0}", i); i++; if (i < 10) goto repeat; return 0; } }

Lnh lp while C php:


while (biu thc) lnh;

V d dng lnh while


using System; public class Tester { public static int Main( ) { int i = 0; while (i < 10) { Console.WriteLine("i: {0}", i); i++; } return 0; } }

Lnh dowhile C php:


do biu_thc while lnh;

using System; public class Tester {

17

public static int Main( ) { int i = 11; do { Console.WriteLine("i: {0}", i); i++; } while (i < 10); return 0; } }

Lnh for C php:


for (khi to; biu_thc; lp) lnh;

V d:
using System; public class Tester { public static int Main( ) { for (int i=0;i<100;i++) { Console.Ghi("{0} ", i); if (i%10 == 0) { Console.WriteLine("\t{0}", i); } } return 0; }

Lnh continue v break Thnh thong chng ta mun quay li vng lp m khng cn thc hin cc lnh cn li trong vng lp, chng ta c th dng lnh continue. Ngc li, nu chng ta mun thot ra khi vng lp ngay lp tc chng ta c th dng lnh break; 18

V d:
using System; public class Tester { public static int Main( ) { string signal = "0"; while (signal != "X") { Console.Ghi("Nhp vo tn hiu: "); signal = Console.ReadLine( ); Console.WriteLine("Tnh hiu va nhp: {0}", signal); if (signal == "A") { Console.WriteLine("Li, b qua\n"); break; } if (signal == "0") { Console.WriteLine("Bnh thng. \n"); continue; } signal); } return 0; } } Console.WriteLine("{0}To tn hiu tip tc !\n",

2. 5 Kiu lit k Kiu ny b sung nhng tnh nng mi thun tin hn kiu hng. Kiu lit k l mt kiu gi tr phn bit bao gm mt tp cc tn hng. V d chng ta to hai hng lin quan nhau:
const int NhietDoDongLanh = 32; // Farenheit const int NhietDoSoi = 212;

Chng ta c th b sung mt s hng khc vo trong danh sch nh:


const int NhietDoCoTheBoi= 72; // Farenheit

Qu trnh ny thc hin rt cng knh. Do , chng ta c th dng danh sch lit k gii quyt vn :
enum NhietDo

19

{ NhietDoDongLanh = 32; NhietDoSoi = 212; NhietDoCoTheBoi= 72; }

Mi kiu lit k phi c mt kiu bn di, chng c th l (int, short, long. .. ) ngoi tr kiu char. V d sau minh ha dng kiu enum nh ngha mt thc n cho chng trnh:
enum Menu { Thoat=5, VeTamGiac, VeTamGiacLatNguoc, VeTamGiacGiuaManHinh, VeTamGiacRong }; static void ThucDon() { while(true) { int menu=0; Console.WriteLine("Nhap {0} de ve tam giac", (int)Menu. VeTamGiac); Console.WriteLine("Nhap {0} de ve tam giac giua man hinh", (int)Menu. VeTamGiacGiuaManHinh); Console.WriteLine("Nhap {0} de ve tam giac lat nguoc ", (int)Menu. VeTamGiacLatNguoc); Console.WriteLine("Nhap {0} de ve tam giac rong ", (int)Menu. VeTamGiacRong); Console.WriteLine("Nhap {0} de thoat ", (int)Menu. Thoat); menu = int.Parse(Console.ReadLine()); switch (menu) { case (int)Menu. VeTamGiac: VeTamGiac(); break; case (int)Menu. VeTamGiacGiuaManHinh: VeTamGiacGiuaManHinh(); break; case (int)Menu. VeTamGiacLatNguoc: VeTamGiacLatNguoc();

20

break; case (int)Menu. VeTamGiacRong: VeTamGiacRong(); break; default: return; } } }

2. 6 Mng Mng l mt cu trc d liu cu to bi mt s bin c gi l nhng phn t mng. Tt c cc phn t ny u thuc mt kiu d liu. Bn c th truy xut phn t thng qua ch s . Ch s bt u bng 0. C nhiu loi mng (array): mng mt chiu, mng nhiu chiu C php:
kiu[ ] tn+mng;

V d:
int[] myIntegers; // mng kiu s nguyn string[] myString ; // mng kiu chui ch

Bn khai bo mng c chiu di xc nh vi t kho new nh sau:


int[]integers = new int[32]; integers[0] = 35;// phn t u tin c gi tr 35 integers[31] = 432;// phn t 32 c gi tr 432 Bn cng c th khai bo nh sau: int[] integers; integers = new int[32]; string[] myArray = {"phn t 1", " phn t 2", " phn t 3"};

Chng trnh minh ha dng mng 1 chiu:


using System; using System.Collections.Generic; using System.Text; namespace Mang1Chieu { class Program { static void Main(string[] args) { int[] a = new int[10];

21

int len =0; Console.Write("Nhap vao chieu dai mang"); len = int.Parse(Console.ReadLine()); for(int i=0; i< len; i++) { Console.Write("Nhap a[{0}] = ", i); a[i] = int.Parse(Console.ReadLine()); } for (int i = 0; i < len; i++) Console.Write("\t{0}", a[i]); } } }

2. 7 Khng gian tn (Namespace) Namespace cung cp cho ta cch t chc quan h gia cc lp v cc kiu khc nhau. y l k thut cho php .NET trnh vic cc tn lp, tn bin, tn hm... ng v trng tn vi nhau gia cc lp. khai bo khng gian tn chng ta s dng t kha namespace. V d:
namespace Programming_C_Sharp { using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}", i); } return 0; } } }

V d sau khai bo khng gian tn lng nhau:


namespace LapTrinh_C_Sharp { namespace LapTrinh _C_Sharp_Test

22

{ using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}", i); } return 0; } } } }

Cu lnh using T kho using gip bn gim thiu vic phi g nhng namespace trc cc hm hnh s hoc thuc tnh. V d sau s dng Console.WriteLine thay v phi g y ng dn System. Console.WriteLine:
using System; class Test { public static int Main() { Console.WriteLine(Khong gian ten ); return 0; } }

2. 8 Phng thc Main() Khi mt ng dng dng lnh hoc ng dng Windows c bin dch, theo mc nh trnh bin dch nhn vo phng thc Main() nh l im bt u ca chng trnh. Nu c nhiu hn mt phng thc Main(), trnh bin dch s tr v thng bo li. Do , mi chng trnh C# phi cha mt phng thc Main(). 2. 9 Bin dch nhiu tp tin C# Ty chn /t:exe /t:library /t:module Xut ng dng console mc nh Lp th vin vi manifest Thnh phn khng c manifest 23

Ty chn /t:winexe

Xut Mt ca s ng dng

V d tp tin MathLibrary.cs c ni dung nh sau:


public class MathLib { public int Cong(int x, int y) { return x + y; } } }

Chng ta bin dch file C# trn thnh th vin lin kt ng (DLL) .NET bng cch s dng cu lnh sau:
csc /t:library MathLibrary.cs

S dng th vin trong cc chng trnh MathClient.cs nh sau:


using System; class Client { public static void Main() { MathLib mathObj = new MathLib(); Console.WriteLine(mathObj. Cong(7, 8)); } }

bin dch chng trnh


csc MathClient.cs /r:MathLibrary. dll kt qu l 15

2. 10 Xut nhp qua Console ng dng dng lnh l ng dng khng c giao din ngi dng. Vic xut nhp thng qua dng lnh chun. Phng thc Main() trong v d Hello World vit chui Chuong Trinh Dau Tien ln mn hnh. Mn hnh c qun l bi mt i tng tn Console. i tng ny c mt phng thc WriteLine() nhn mt chui v xut chng ra thit b xut chun (mn hnh). c mt k t vn bn t ca s console, chng ta dng phng thc: Console.Read(): gi tr tr v s l kiu int hoc kiu string. Hai phng thc dng xut chui k t: Console.Write() - Vit mt gi tr ra ca s. 24

Console.WriteLine() - tng t nh trn nhng s t ng xung hng khi kt thc lnh. V d sau s cho gi tr nhp kiu int v gi tr xut ra kiu chui
int x = Console.Read(); Console.WriteLine((char)x);

Gi tr tr v kiu string:
string s = Console.ReadLine(); Console.WriteLine(s);

Gi s c on m nh sau:
int i = 10; int j = 20; Console.WriteLine("{0} cng {1} bng {2}", i, j, i + j);

Kt qu hin th nh sau:
10 cng 20 bng 30 int i = 940; int j = 73; Console.WriteLine(" {0, 4}\n+{1, 4}\n ----\n {2, 4}", i, j, i + j);

Kt qu: 940 + 73 ---1013 2. 11 S dng ch thch Nh chng ta lu lc u, C# s dng kiu truyn thng ca C cho vic ch thch. Dng // cho hng n v /**/ cho mt khi lnh. Cc a m lnh trong chng trnh C# cng c th cha nhng dng ch thch. V d:
// Ch thch trn 1 dng /* Ch thch trn 2 dng */ Console.WriteLine(/* Kim tra ch thch! */ "Bin dch bnh thng"); DoSomething(Width, /*Height*/ 100); string s = "/* y l chui khng phi ch thch*/";

2. 12 Ch dn tin x l trong C# T nh danh l tn dng cho vic t tn bin cng nh nh ngha kiu s dng nh cc lp, cu trc, v cc thnh phn ca kiu ny. C# c mt s quy tc nh r cc t nh danh nh sau: Chng phi bt u bng k t khng b gch di. 25

Chng ta khng c s dng t kho lm t nh danh. Trong C# c sn mt s t kho (keyword). abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while

26

Chng 3: i tng v kiu


Mc ch ca chng: S dng k tha, phng thc o. S dng np chng phng thc: C# cho php bn nh ngha nhng dng khc nhau ca mt phng thc trong mt lp. Trnh bin dch s t ng chn phng thc no thch hp nht da vo tham s truyn vo ca n. Phng thc to lp v phng thc hy: ch r mt s hnh ng t ng km theo khi khi to i tng v t ng gii phng khi kt thc i tng. Cu trc (struct): l nhng kiu gi tr cung cp nhng tin ch khi chng ta cn mt s tnh nng ca lp nhng khng cn vt v to ra mt thc th lp. Np chng ton hng : kim tra cch nh ngha nhng ton hng cho lp. Ch mc: cho php mt lp c x l ch mc khi n l mt mng v n gin ho cch s dng nhng lp cha cc tp i tng. Giao din : C# h tr k tha thng qua giao din. 3. 1 Lp v cu trc Kh nng to cc kiu d liu mi l c trng ca ngn ng lp trnh hng i tng. Chng ta c th to ra kiu mi bng cch khai bo v nh ngha lp. Th hin ca mt lp gi l mt i tng. i tng c to trong b nh khi chng thc thi. Mt thun li ln nht ca cc lp trong ngn ng lp trnh hng i tng l chng c kh nng ng gi cc c trng v kh nng ca mt thc th vo trong mt n v m chng trnh. nh ngha lp (class) nh ngha mt kiu mi hay mt lp chng ta u tin khai bo n v sau nh ngha cc phng thc v trng ca n. Chng ta khai bo lp s dng t kha class. C php:
[thuc_tnh] [b_t_truy_xut] class nh_danh [:lp_c_s ] { Ni dung lp }

Thng thng mt lp s dng b_t_truy_xut l t kha public nh_danh l tn ca lp. Ni dung ca lp c nh ngha trong phn{}. Trong C# mi th xy ra trong mt lp. V d sau nh ngha mt lp Tester:
public class Tester {

27

public static int Main( ) { /... } }

Lc khai bo mt lp mi, chng ta nh ngha thuc tnh ca tt c i tng cng nh nhng hnh vi ca lp . V d: mt lp SinhVien c cc thuc tnh: maSV, tenSV, ngaySinh, tuoi v cc hnh vi nh sau: XemDiem, XemThongTinHocPhi. Ngn ng lp trnh hng i tng php chng ta to mt kiu mi SinhVien, ng thi ng gi nhng c trng (thuc tnh) v kh nng (phng thc) ca chng. Lc , lp SinhVien c th c cc bin thnh vin(trng) nh maSV, tenSV, ngaySinh, tuoi v cc hm thnh vin XemDiem(), XemThongTinHocPhi(). Lp SinhVien c th c khai bo nh sau:
public class SinhVien { public string maSV; public string tenSV; public DateTime ngaySinh; public int tuoi; public void XemDiem() { ///Noi dung ham } public void XemThongTinHocPhi() { ///Noi dung ham } }

Chng ta khng th gn d liu n kiu SinhVien, u tin chng ta phi khai bo mt i tng kiu SinhVien theo on m sau.
SinhVien sv1;

Mt khi chng ta to mt th hin ca lp SinhVien chng ta c th gn d liu n cc trng ca n. Dng t kha new to i tng.
sv1 = new SinhVien(); sv1.maSV =012345;

Xt mt lp theo di v hin th thi gian ca ngy. Trng thi bn trong ca lp phi c kh nng biu din nm, thng, ngy, gi, pht v giy hin ti. Chng ta mun thi gian hin th nhiu dng khc nhau. Chng ta c th thc hin c yu cu ca lp trn bng cch khai bo mt lp nh ngha mt phng thc v su bin nh sau:
using System;

28

public class Time { // phng thc public public void HienThi( ) { Console.WriteLine("Hin th thi gian hin ti"); } // bin private int Nam; int Thang; int Ngay; int Gio; int Phut; int Giay; } public class Tester { static void Main( ) { Time t = new Time( ); t. HienThi( ); } }

Phng thc HienThi() c nh ngha tr v kiu void. N khng tr v gi tr cho phng thc gi n. Trong hm Main() th hin ca lp Time c to v a ch ca n c gn n i tng t. Bi v t l th hin ca i tng Time nn n c th s dng phng thc HienThi() gi phng thc hin th thi gian:
t. HienThi ( );

3. 2 Thnh vin ca lp Kiu truy xut Kiu truy xut xc nh cc thnh vin (bao gm trng, thuc tnh, phng thc, s kin, y nhim) ca lp c th c nhn thy v s dng ti cc thnh vin bn trong hay bn ngoi lp hay khng. Bng sau lit k cc kiu truy xut v phm vi ca chng: Kiu truy xut Public Hn ch Khng hn ch. Thnh vin c nh du public c nhn thy bi bt k phng thc ca bt k lp 29

private

Cc thnh vin trong lp A c nh du private c truy xut ch trong cc phng thc ca lp A. Mc nh cc thnh vin c khai bo private.

protected

Cc thnh vin trong lp A c nh du protected c truy xut trong cc phng thc ca lp A v cc lp dn xut t A

internal

Cc thnh vin trong lp A c nh du internal c truy xut trong cc phng thc ca bt k lp trong assembly ca A

protected internal Tng ng vi protected or internal Bin thnh vin ca lp nn c khai bo nh sau:
int Nam; int Thang; int Ngay; int Gio; int Phut; int Giay;

Tham s ca phng thc Phng thc c th c s tham s bt k. Tham s khai bo theo sau tn phng thc, mi tham s phi c gn mt kiu d liu. V d sau nh ngha mt tn phng thc PhuongThuc v tr v gi tr void, n nhn hai tham s kiu int v Button:
void PhuongThuc (int thamso1, Button thamso2) { // ... }

Bn trong phn thn ca phng thc, tham s hot ng nh l mt bin cc b. V d sau minh ha cch truyn gi tr vo mt phng thc, trong trng hp ny gi tr ca tham s c kiu int v float
using System; public class MyClass { public void PhuongThuc(int ts1, float ts2) { Console.WriteLine("Cc tham s nhn c: {0}, {1}", ts1, ts2); }

30

} public class Tester { static void Main( ) { int n = 5; float pi = 3. 14f; MyClass mc = new MyClass( ); mc.PhuongThuc (n, pi); } }

To i tng Trong chng trc chng ta phn bit gia kiu gi tr v kiu tham chiu. Cc kiu c bn trong C# l kiu gi tr v chng c to trn stack. i tng v n l mt kiu tham chiu nn c to trn heap. V d:
Time t = new Time();

Trong trng hp ny t khng tht s cha i tng Time, n ch cha a ch ca i tng Time c to trn Heap. t ch tht s l mt tham chiu ca i tng . Phng thc to lp Trong lnh sau:
Time t = new Time();

Mt phng thc c gi bt c lc no chng ta to mt th hin cho mt i tng gi l phng thc to lp. Nu chng ta khng nh ngha n trong phn khai bo lp, CLR s cung cp mt phng thc mc nh i din cho n. Nhim v ca phng thc to lp l to i tng ch bi lp v t i tng vo trong trng thi sn sng. Trc khi phng thc to lp chy, i tng cha tn ti trong b nh, sau khi phng thc to lp thc hin hon thnh, b nh s lu tr mt th hin hp l ca mt lp. Trong v d lp Time, chng ta khng nh ngha mt phng thc to lp, trnh bin dch s t ng to mt phng thc to lp mc nh cho n. Khi s dng phng thc to lp mc nh cc bin c khi to gi tr mc nh nh sau: Kiu Kiu s (int, long. . ) Bool Char 0 False \0 Gi tr mc nh

31

Enum Reference

0 null

Thng thng chng ta nh ngha ring mt phng thc to lp v cung cp tham s cho phng thc to lp khi to cc bin cho i tng ca chng ta. nh ngha mt phng thc to lp, chng ta khai bo mt phng thc c tn trng vi tn lp m chng ta khai bo. Phng thc ny khng tr v bt c gi tr no v thng thng c khai bo public. Tham s s dng trong phng thc to lp cng nh nhng tham s trong phng thc khc. V d sau khai bo mt phng thc to lp cho lp SinhVien v chp nhn cc tham s c cc kiu d liu khc nhau:
using System; namespace QuanLySinhVien { public class SinhVien { private float _diem; public string maso; public string ten; public bool gioitinh; public float diem; public SinhVien(string maso, string ten, bool gioitinh, float diem) { this.maso = maso; this.ten = ten; this.gioitinh = gioitinh; this.diem = diem; } private string GT(bool gt) { return gt?"Nam":"Nu"; } public override string ToString() { return maso + "\t" + ten + "\t" + GT(this.gioitinh) "\t" + diem.ToString(); } } +

32

static void Main(string[] args) { //Khi to mt bin s thuc kiu sinh vin SinhVien s = new SinhVien(001, Thanh, false, 8); //Xut thng tin sinh vin ra mn hnh Console.WriteLine(s); } }

Khi to gi tr cho cc bin Thay v khi to gi tr cc bin thnh vin thng qua phng thc to lp chng ta c th thc hin gn gi tr trc tip cho bin. Phng thc to lp ca chng trnh trn c th c vit nh sau:
public void SinhVien() { Console.Ghi("Nhap maso "); maso = Console.ReadLine(); Console.Ghi("Nhap ten "); ten = Console.ReadLine(); Console.Ghi("Nhap gioi tinh 1 cho Nam, 0 cho Nu "); int i = int.Parse(Console.ReadLine()); if(i==1) this.gioitinh = true; else this.gioitinh = false; Console.Ghi("Nhap diem "); diem = float. Parse(Console.ReadLine()); }

Phng thc to lp sao chp Phng thc to lp sao chp to mt i tng mi bng cch chp cc bin t i tng hin ti n i tng mi cng kiu. V d chng ta mun truyn mt i tng SinhVien b n mt i tng SinhVien a ca phng thc to lp nhm to ra i tng mi c cng gi tr vi i tng c. C# khng cung cp phng thc to lp sao chp, do chng ta phi t to. V d:
public SinhVien(SinhVien sv) { this.maso = sv.maso; this.ten = sv.ten; this.gioitinh = sv.gioitinh; this.diem = sv.diem;

33

Da trn vic khai bo phng thc to lp bn trn ta c th to mt i tng sinh vin b t mt i tng sinh vin a nh sau:
SinhVien a = new SinhVien(001, Thanh, false, 8); SinhVien b = new SinhVien(a)

T kha this T kha this ch ra trng thi hin ti ca i tng. Tham chiu this (con tr this) l mt con tr n n cc hm khng tnh (khng khai bo t kha static) ca lp. Mi phng thc c th tham chiu n cc phng thc v cc bin khc da trn tham chiu this. Tham chiu this c th s dng theo ba trng hp sau: Trnh xung t tn. Truyn i tng hin ti l tham s ca mt phng thc khc. Dng vi ch mc. S dng cc thnh vin tnh Thuc tnh v phng thc ca mt lp c th l thnh vin ca th hin hay thnh vin tnh. Thnh vin th hin c kt hp vi th hin ca kiu, trong khi thnh vin tnh c coi l phn ca lp. Chng ta truy xut cc thnh vin tnh thng qua tn lp chng ta khai bo.
using System; namespace Test { class Mang1Chieu { static int []a = new int[100]; static int n = 0; static void Main(string[] args) { Nhap(); //Chng ta cng c th gi phng thc tnh nh sau Mang1Chieu.Xuat(); Console.WriteLine("Tong cac phan tu mang la " + TinhTong(). ToString()); Console.ReadLine(); } void NhapNgauNhien() { Console.Ghi("Nhap vao chieu dai cua mang n = "); n = int.Parse(Console.ReadLine());

34

Random r = new Random(); for(int i=0; i < n; i++ ) a[i] = r.Next(10); } static void Nhap() { Console.Ghi("Nhap vao chieu dai cua mang n = "); n = int.Parse(Console.ReadLine()); for(int i=0; i < n; i++ ) { Console.Ghi("a[{0}] = ", i); a[i] = int.Parse(Console.ReadLine()); } } static int TinhTong() { int sum = 0; int i = 0; while(i<n) sum += a[i++]; return sum; } static void Xuat() { Console.Ghi("Mang vua nhap la "); for(int i=0; i < n; i++ ) Console.Ghi("{0} ", a[i]); } } }

Trong v d trn chng ta khai bo lp Mang1Chieu v c cc phng thc tnh nh Nhap, Xuat. Chng ta c th gi thc hin cc phng thc ny trc tip m khng cn thng qua i tng hay th hin ca lp. Trong C#, s khng hp l nu chng ta truy xut thnh vin tnh qua th hin. Gi phng thc tnh Hm Main() l mt phng thc tnh. Phng thc tnh hot ng trn lp hn l trn th hin ca lp. Chng khng c tham chiu this tr n phng thc tnh. Phng thc tnh khng th truy xut trc tip t cc thnh vin khng tnh.

35

Trong v d trn phng thc NhapNgauNhien l phng thc khng tnh, do phi c truy cp thng qua i tng nh sau: V d:
static void Main(string[] args) { Mang1Chieu a = new Mang1Chieu(); a.NhapNgauNhien(); Xuat(); Console.WriteLine("Tong cac phan tu mang la " + TinhTong(). ToString()); Console.ReadLine(); }

S dng phng thc to lp tnh Nu chng ta khai bo mt phng thc to lp tnh, chng ta phi m bo phng thc to lp tnh s chy trc khi th hin ca lp c to. V d, chng ta c th thm phng thc to lp tnh vo lp Mang1Chieu
static Mang1Chieu( ) { }

Chng ta khng c khai bo kiu truy xut trc phng thc to lp tnh. Hn na, v y l mt phng thc thnh vin tnh, chng ta khng th truy xut vo bin thnh vin khng tnh, do tt c cc bin mun c truy cp thng qua cc thnh vin tnh phi c khai bo static. S dng trng tnh Dng bin thnh vin tnh l cch ph bin theo di s th hin hin ti ca lp. V d:
using System; public class Meo { public Meo( ) { thehien ++; } public static void SoMeo( ) { Console.WriteLine("S th hin ca mo la{0} ", thehien); } private static int thehien = 0;

36

} public class Tester { static void Main( ) { Meo.SoMeo( ); Meo Tom= new Cat( ); Meo.SoMeo( ); Meo Linda = new Cat( ); Meo.SoMeo( ); } }

Hy i tng C# cung cp mt c ch dn rc hy cc i tng mt cch t ng v do chng ta khng cn mt phng thc hy r rng xa cc i tng trong b nh. Phng thc Finalize() c gi bi b dn rc khi i tng ca chng ta b hy. Hm ny ch gii phng cc ti nguyn m i tng ny ang gi v n khng tham chiu n cc i tng khc. V d khai bo phng thc hy:
~ Mang1Chieu () { ///M }

Hay
Mang1Chieu.Finalize() { ///M }

Truyn tham s Mc nh cc kiu gi tr c truyn vo trong cc phng thc bi gi tr. Tuy nhin trong nhiu trng hp chng ta mun truyn gi tr i tng theo tham chiu. C# cung cp 2 cch truyn tham chiu i tng vo trong phng thc: Dng t kha ref. Dng t kha out, i tng truyn vo khng cn khi gn. Ngoi ra, C# cn cung cp t kha params cho php mt phng thc truyn s tham s ty .

37

Truyn tham chiu Mt phng thc ch c th tr v mt gi tr, do khi mun phng thc tr v nhiu hn mt gi tr, chng ta dng cch thc truyn tham chiu. V d, thc hin on chng trnh sau:
using System; namespace Bien { class Class1 { static int a = 1; static int b = 2; static void GiaTri(int a, int b) { a = 10; b = 20; } static void Main(string[] args) { int a = 1; Console.WriteLine("a = {0}, b = {1}", a, b); GiaTri(a, b); Console.WriteLine("a = {0}, b = {1}", a, b); Console.ReadLine(); } } } Kt qu th hin chng trnh l a =1, b =2 v a=1, b=2

Nhng nu chng ta khai bo phng thc GiaTri nh sau:


static void GiaTri(ref int a, int b) { a = 10; b = 20; }

th kt qu thc hin chng trnh s l a =1, b =2 v a=10, b=2. Ta thy gi tr ca bin a thay i nhng gi tr ca bin b khng thay i sau khi chng ta thc hin gi phng thc GiaTri v bin a c truyn theo kiu tham bin cn bin b c truyn theo kiu tham tr.

38

Truyn tham s dng t kha out Mc nh C# quy nh tt c cc bin phi c gn tham s trc khi s dng. Trong v d trn nu chng ta khng khi to bin a trong hm Main, chng trnh thng dch s thng bo li bin cha c khi gn nh sau Use of unassigned local variable 'a'. Chng ta c th trnh bng cch dng t kha out v khai bo nh sau:
using System; namespace Bien { class Class1 { static int a = 1; static int b = 2; static void GiaTri(out int a, int b) { a = 10; b = 20; } static void Main(string[] args) { int a = 1; GiaTri(out a, b); Console.WriteLine("a = {0}, b = {1}", a, b); Console.ReadLine(); } } }

Np chng phng thc Thng thng chng ta mun khai bo nhiu hm vi cng tn. C# cho php khai bo cc hm trng tn nhng du hiu phi khc nhau. V d chng ta mun dng nhiu phng thc to lp khc nhau khi to cc kiu i tng khc nhau. Du hiu ca mt phng thc c nh ngha bi tn v danh sch tham s. Hai phng thc c du hiu khc nhau nu c tn v danh sch tham s khc nhau. Tham s khc nhau bi s tham s hay kiu khc nhau. V d cc hm sau c cc du hiu khc nhau:
void PhuongThuc(int p1); void PhuongThuc (int p1, int p2); void PhuongThuc (int p1, string s1);

V d minh ha s dng qu ti hm cho phng thc to lp ca lp MaTran 39

using System; namespace MaTran { public class MaTran { public double[, ] mt; public int hang; public int cot; #region Phuong thuc tao lap public MaTran() { //Phuong thuc tao lap mac dinh } public MaTran(int h, int c) { this.hang = h; this.cot = c; mt = new double[h, c]; } public MaTran(MaTran a) { mt = new double[a. hang, a. cot]; this.hang = a.hang; this.cot = a.cot; for (int i = 0; i < a.hang; i++) for (int j = 0; j < a.cot; j++) this.mt[i, j] = a.mt[i, j]; } public MaTran(MaTran a, int h, int c) { mt = new double[h, c]; this.hang = h; this.cot = c; for (int i = 0; i < h; i++) for (int j = 0; j < c; j++) this.mt[i, j] = a.mt[i, j]; } public void Nhap() {

40

Console.WriteLine("Nhap mot ma tran cap {0}x{1} ", this.hang, this.cot); for (int i = 0; i < this.hang; i++) for (int j = 0; j < this.cot; j++) { j); } } public void Nhap(int h, int c) { mt = new double[h, c]; for (int i = 0; i < h; i++) for (int j = 0; j < c; j++) { j); } } public override string ToString() { string kq = ""; for (int i = 0; i < this.hang; i++) { kq += "\n"; for (int j = 0; j < this.cot; j++) { kq += "\t" + this.mt[i, j].ToString(); } } return kq; } public MaTran Tong(MaTran a, MaTran b) { MaTran kq = new MaTran(a. hang, a. cot); for (int i = 0; i < b.hang; i++) for (int j = 0; j < b.cot; j++) kq.mt[i, j] = a.mt[i, j] + b.mt[i, j]; return kq; Console.Ghi("Nhap phan tu thu [{0}, {1}] = ", i, this.mt[i, j] = double.Parse(Console.ReadLine()); //Console.Ghi("Nhap phan tu thu [{0}, {1}] = ", i, this.mt[i, j] = i + j;

41

} public void Tong(MaTran b) { for (int i = 0; i < b.hang; i++) for (int j = 0; j < b.cot; j++) this.mt[i, j] = this.mt[i, j] + b.mt[i, j]; } } }

Trong v trn chng ta khai bo ba phng thc to lp khc nhau cho vic khi to mt i tng kiu MaTran. Tng t chng ta cng nh ngha nhiu phng thc Tong vi cc tham s khc nhau cho vic cng hai ma trn. ng gi d liu vi thuc tnh Cc thuc tnh cho php cc client truy xut ti trng thi ca lp nh l truy xut cc trng thnh vin trc tip ca lp. Truy xut thuc tnh tng t nh truy xut phng thc ca lp. Ngha l cc client c th truy xut trc tip n trng thi ca i tng (thuc tnh) m khng cn thng qua vic gi thc thi cc phng thc. Tuy nhin, nhng ngi thit k lp hay mun che du trng thi bn trong ca cc thnh vin lp v ch mun cc thuc tnh ch trc truy xut gin tip thng qua phng thc ca lp. Bng cch phn tch thuc tnh vi cc phng thc ca lp, cc nh thit k c th t do thay i gi tr hay trng thi ca cc thuc tnh bn trong ca i tng khi cn. Cho v d nh sau:
using System; namespace DoiTuongDoiTuongHinhHoc { public class HinhTron { private double r; public HinhTron() { } public HinhTron(double bankinh) { this.R = bankinh; } public double DienTich() { return Math.Round(Math.PI*R*R, 2); } public override string ToString()

42

{ return "Duong tron co ban kinh " + R + " dien tich " + this.DienTich(); } } }

Lc lp HinhTron c to, gi tr ca thuc tnh bn knh r c th c lu tr l mt bin thnh vin. Lc lp c thit k li, gi tr ca thuc tnh r c th c tnh ton li hay ly t c s d liu. Nu client truy xut trc tip bin thnh vin r, nhng thay i gi tr tnh ton c th lm hng ng dng client. Bng cch phn tch v bt buc client mun truy cp thuc tnh r phi s dng thng qua phng thc. Ta c th khai bo nh sau cho php i tng c th truy cp bin r thng qua phng thc:
using System; namespace DoiTuongDoiTuongHinhHoc { public class HinhTron { private double r; public double R { get { return r; } set { r = value; } } public HinhTron() { } public HinhTron(double bankinh) { this.R = bankinh; } public double DienTich() { return Math.Round(Math.PI*R*R, 2); } public override string ToString()

43

{ return "Duong tron co ban kinh " + R + " dien tich " + this.DienTich(); } } }

Thuc tnh p ng c hai mc ch: Chng cung cp mt giao tip n gin vi client, xut hin nh l bin thnh vin. Chng thc hin nh l mt phng thc. Tuy nhin, chng cung cp c ch che du d liu bi mt thit k hng i tng. khai bo thuc tnh, chng ta vit kiu thuc tnh v tn theo sau bi {}. Bn trong {} chng ta c th khai bo cch thc truy xut get hay set. Qua phng thc set chng ta c mt tham s n value. Trong v d trn R l mt thuc tnh, n khai bo 2 kiu truy xut
public int R { get { return r; } set { r = value; } }

Gi tr ca thuc tnh R c th c lu tr trong c s d liu, trong bin thnh vin private thm ch lu tr ti mt my tnh hay mt dch v no trong mng. Truy xut get Phn thn ca truy xut get th tng t nh phn thn ca phng thc lp. Chng tr v mt i tng c kiu l kiu ca thuc tnh. Trong v d trn, truy xut get ca R tr v gi tr double. N tr v gi tr ca bin thnh vin private r. Bt c lc no chng ta tham chiu n thuc tnh, truy xut get c yu cu c gi tr ca thuc tnh.
HinhTron t = new HinhTron (1, 5); double bankinh = t.R;

Truy xut set Truy xut set dng gn gi tr cho thuc tnh, n tng t nh mt phng thc lp tr v kiu void. Lc chng ta nh ngha mt truy xut set, chng ta phi s dng t 44

kha value (tham s n) biu din tham s ni m gi tr c truyn v lu tr trong thuc tnh:
set { r } = value;

Lc chng ta gn mt gi tr n mt thuc tnh, truy xut set t ng c yu cu v tham s n value c t gi tr m chng ta cn gn cho thuc tnh: V d ta c th dng lnh sau trong mt phng thc no ca lp HinhTron tng gi tr ca thuc tnh r ln 1:
r++;

Thun li ca cc tip cn ny l client c th truy xut trc tip thuc tnh m khng cn quan tm ti cc d liu n bn trong. Cc trng ch c (readonly) Nu chng ta mun to mt phin bn ca lp ThoiGian sau c nhim v cung cp mt gi tr tnh, biu din ngy v thi gian hin ti. Chng ta c th dng khai bo readonly khai bo cc thuc tnh:
public class ThoiGian { static ThoiGian() { System.DateTime dt = System.DateTime.Now; Nam = dt.Year; Thang = dt.Month; Ngay = dt.Day; Gio = dt.Hour; Phut = dt.Minute; Giay = dt.Second; } public static int Nam; public static int Thang; public static int Ngay; public static int Gio; public static int Phut; public static int Giay; } public class Tester { static void Main()

45

{ System.Console.WriteLine("This Nam: {0}", ThoiGian.Nam.ToString()); ThoiGian.Nam = 2002; System.Console.WriteLine("This Nam: {0}", ThoiGian.Nam.ToString()); } }

Trong trng hp ny, gi tr ca bin Nam s vn thay i khi chng ta thc hin php gn Nam = 2002. Chng ta mun nh du cc gi tr tnh l hng nhng khng th v chng ta khng khi gn gi tr cho chng cho ti khi phng thc to lp tnh c thc hin. C# cung cp t kha readonly dng cho mc ch ny. Nu chng ta thay i khai bo bin thnh vin ca lp nh sau:
public static readonly int Nam; public static readonly int Thang; public static readonly int Ngay; public static readonly int Gio; public static readonly int Phut; public static readonly int Giay;;

v khng dng lnh:


// ThoiGian. Year = 2002; // Thc hin lnh ny s gy ra li

Trnh bin dch thc hin v chy theo ng yu cu ca chng ta. 3. 3 Cu trc (Struct) Lm vic vi kiu cu trc Kiu d liu tham chiu lun c to trn heap. Trong mt s trng hp, mt lp cha qu t d liu cn s qun l ca heap. Tt nht trong trng hp ny bn dng cu trc. Bi v cu trc c lu tr trong stack, iu ny gim bt chc nng qun l b nh. Cu trc cng c ring trng, phng thc to lp v phng thc ging lp (nhng khng ging kiu lit k). Tuy nhin n l kiu gi tr khng phi kiu tham chiu. Cc kiu cu trc ph bin Trong C#, cc kiu s c bn nh int, long, float l tn hiu ca cu trc System.Int32, System.Int64, v System.Single. Ngha l chng ta c th gi phng thc trn bin thuc kiu ny. V d, tt c cu trc ny cung cp phng thc ToString chuyn s sang chui. Cc lnh sau l hp l trong C#:
int i = 99; Console.WriteLine(i. ToString()); Console.WriteLine(55. ToString()); float f = 98.765F;

46

Console.WriteLine(f. ToString()); Console.WriteLine(98.765F. ToString());

Console.WriteLine s t ng gi phng thc ToString khi cn. S dng phng thc tnh trong cu trc rt ph bin. V d phng thc tnh Int32.Parse thng c dng chuyn mt chui sang s:
string s = "42"; int i = Int32.Parse(s);

Trong nhng cu trc trn cng cha nhng trng tnh hu ch nh Int32.MaxValue ly gi tr ln nht ca bin int v Int32. MinValue ly gi tr nh nht ca bin int. Bng sau hin th kiu d liu c bn trong C#, n c th tng ng kiu lp hay cu trc: T kha bool byte decimal Double Float Int Long Object Sbyte Short String Uint Ulong Ushort Kiu tng ng System.Boolean System.Byte System.Decimal System.Double System.Single System.Int32 System.Int64 System.Object System.SByte System.Int16 System.String System.UInt32 System.UInt64 System.UInt16 Lp hoc cu trc Cu trc Cu trc Cu trc Cu trc Cu trc Cu trc Cu trc Lp Cu trc Cu trc Lp Cu trc Cu trc Cu trc

Khai bo kiu cu trc khai bo kiu cu trc, bn khai bo t kha struct theo sau bi tn v phn thn trong du {}. V d, y l cu trc tn ThoiGian cha 3 trng public: Gio, Phut, v Giay.

47

struct Time { public int Gio, Phut, Giay; }

Tng t nh lp, nh du public cho cc trng khng c khuyn khch trong hu ht trng hp v khng c cch m bo trng public cha gi tr hp l. V d, bn c th gn tr ca Phut hay Giay > 60. Cch tt hn l nh du trng private v cung cp truy xut cu trc ca bn qua phng thc to lp hay phng thc nh sau:
struct ThoiGian { public ThoiGian (int hh, int mm, int ss) { Gio= hh % 24; phut = mm % 60; giay = ss % 60; } public int Gio() { return gio; } ... private int gio, phut, giay; }

Khi bn sao chp mt bin kiu gi tr, bn c hai bn sao ca gi tr. Ngc li, lc bn sao chp mt bin kiu tham chiu, bn c hai tham chiu n cng i tng. Tm hiu s khc nhau gia lp v cu trc Bn khng th khai bo phng thc to lp mc nh (phng thc to lp khng c tham s) cho cu trc. V d sau s bin dch nu ThoiGian l lp nhng vi cu trc th khng:
struct ThoiGian { public ThoiGian () {... } // Li bin dch ... }

Bi v trnh bin dch lun to phng thc to lp mc nh cho cu trc. Trong khi trong lp, trnh bin dch ch to n khi khng c khai bo phng thc to lp trong lp. Trnh bin dch to phng thc to lp mc nh cho mt cu trc lun gn 0, false, null ging nh lp cho cc kiu d liu tng ng. Do bn mun khi to cc gi 48

tr khc cho trng bn phi dng phng thc to lp khng mc nh ca bn. Tuy nhin bn phi khi to tt c cc trng trong cu trc, nu khng trnh bin dch s thng bo li. V d sau s c bin dch nu ThoiGian l mt lp v giay c gn bng 0 nhng v ThoiGian l cu trc nn li khi bin dch:
struct ThoiGian { public ThoiGian (int hh, int mm) { gio = hh; phut = mm; } ... private int gio, phut, giay; } // li thi gian bin dch: giay cha c khi to

Trong mt lp bn c th khi to trng lc khai bo nhng trong cu trc bn khng th. V d sau s c bin dch nu ThoiGian l mt lp nhng v ThoiGian l cu trc nn li khi bin dch:
struct ThoiGian { ... private int gio = 0; // li bin dch private int phut; private int giay; }

Bng sau tm tt s khc nhau gia lp v cu trc Cu hi Kiu ca n l g? Cu trc Cu trc l kiu gi tr Lp Lp l kiu tham chiu

Th hin ca cu trc Th hin ca lp l Th hin ca n lu trn stack hay heap? c gi l gi tr v i tng c lu trn heap lu trn stack Bn c th khai bo phng thc to lp Khng mc nh? Nu bn khai bo phng thc to lp ring bn, trnh bin dch s to phng thc to lp mc nh? C C

Khng C

Nu bn khng khi to trng trong Khng phng thc to lp ring bn, trnh bin 49

Cu hi dch s t ng khi to cho bn? Bn c php khi to trng th hin lc khai bo? Khng

Cu trc

Lp

Cn mt s khc nhau khc gia lp v cu trc l lp c th k tha t lp c s nhng cu trc th khng. Khai bo bin cu trc Sau khi bn nh ngha mt kiu cu trc, bn c th dng n nh cc kiu khc. V d, nu bn nh ngha cu trc ThoiGian bn c th to bin, trng, tham s kiu ThoiGian nh sau:
struct ThoiGian { ... private int gio, phut, giay; } class ViDu { public void PhuongThuc(ThoiGian para) { ThoiGian bienCucBo; ... } private ThoiGian } thoiGianHienTai;

Khi to cu trc Gi s chng ta nh ngha lp nh sau:


struct Time { ... private int hours, minutes, seconds;

} V cu trc l kiu d liu nn bn c th to bin cu trc m khng cn gi phng thc to lp nh v d sau:


Time now;

Trong v d ny, bin c to nhng trng bn tri ca n trng thi cha c to. Nu bn truy xut gi tr ca trng ny s gy ra li bin dch. Hnh sau m t trng thi ca trng trong bin now: 50

Nu bn gi mt phng thc to lp, quy tc khi to m bo tt c cc bin c khi to:


Time now = new Time();

Lc ny phng thc to lp mc nh c gi khi to tt c cc trng trong cu trc nh hnh sau:

Nu bn mun vit phng thc to lp ring, bn c th dng n khi to bin cu trc. Mt phng thc to lp ca cu trc phi lun khi to tt c cc trng ca n. V d:
struct Time { public Time(int hh, int mm) { hours = hh; minutes = mm; seconds = 0; } ... private int hours, minutes, seconds; }

Trong v d sau khi to now bi gi phng thc to lp ngi dng nh ngha: 51

Time now = new Time(12, 30);

Kt qu trong stack c lu tr nh trong hnh sau:

Sao chp bin cu trc Bn c cho php khi gn hay gn mt bin cu trc cho mt bin cu trc khc nhng ch nu bin bn phi c khi to honh chnh (tt c cc trng c khi to). V d sau s c bin dch v now c khi to hon ton:
Time now = new Time(12, 30); Time copy = now;

Trong v d sau s li khi bin dch v now cha c khi to:


Time now; Time copy = now; // li bin dch: now cha c gn

Khi bn sao chp mt cu trc, cc trng bn tri c sao chp trc tip t cc trng bn phi. 52

3. 4 Lp Object Trong C#, nu bn khng ch r mt lp k tha t mt lp khc th trnh bin dch s t ng hiu rng lp ca bn k tha t lp Object. Ngha l ngoi nhng thuc tnh v phng thc m bn nh ngha th bn c th truy cp n nhng phng thc protected v public ca lp Object v nhng phng thc ny cng c trong tt c lp m bn nh ngha. Mt s phng thc c nh ngha trong lp Object l: Phng thc string ToString() int GetHashTable() bool Equals(object obj) B t truy cp public virtual public virtual public virtual Chc nng Tr v mt chui m t ca i tng c s dng nu thc thi t in So snh cc thc th ca i tng So snh cc thc th ca i tng So snh hai s tham kho n mt i tng Tr v chi tit kiu ca mt i tng. to ra mt bn copy ca i tng y l mt dng Destructor ca.NET

bool Equals(object objA, object public static objB) bool ReferenceEquals(object public static objA, object objB) Type GetType() public object MemberwiseClone() void Finalize() Phng thc Tostring(): protected protected virtual

ToString() l mt cch tin li ly mt chui m t i tng. V d:


int i = -50; string str = i.ToString(); // returns "-50"

Thm mt v d khc:
enum Mau {Do, Cam, Vang}; Mau m = Mau.Cam; string str = m.ToString(); // tr v "Cam"

Object.Tostring() c khai bo l hm o. Trong C#, cc kiu d liu c sn chng hm (override) phng thc ToString() gip cho chng ta c th ly c chui m t ca cc kiu . Nu khng nh ngha chng hm phng thc ToString() trong lp th lp s k tha s thc thi phng thc ToString() ca lp System.Object v tr v tn lp. Nu mun phng thc ToString() tr v mt chui 53

cha ni dung thng tin v gi tr ca i tng ca mt lp, chng ta phi ghi chng phng thc ToString(). Xem v d sau:
using System; class ViDu { static void Main(string[] args) { Tien tienMat = new Tien(); tienMat.SoLuong = 40M; Console.WriteLine("tienMat.ToString() tra ve: " + tienMat.ToString()); tienMat = new TienKhac(); tienMat.SoLuong = 40M; Console.WriteLine("tienMat.ToString() tra ve: " + tienMat.ToString()); Console.ReadLine(); } } class Tien { private decimal soluong; public decimal SoLuong { get { return soluong; } set { soluong = value; } } } class TienKhac: Tien { public override string ToString() { return "$" + SoLuong.ToString(); } }

54

Trong phng thc Main(), chng ta khi to u tin l i tng Tien(), sau l i tng TienKhac (). Trong c hai trng hp ta u gi ToString() nhng vi i tng Tien() th s thc thi phng thc ca System.Object cn vi i tng TienKhac () th s thc thi phng thc m chng ta override. Kt qu sau khi chy on m trn l:
tienMat. ToString() tra ve: Tien tienMat. ToString() tra ve: $40

55

Chng 4: S k tha
Mc ch ca chng: Cung cp kin thc v s dng tnh ng gi trong chng trnh. S dng tnh k tha v a hnh trong chng trnh. S dng giao tip (interface) trong qu trnh pht trin ng dng. 4. 1 Cc kiu k tha S k tha (Inheritance) l g? K tha trong ngn ng lp trnh lin quan s phn lp, chnh l mi quan h gia cc lp. V d, c voi hay nga l nhng ng vt c v. C voi v nga c mi c c trng m ng vt c v c nhng n cng c ring nhng c trng ca tng loi (nga c mng cn c voi th khng). Trong C#, bn c th m hnh iu ny bng cch to hai lp, mt lp tn DongVat v mt lp tn Ngua v khai bo Ngua k tha t DongVatCoVu. S k tha s m hnh rng c mt quan h v m t s kin rng tt c nga l ng vt c v. Tng t, bn c th khai bo mt lp tn CaHeo cng k tha t DongVatCoVu. Nhng c trng chung (nh ngy sinh, cn nng) c t trong lp DongVatCoVu. Thuc tnh nh l mng hay vy c t tng ng trong lp Ngua v CaHeo. Lp c s (base) v lp dn xut (Derived) C php khai bo mt lp k tha t mt lp khc nh sau:
class Lp_Dn_Xut: Lp_C_S { ... }

Lp dn xut k tha t lp c s. Trong C# ch cho mt lp k tha t mt lp khc duy nht, n khng cho dn xut t hai hay nhiu lp. Tr khi lp dn xut c khai bo l sealed, bn vn c th khai bo mt lp k tha t lp dn xut vi cng c php:
class Lp_Con_Dn_Xut: Lp_Dn_Xut { ... }

Theo cch ny bn c th to mt phn cp k tha. Gi s chng ta vit mt trnh qun l cc i tng hnh hc. Trong chng ta qun l cc i tng nh l hnh tam gic, hnh vung, hnh trnChng ta c th khai bo mt lp DoiTuongHinhHoc trong nh ngha phng thc TinhDienTich v Ve nh sau:
public class DoiTuongHinhHoc {

56

public float X; public float Y; public DoiTuongHinhHoc(){} public DoiTuongHinhHoc(float x, float y){} public double TinhDienTich(); public void Ve(); }

Chng ta c th nh ngha cc lp HinhTron, HinhVuong, HinhTamGiac k tha t lp DoiTuongHinhHoc nh sau:


public class HinhTron: DoiTuongHinhHoc { } public class HinhTamGiac: DoiTuongHinhHoc { } public class HinhVuong: DoiTuongHinhHoc { }

i tng System.Object l lp gc ca tt c cc lp. Tt c cc lp dn xut ngm nh t lp System.Object. Nu bn thc thi lp DoiTuongHinhHoc nh trn: Trnh bin dch s t ng vit li theo m sau:
class DoiTuongHinhHoc: System.Object { public DoiTuongHinhHoc() { ... } ... }

Ngha l tt c cc lp bn nh ngha k tha tt c cc c trng ca lp System.Object. iu ny bao gm phng thc ToString chuyn mt i tng sang mt chui. Trong C#, quan h chuyn bit ha thng thng c thc hin thng qua s k tha. y khng phi l cch duy nht thc hin s k tha. Tuy nhin n l cc ph bin v t nhin thc hin quan h ny. Chng ta ni HinhTron k tha t DoiTuongHinhHoc c ngha n l mt DoiTuongHinhHoc chuyn bit. DoiTuongHinhHoc c gi l mt lp c s (base) 57

v HinhTron gi l lp dn xut(derived ). Tht vy, HinhTron k tha nhng c trng v hnh vi ca lp DoiTuongHinhHoc v ri chuyn bit ha nhng nhu cu ring ca n. 4. 2 Thc thi s k tha Trong C# chng ta c th to mt lp dn xut bng cch thm du hai chm theo sau tn ca lp dn xut cng vi tn ca lp c s.
public class HinhTron: DoiTuongHinhHoc

Trong khai bo trn, khai bo HinhTron l lp dn xut t DoiTuongHinhHoc. Lp dn xut k tha tt c thnh vin ca lp c s. Lp dn xut c th t do thc hin nhng phin bn ring ca mnh i vi cc phng thc lp c s. N thc hin iu ny bng cch nh du phng thc mi bng t kha new. Dng t kha ny ch ra lp dn xut mun che du v thay th phng thc lp c s. V d sau minh ha mt lp dn xut
public class DoiTuongHinhHoc { public float X; public float Y; public DoiTuongHinhHoc() { } public DoiTuongHinhHoc(float x, float y) { this.X = x; this.Y = y; } public double TinhDienTich() { return 0; } public void Ve() { Console.WriteLine("Ve tai vi tri {0} {1} ", X, Y); } } public class HinhTron:DoiTuongHinhHoc { public HinhTron(){} public HinhTron(float x,float y):base(x,y) { } public new void Ve() { base.Ve();

58

} } class ViDu { static void Main() { DoiTuongHinhHoc h = new DoiTuongHinhHoc(10, 10); h.Ve(); HinhTron r = new HinhTron(20, 20); r.Ve(); } }

Gi phng thc to lp ca lp c s Trong v d trn lp HinhTron dn xut t lp DoiTuongHinhHoc v c phng thc to lp ring ca n vi hai tham s. Phng thc to lp ca lp HinhTron gi phng thc to lp ca lp cha bng cch t du : sau danh sch tham s v gi lp c s vi t kho base:
public HinhTron(float x,float y):base(x,y)// mt cch thc khc gi phng thc to lp ca lp c s

Bi v cc lp khng th k tha phng thc to lp ca lp c s nn mt lp dn xut phi thc thi phng thc to lp ring ca mnh v chng c th s dng phng thc to lp ca lp c s theo cch r rng nh trn Ch trong v d trn lp dn xut HinhTron thc thi mt phin bn mi ca phng thc Ve();
public new void Ve();

T kho new ch ra rng ngi lp trnh mun to ra mt phin bn mi ca phng thc ny trong lp dn xut. Nu lp c s c mt phng thc to lp c th truy xut mc nh. Khi phng thc to lp ca lp dn xut khng yu cu phng thc to lp ca lp c s, khi phng thc to lp mc nh ca lp c s c gi theo kiu khng tng minh. Tuy nhin nu lp c s khng c mt phng thc to lp mc nh, cc lp dn xut phi gi r rng mt phng thc to lp c s s dng t kha base. Gi phng thc lp c s Trong v d trn phng thc Ve() ca lp HinhTron n v thay th phng thc Ve() ca lp c s. Lc chng ta gi phng thc Ve() trong mt i tng kiu HinhTron th phng thc HinhTron.Ve() c gi ch khng phi phng thc HinhTron () trong lp DoiTuongHinhHoc. Tuy nhin, trong lp HinhTron ta vn c th gi phng thc Ve() ca lp DoiTuongHinhHoc thng qua t kha base. 4. 3 T kha b tr

59

Hin th ca lp v cc thnh vin ca lp c th c hn ch bng cch khai bo kiu truy xut nh public, private, protected, internal, protected internal. Cc lp v cc thnh vin ca n c th c thit k theo nhiu mc truy xut khc nhau. Nu mt thnh vin ca lp c nhiu mc truy xut khc nhau, mc hn ch nht c chn. Tht vy, nu chng ta nh ngha mt lp ViDu nh sau:
public class ViDu { // protected int giaTri; }

Th truy xut i vi bin giaTri t cc i tng l protected mc d mc truy xut ca lp ViDu l public. 4. 4 a hnh (polymorphism) Hai kha cnh mnh nht ca k tha l kh nng s dng li m v a hnh (polymorphism). Poly c ngha l nhiu v morph ngha l hnh thc. Tht vy a hnh chnh l kh nng s dng nhiu hnh thc ca mt kiu m khng cn quan n chi tit ca n. To kiu a hnh Bi v HinhTron l-mt DoiTuongHinhHoc v HinhVuong l-mt DoiTuongHinhHoc. y l nhng quan h k tha. Chng ta mong mun c th s dng mt trong hai kiu ny trong tnh hung chng ta gi DoiTuongHinhHoc. V d, mt mng gi mt tp tt c cc th hin ca DoiTuongHinhHoc. Chng ta mun tnh tng din tch ca tt c cc hnh c trong mng bng cch ly tng phn t trong mng v cng vo tng din tch. Trong trng hp ny chng ta khng cn bit i tng trong danh sch l HinhTron hay HinhVuong, chng ta ch ly ra mt phn t v yu cu n t tnh din tch. Chng ta s x l tt c cc i tng DoiTuongHinhHoc theo c trng a hnh. To phng thc a hnh to phng thc h tr a hnh, chng ta cn nh du dng t kha virtual trong lp c s ca n. V d ch ra phng thc Ve() trong lp DoiTuongHinhHoc l a hnh chng ta dng t kha theo khai bo sau:
public virtual void Ve( )

By gi cc lp dn xut t do thc hin cc phin bn ring ca lp Ve(). thc hin iu ny chng ta n gin vit ln phng thc o ca lp c s dng t kho override trong lp dn xut HinhTron. V d:
public override void Ve( ) { base.Ve( ); // gi hm v ca s ca lp cha Console.WriteLine ("Hinh Tron); }

Tng t chng ta c th thc hin iu ny cho lp HinhVuong. 60

Hm Main() ca chng trnh c th c vit li nh sau


DoiTuongHinhHoc h = new DoiTuongHinhHoc (1, 2); HinhTron r = new HinhTron (3, 4); HinhVuong b = new HinhVuong (5, 6); h.Ve( ); r.Ve( ); b.Ve( );

Chng trnh c th thc hin nh ta mong mun. i tng Ve c gi cho mi i tng. Tuy nhin khng c tnh a hnh c s dng y. Mun s dng a hnh chng ta phi khai bo sau:
DoiTuongHinhHoc [] a = new DoiTuongHinhHoc [3]; a[0] = new DoiTuongHinhHoc (1, 2); a[1] = new HinhVuong(3, 4); a[2] = new HinhTron(5, 6);

iu g xy ra khi ta gi phng thc DrawWindow()? V d hon chnh nh sau:


using System; using System.Text; namespace ConsoleApplication3 { public class DoiTuongHinhHoc { public float X; public float Y; public DoiTuongHinhHoc() { } public DoiTuongHinhHoc(float x, float y) { this.X = x; this.Y = y; } public virtual float TinhDienTich() { return 0; } public virtual void Ve() { Console.WriteLine("Ve tai vi tri {0} {1} ", X, Y); } }

61

public class HinhTron : DoiTuongHinhHoc { float bk = 0; public HinhTron() { } public HinhTron(float x, float y, float r) : base(x, y) { bk = r; } public override void Ve() { base.Ve(); Console.WriteLine("Duong tron co ban kinh " + bk); } public override float TinhDienTich() { return (float)Math.PI * bk * bk; } } public class HinhVuong : DoiTuongHinhHoc { float canh = 0; public HinhVuong() { } public HinhVuong(float x, float y, float r) : base(x, y) { canh = r; } public override void Ve() { base.Ve(); Console.WriteLine("Hinh vuong co canh " + canh); } public override float TinhDienTich() { return canh * canh; } } class ViDu {

62

static void Main() { DoiTuongHinhHoc[] a = { new HinhTron(1, 1, 2), new HinhVuong(10, 10, 4), new DoiTuongHinhHoc(5, 5) }; float tongDT = 0; for (int i = 0; i < a.Length; i++) tongDT += a[i].TinhDienTich(); Console.WriteLine("Tong dien tich cac hinh la " + tongDT); for (int i = 0; i < a.Length; i++) a[i].Ve(); } } }

Phn bit gia t kha new v override Trong C#, quyt nh ca lp trnh vin nhm ghi mt phng thc o ca lp c bn c thc hin r rng qua t kha override. iu ny cho php chng ta to ra mt phin bn mi trong m chng ta. Nhng thay i trong m ca lp c s khng ph v nhng on m trong lp dn xut. Trong C# mt hm o lun c xem l gc ca cc hm o gi i. Tht vy, khi C# tm mt phng thc o, n khng tm kim trong phn cp k tha. Nu mt hm o c a vo trong lp DoiTuongHinhHoc, hnh vi thc thi ca lp HinhTron vn khng thay i. trnh vic khai bo phng thc o b chng cho, chng ta c th s dng t kha new ch ra khng c phng thc ghi ln phng thc o ca lp c s. Lp tru tng (abstract) Mi lp con ca DoiTuongHinhHoc nn thc thi phng php Ve() ca ring n, nhng cc lp dn xut khng bt buc thc hin iu ny trong on chng trnh trn. yu cu tt c cc lp dn xut thc thi mt phng php ca lp c s chng ta cn ch ra phng thc l tru tng (abstract). Phng thc c khai bo tru tng khng cn nh ngha hay khai bo ni dung thc thi ca n. N ch nhm to mt tn phng thc v nh du rng n phi c thc thi trong tt c cc lp dn xut t n. Chng ta dng t kha abstract nh ngha phng thc tru tng:
abstract public void Ve();

V d s dng phng php v lp tru tng


using System; using System.Text; namespace ConsoleApplication3 { public abstract class DoiTuongHinhHoc

63

{ public float X; public float Y; public DoiTuongHinhHoc() { } public DoiTuongHinhHoc(float x, float y) { this.X = x; this.Y = y; } public abstract float TinhDienTich(); public abstract void Ve(); } public class HinhTron : DoiTuongHinhHoc { float bk = 0; public HinhTron() { } public HinhTron(float x, float y, float r) : base(x, y) { bk = r; } public override void Ve() { Console.WriteLine("Duong tron co ban kinh " + bk); } public override float TinhDienTich() { return (float)Math.PI * bk * bk; } } public class HinhVuong : DoiTuongHinhHoc { float canh = 0; public HinhVuong() { } public HinhVuong(float x, float y, float r) : base(x, y) { canh = r; }

64

public override void Ve() { Console.WriteLine("Hinh vuong co canh " + canh); } public override float TinhDienTich() { return canh * canh; } } class ViDu { static void Main() { DoiTuongHinhHoc[] a = { new HinhTron(1, 1, 2), new HinhVuong(10, 10, 4), new HinhTron(5, 5,5) }; float tongDT = 0; for (int i = 0; i < a.Length; i++) tongDT += a[i].TinhDienTich(); Console.WriteLine("Tong dien tich cac hinh la " + tongDT); for (int i = 0; i < a.Length; i++) a[i].Ve(); } } }

Gii hn ca tru trng Mc d thit k tru tng Ve() bt buc tt c cc lp dn xut thc thi phng thc tru tng ca n. iu ny s gy kh khn nu lp dn xut t lp HinhTron khng mun thc thi phng thc Ve(); Lp Sealed Ngc li ca abstract l sealed. Dng t kha sealed, mt lp c th khng cho php cc lp khc dn xut t n. Gc ca tt c cc lp l Object Tt c cc lp trong C# u c dn xut t lp Object. Lp gc l lp trn nht trong cy phn cp k tha. Trong C#, lp gc l Object. Object cung cp mt s cc phng thc m cc lp con c th ghi . Chng gm cc phng thc sau: Phng thc Equal() ngha Kim tra hai i tng c tng ng nhau khng 65

GetHashCode() GetType() ToString() Finalize()

Cho php i tng cung cp hm Hash ring s dng trong kiu tp hp. Cung cp truy xut n kiu i tng. Cung cp chui biu din i tng. Xa i tng trong b nh.

MemberwiseClone() To copy ca i tng. V d sau minh ha s dng phng thc ToString() trong lp Object cng nh trong cc kiu d liu c bn k tha t Object:
using System; public class ViDu { public ViDu (int val) { giatri = val; } public override string ToString( ) { return giatri.ToString( ); } private int giatri; } public class KiemTra { static void Main( ) { int i = 5; Console.WriteLine("Gi tr ca bin i la: " + i)); ViDu s = new ViDu(7); Console.WriteLine("Gi tr ca bin s la } } " +s );

Trong trng hp trn hm ToString() ca i tng s v I s c gi t ng. 4. 5 Giao din C# h tr giao din (interface). Khi k tha t mt giao din, mt lp dn xut s phi thc thi tt c cc thnh vin trong giao din. Chng ta s minh ha v giao din thng qua vic gii thiu mt giao din c Microsoft nh ngha, System.IDisposable. IDisposable cha mt phng thc Dispose() dng xo m. 66

public interface IHinhHoc { float DienTich(); }

Trn v d trn ta thy vic khai bo mt giao din lm vic ging nh vic khai bo mt lp tru tng, nhng n khng cho php thc thi bt k mt thnh phn no ca giao din. Mt giao din ch c th cha nhng khai bo ca phng thc, thuc tnh, ch mc v s kin. Bn khng th khi to mt giao, n khng c phng thc to lp hay cc trng v n khng cho php cha cc phng thc ghi chng. N cng khng cho php khai bo nhng b t trn cc thnh phn trong khi nh ngha mt giao din. Cc thnh phn bn trong mt giao din lun lun l public v khng th khai bo virtual hay static. nh ngha v thc thi mt giao din Gi s chng ta vit m cho php cc my in ton chuyn khon qua li gia cc ti khon. C nhiu cng ty tham gia vo h thng ny ti khon v u ng vi nhau l phi thc thi mt giao din ITaiKhoan c cc phng thc np hay rt tin v thuc tnh tr v s ti khon. bt u, ta nh ngha giao din ITaiKhoan:
public interface ITaiKhoan { void GuiTien(decimal soLuong); bool RutTien(decimal soLuong); decimal SoTien { get; } }

Ch : Tn ca giao din thng phi c k t I ng u nhn bit l mt giao din. Khai bo lp TaiKhoanTietKiem k tha t ITaiKhoan
public class TaiKhoanTietKiem: ITaiKhoan { private decimal soTien; public void GuiTien (decimal soLuong) { soTien += soLuong; } public bool RutTien(decimal soLuong) { if (soTien >= soLuong) {

67

} Console.WriteLine("Rut tien bi loi. "); return false;

soTien -= soLuong; return true;

public decimal SoTien { get { return soTien; } } public override string ToString() { return String. Format("Tien tiet kiem: so tien = {0, 6:C}", soTien); } }

Trong v d trn chng ta duy tr mt trng private soTien v iu chnh s lng ny khi tin c np hay rt. Ch chng ta xut ra mt thng bo li khi thao tc rt tin khng thnh cng v thiu s tin trong ti khon. Xt dng lnh sau:
public class TaiKhoanTietKiem: ITaiKhoan

Chng ta khai bo lp TaiKhoanTietKiem k tha giao din ITaiKhoan. Ta cng c th khai bo mt lp k tha t mt lp no v t nhiu giao din theo c php nh sau nh sau:
public class Lp_Dn_Xut: Lp_C_S, IGiaoDien1, IGiaoDien12

Tha k t ITaiKhoan c ngha l TaiKhoanTietKiem ly tt c cc thnh phn ca ITaiKhoan nhng n khng th s dng cc phng thc nu n khng nh ngha li cc hnh ng ca tng phng thc. Nu b qun mt phng thc no th trnh bin dch s bo li. minh ha cho cc lp khc nhau c th thc thi cng mt giao din ta xt v d v mt lp khc l TaiKhoanVang.
public class TaiKhoanVang: ITaiKhoan { // vv }

Chng ta khng m t chi tit lp TaiKhoanVang bi v v c bn n ging ht lp TaiKhoanTietKiem. im nhn mnh y l TaiKhoanVang c th rt tin thm ch trong ti khon ca h khng cn tin. Chng ta c phng thc main(): 68

class ViDu { static void Main() { ITaiKhoan tk1 = new TaiKhoanTietKiem(); ITaiKhoan tk2 = new TaiKhoanVang(); tk1.GuiTien(200); tk1.RutTien(100); Console.WriteLine(tk1.ToString()); tk2. GuiTien(500); tk2. RutTien(600); tk2. RutTien(100); Console.WriteLine(tk2.ToString()); } }

Kt qu xut ra l:
Tien tiet kiem: so tien = 100. 00 Rut tien bi loi. Tien tiet kiem: so tien = 400. 00

Chng ta c th tr n bt k th hin ca bt k lp no thc thi cng mt giao din. Nhng chng ta ch c gi nhng phng thc l thnh phn ca giao din thng qua s tham kho n giao din ny. Nu mun gi nhng phng thc m khng l thnh phn trong giao din th ta phi tham kho n nhng kiu thch hp. Nh v d trn ta c th thc thi phng thc ToString() mc d n khng l thnh phn c khai bo trong giao din ITaiKhoan bi v n l thnh phn ca System.Object. Mt giao din c th tham kho n bt k lp no thc thi giao din . V d ta c mt mng kiu giao din no th cc phn t ca mng c th tham kho n bt k lp no thc thi giao din :
ITaiKhoan[] taiKhoan = new ITaiKhoan[2]; taiKhoan[0] = new TaiKhoanTietKiem(); taiKhoan[1] = new TaiKhoanVang();

Tha k giao din C# cho php mt giao din c th k tha cc giao din khc. Khi mt giao din k tha mt giao din khc th n c th cha tt c cc phng thc nh ngha trong giao din cha v nhng phng thc ca n nh ngha. V d ta to ra mt giao din mi k tha giao din ITaiKhoan:
public interface ITaiKhoanChuyenTien: ITaiKhoan {

69

bool ChuyenDen(ITaiKhoan dich, decimal soLuong); }

Nh vy giao din ITaiKhoanChuyenTien phi c tt c cc phng thc trong giao din ITaiKhoan v phng thc ChuyenDen. Chng ta s minh ho ITaiKhoanChuyenTien bng mt v d bn di v mt current account. Lp TaiKhoanHienThoi c nh ngha gn ging ht vi cc lp TaiKhoanTietKiem v TaiKhoanVang:
public class TaiKhoanHienThoi: ITaiKhoanChuyenTien { private decimal soTien; public void GuiTien(decimal soLuong) { soTien += soLuong; } public bool RutTien(decimal soLuong) { if (soTien >= soLuong) { soTien -= soLuong; return true; } Console.WriteLine("Rut tien loi. "); return false; } public decimal SoTien { get { return soTien; } } public bool ChuyenDen(ITaiKhoan dich, decimal soLuong) { bool kq; if ((kq = RutTien(soLuong)) == true) dich.GuiTien(soLuong); return kq; } public override string ToString() {

70

return String.Format("Tai khoan hien thoi: so tien = {0, 6:C}", soTien); } } static void Main() { ITaiKhoan tk1 = new TaiKhoanTietKiem(); ITaiKhoanChuyenTien tk2 = new TaiKhoanHienThoi(); tk1.GuiTien(200); tk2.GuiTien(500); tk2.ChuyenDen(tk1, 100); Console.WriteLine(tk1. ToString()); Console.WriteLine(tk2. ToString()); }

Khi thc thi on m trn bn s thy kt qu nh sau:


TaiKhoanHienThoi Tien tiet kiem: so tien = 300. 00 Tai khoan hien thoi: so tien = 400. 00

71

Chng 5: Ton t v chuyn kiu


Mc ch ca chng: S dng ton t trong cc biu thc, u tin thc hin cc php ton. nh ngha cc ton t trong lp. Chuyn i kiu tng minh v khng tng minh. 5. 1 Ton t Tm hiu ton t Chng ta dng ton t kt hp cc ton hng vi nhau trong mt biu thc. Mi ton t c ring ng ngha da trn kiu m chng lm vic. V d, ton t + ngha l cng i vi kiu d liu s nhng li l ni chui i vi kiu d liu string. Mi ton t c mt u tin khc nhau. V d ton t * c u tin cao hn ton t +. Mi ton t c mt kt hp vi n t tri qua phi hay t phi qua tri. V d, ton t = l kt hp phi (t phi qua tri) v a = b= c cng a = (b=c). Ton t mt ngi l ton t ch c mt ton hng. V d, ton t tng (++) l mt ton t mt ngi. Ton t nh phn l ton t c hai ton hng. V d ton t * l ton t nh phn. Rng buc ton t C# cho php bn np chng hu ht cc ton t hin ti theo kiu ring ca bn. Khi thc hin iu ny ton t ca bn thc thi theo cc lut sau: Bn khng th thay i u tin v s kt hp ca mt ton t. u tin v s kt hp da trn k hiu ton t (v d +), khng da trn kiu (v d int) m k hiu ton t ang c s dng. V vy, biu thc a + b * c th ging a + (b*c) khng lin quan n kiu a, b, c. Bn khng th thay i s s hng ca ton t. V d, * l ton t nh phn. Nu bn khai bo mt ton t * cho kiu ca bn, n phi l ton t nh phn. Bn khng th to k hiu ton t mi. V d, bn khng th to mt k hiu ton t mi nh l ** tnh m s ca mt s vi mt s khc. Bn phi to mt phng thc thc hin iu . Bn khng th thay i ngha ca cc ton t khi bn dng n cho cc kiu dng sn. V d, biu thc 1 + 2 c mt ngha nh ngha trc v bn khng c php ghi ngha ny. Nu bn lm iu ny, mi th tr nn phc tp. C mt s k hiu ton t m bn khng th qu ti. V d, bn khng th qu ti ton t . . 5. 2 Chuyn kiu an ton 72

Kiu ng hp(Boxing) v m hp (unboxing) ng hp v m hp l qu trnh x l cho php cc kiu gi tr c x l nh l kiu tham chiu. ng hp chnh l chuyn gi tr vo trong mt i tng v m hp tr v kiu gi tr ca i tng . l cch cho php chng ta gi phng thc ToString() trn s nguyn trong cc v d trn. ng hp l dng khng tng minh ng hp chuyn mt kiu gi tr n mt kiu Object khng tng minh. ng hp mt gi tr s thc hin cp pht mt th hin ca Object v chp gi tr vo trong th hin ca i tng mi nh trong hnh v sau:

V d minh ha:
using System; class DongHop { public static void Main( ) { int i = 123; object o =i; Console.WriteLine("Gia tri cua doi tuong la = {0}", o); } }

M hp tng minh ly gi tr t i tng, m hp tr v mt kiu gi tr, chng ta phi thc hin m hp r rng. Chng ta nn thc hin hai bc sau: m bo th hin ca i tng l mt gi tr c cng kiu vi kiu c a vo khi ng hp. Chp gi tr t th hin ca i tng n bin kiu gi tr. Minh ha nh trong hnh v sau:

73

thc hin c qu trnh m hp, i tng b m hp phi l mt tham chiu n i tng m chng c to bi ng. Minh ha m v ng hp nh sau:
using System; public class UnboxingTest { public static void Main( ) { int i = 123; //ng hp object o = i; // m hp phi c khai bo tng minh int j = (int) o; Console.WriteLine("j: {0}", j); } }

5. 3 Qu ti ton t Trong C#, ton t (operator) c nh ngha l mt phng thc tnh v phi tr v kt qu. Khi chng ta to mt ton t cho lp chng ta c th qu ti ton t tng t nh cch chng ta qu ti hm. V d, qu ti ton t cng chng ta c th vit nh sau:
public static PhanSo operator+(PhanSo lhs, PhanSo rhs)

Tham s u tin lhs l ton hng bn tri v tham s th hai rhs l ton hng bn phi. Dng t kha operator theo sau bi ton t ch qu ti ton t. Chng ta c th to cc ton t nh cc ton t logic, ton t tng ng (==). V d sau minh ha dng qu ti ton t cho ng dng xy dng kiu d liu phn s:
using System; namespace ConsoleApplication6. PhanSo1 {

74

public class PhanSo { public int tu; private int _mau; public int mau { get { return _mau; } set { if (value == 0) { Console.WriteLine("Mau so phai khac 0"); _mau = 1; } else _mau = value; } } //Cc phng thc to lp cho phn s public PhanSo() { } public PhanSo(int tu, int mau) { this.tu = tu; this.mau = mau; } public PhanSo(PhanSo a) { this.tu = a.tu; this.mau = a.mau; } //Cc phng thc nhp phn s public void Nhap() { //Nhp gi tr cho t Console.Ghi(" Nhap tu = ");

75

this.tu = int.Parse(Console.ReadLine()); //Nhp gi tr cho mu Console.Ghi(" Nhap mau = "); this.mau = int.Parse(Console.ReadLine()); } //Chuyn phn s thnh mt chui public override string ToString() { return tu + "/" + mau; } //Cng hai phn s public static PhanSo operator +(PhanSo a, PhanSo b) { PhanSo kq = new PhanSo(); kq.tu = a.tu * b.mau + a. mau * b.tu; kq.mau = a.mau * b mau; return kq. RutGon(); } //Cng phn s vi s x... . a/b = (a+x)/(b+x) public static PhanSo operator +(PhanSo a, int x) { PhanSo kq = new PhanSo(); kq.tu = a.tu + x; kq.mau = a.mau + x; return kq.RutGon(); } public static PhanSo operator -(PhanSo a, PhanSo b) { PhanSo kq = new PhanSo(); kq.tu = a.tu * b.mau - a.mau * b.tu; kq.mau = a.mau * b.mau; return kq. RutGon(); } public static PhanSo operator -(PhanSo a, int x) { PhanSo kq = new PhanSo(); kq.tu = a.tu - x; kq.mau = a.mau - x; return kq. RutGon(); }

76

public static PhanSo operator *(PhanSo a, PhanSo b) { PhanSo kq = new PhanSo(); kq.tu = a.tu * b.tu; kq.mau = a.mau * b.mau; return kq.RutGon(); } //nhn phn s a vi mt s nguyn x a/b * x = a/b*x public static PhanSo operator *(PhanSo a, int x) { PPhanSo tam = new PhanSo((PhanSo)x); return a * tam(); } public static PhanSo operator /(PhanSo a, PhanSo b) { return a * b.NghichDao(); } //chia phn s a vi mt s nguyn x a/b chia x = a/b*x public static PhanSo operator /(PhanSo a, int x) { PhanSo tam = new PhanSo((PhanSo)x); return a * tam.NghichDao(); } public static PhanSo operator ++(PhanSo a) { PhanSo kq = new PhanSo(); kq.tu = a. tu + 1; kq.mau = a. mau + 1; return kq.RutGon(); } public static PhanSo operator --(PhanSo a) { PhanSo kq = new PhanSo(); kq.tu = a.tu--; kq.mau = a.mau--; return kq; }

77

//Chuyn s nguyn thnh phn s public static implicit operator PhanSo(int a) { PhanSo kq = new PhanSo(); kq.tu = a; kq.mau = 1; return kq; } //Chuyn phn s thnh s thc public static explicit operator double(PhanSo a) { return ((double)a.tu / (double)a.mau); } public PhanSo RutGon() { int us = this.USCLN(); PhanSo tam = new PhanSo(); tam.tu = this.tu / us; tam.mau = this.mau / us; return tam; } private int USCLN() { int a, b; //Kim tra trng hp nu t v mu m a = tu > 0 ? tu: -tu; b = mau > 0 ? mau: -mau; while (a != b) { if (a > b) a = a - b; if (b > a) b = b - a; } return a; } public PhanSo NghichDao() { PhanSo kq = new PhanSo(); kq.tu = this.mau; kq.mau = this.tu; return kq;

78

} } } using System; namespace ConsoleApplication6.PhanSo1 { public class KiemTra { public KiemTra() { } public static void KiemTraPhuongThucCong() { PhanSo ps1 = new PhanSo(-16, 5); Console.WriteLine("Phan so thu nhat 1"+ ps1); PhanSo ps2 = new PhanSo(20, 2); Console.WriteLine("Phan so thu nhat 2 "+ ps2); Console.WriteLine("Cong phan so mot va hai } } } "+ (ps1 + ps2));

5. 4 Chuyn kiu do ngi dng nh ngha C php khai bo cho ton t ny tng t nh khai bo qu ti ton t. Ton t phi l public v static. y l mt ton t chuyn kiu cho php mt i tng Gio chuyn kiu khng tng minh thnh int:
struct Gio { public static implicit operator int (Gio tu) { return this.giatri; } private int giatri; }

Khi khai bo ton t chuyn kiu ring, chng ta phi ch ra ton t chuyn kiu tng minh hay khng tng minh bng cch dng t kha implicit v explicit. V d, ton t chuyn kiu Gio thnh int phn trn l khng tng minh, ngha l trnh bin dch C# c th s dng n khng tng minh:
class ViDu { public static void PhuongThuc(int ts) {... }

79

public static void Main() { Gio trua = new Gio(12); ViDu.PhuongThuc(trua); //chuyn kiu khng tng minh t Gio sang int } }

Nu ton t chuyn kiu c khai bo explicit, v d trc s gy ra li v chuyn kiu tng minh c yu cu:
ViDu.PhuongThuc(int)trua);// chuyn kiu tng minh t Gio sang int

Khi no bn nn khai bo ton t chuyn kiu tng minh hay khng tng minh? Nu chuyn kiu l an ton, khng gy mt thng tin, v khng th to ra ngoi l bn c th nh ngha n l chuyn kiu khng tng minh, ngc li nn khai bo chuyn kiu tng minh.

80

Chng 6: S y nhim, s kin v qun l li


Mc ch ca chng: Gi phng thc gn ging vi con tr hm trong C++. Khai bo v s dng s kin. C ch qun l li, by li trong chng trnh. 6. 1 S y nhim (delegate) Nhiu on m m chng ta vit trong cc bi tp trc c gi nh thc thi tun t. Nhng thnh thong bn thy cn thit ngt lung thc thi hin ti v thc hin cc nhim v quan trng hn. Lc nhim v hon thnh, chng trnh c th tip tc quay li ni n gi thc thi nhim v. iu khin cc ng dng dng ny, CLR phi cung cp 2 iu: mt phng tin ch ra c mt ci g khn cp xy ra v mt iu ch ra phng thc no nn chy khi n xy ra. y l mc ch ca y nhim v s kin (event). Khai bo v s dng delegate Mt delegate l mt con tr n mt phng thc. Mt delegate trng ging v c x nh phng thc lc n c gi. Tuy nhin, khi bn gi mt delegate, CLR thc thi phng thc m delegate tham chiu ti. Bn c th thay i tham chiu ca delegate mt cch t ng v vy m gi mt delegate chy cc phng thc khc nhau mi ln n thc thi. Khai bo delegate
delegate kiu_tr_v Tn(danh_sch_tham_s); S dng delegate using System; delegate void HamDeGoi(); class ViDu { public void PhuongThuc() { Console.WriteLine("Phuong thuc"); } public static void staticMethod() { Console.WriteLine("Phuong thuc tinh"); } }

81

class MainClass { static void Main() { ViDu t = new ViDu(); HamDeGoi hamDelegate; hamDelegate = t.PhuongThuc; hamDelegate += ViDu.staticMethod; hamDelegate += t.PhuongThuc; hamDelegate += ViDu.staticMethod; hamDelegate(); } }

S dng Delegate nh l con tr hm


using System; class MainClass { delegate int Hamdelegate(string s); static void Main(string[] args) { Hamdelegate del1 = new Hamdelegate(PhuongThuc); Hamdelegate del2 = new Hamdelegate(PhuongThuc2); string str = "Xin Chao"; del1(str); del2(str); } static int PhuongThuc(string s) { Console.WriteLine("Phuong Thuc"); return 0; } static int PhuongThuc2(string s) { Console.WriteLine("Phuong Thuc 2"); return 0; } }

6. 2 S kin (Event)

82

Mc d delegate cho php gi bt k s phng thc gin tip, nhng chng ta phi gi cc delegate tng minh. Trong nhiu trng hp, s rt hu ch nu delegate chy t ng khi c mt ci g c bit xy ra. Trong .Net cho php chng ta nh ngha v by cc hnh ng c bit v sp xp gi mt delegate qun l tnh hung. Nhiu lp trong .NET a ra s kin. Hu ht cc iu khin t trn form dng s kin cho php chy m chng trnh tng ng nh: khi ngi dng nhp chut no nt lnh hay nhp g trn mt trng. Bn c th nh ngha ring s kin. Khai bo s kin Bn khai bo mt s kin trong mt lp nhm n mt hnh ng l ngun ca s kin. Ngun s kin thng l mt lp quan st mi trng v pht trinh s kin khi c mt du hiu c bit xy ra. Mt s kin cha danh sch cc phng thc gi khi s kin c to. V s kin thng c dng vi delegate nn kiu ca s kin phi l delegate v bt u vi t kha event.
public delegate void BatCongTac(bool state); public class CongTac { public event BatCongTac OnBatCongTac;

Trong v d trn, s kin OnBatCongTac cung cp mt giao tip cho php theo gii trng thi ca cng tc thc hin thao tc tt m bng n tng ng. Mt s kin qun l ring cc delegate ca n v khng cn qun l th cng bin delegate. Gn mt s kin Ging delegate, s kin c th c gn vi ton t += .
c.OnBatCongTac += new BatCongTac(d.TrangThaiDen);

B gn s kin Bn c th dng ton t -= xa phng thc t tp hp delegate bn trong. To mt s kin Mt s kin c th c to ging delegate bng cch gi n nh l mt phng thc. Khi bn gi mt s kin, tt c cc delegate gn vi n c gi tun t. V d:
public class CongTac { public event BatCongTac OnBatCongTac; public bool state; public void KhiBatCongTac() { if(OnBatCongTac!=null) { OnBatCongTac(state);

83

state = state ? false: true; } } }

Kim tra null l cn thit v trng s kin ngm nh l null v n khc null khi ta thc hin gn mt phng thc dng ton t +=. Nu bn to mt s kin null, bn s c mt ngoi l NullReferenceException. Chng ta cng phi truyn cc tham s tng ng khi bn to s kin ng vi cc delegate nh ngha. V d s dng s kin v y nhim:
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace SuDungDelegate { public delegate void BatCongTac(bool state); public class CongTac { public event BatCongTac OnBatCongTac; public bool state; public void KhiBatCongTac() { OnBatCongTac(state); state = state ? false: true; } } public class BongDen { public void TrangThaiDen(bool state) { if (state) Console.WriteLine("Den Sang"); else Console.WriteLine("Den tat"); } } public class TV { public void TrangThaiTV(bool state) {

84

if (state) Console.WriteLine("Mo TV"); else Console.WriteLine("Tat tivi"); } } class Program { static CongTac c = new CongTac(); static BongDen d = new BongDen(); static TV t = new TV(); static void { c.OnBatCongTac += new BatCongTac(d.TrangThaiDen); c.OnBatCongTac += new BatCongTac(d.TrangThaiDen); c.KhiBatCongTac(); c.KhiBatCongTac(); } } } Main(string []args)

6. 3 Qun l li v bit l Khng g quan trng bng mt on m tt, chng trnh ca bn phi lun c kh nng x l nhng li c th xy ra. V d, trong mt quy trnh x l phc tp, mt on m no pht hin n khng c php c mt tp tin, hoc trong khi n ang gi yu cu n mng th mng rt. Trong nhng tnh hung ngoi l (exception) nh vy, khng c phng thc d ch n gin l tr v mt m li tng ng. C# c nhng k thut tt x l nhng loi tnh hung ny, bng c ch x l bit l (exception handling). Nhng lp bit l ca lp c s Trong C#, mt bit l l mt i tng c to ra (hoc c nm) khi mt trng thi li bit l c th xut hin. Nhng i tng ny cha ng nhng thng tin gip ch cho vic truy ngc li vn . Mc d chng ta c th t to ra nhng lp bit l ring, .NET cng cung cp cho chng ta nhiu lp bit l c nh ngha trc.

Nhng lp ngoi l c bn
Mt phn ca lp ngoi l nm trong IOexception v nhng lp dn xut t IOException. Mt phn nm trong System.IO n lin quan n vic c v vit d liu ln tp tin. Ni chung, khng c namspace c th cho bit l; nhng lp bit l nn c t trong lp ni m chng c th c sinh ra ngoi l, v l do nhng ngoi l c lin quan n IO th nm trong namspace System.IO, chng ta c th tm thy nhng lp bit l nm trong mt vi namspace lp c s. 85

Nhng lp ngoi l c c im chung l u dn xut t System.Exception. C 2 lp quan trng trong h thng cc lp c dn xut t System.Exception l: System.SystemException: s dng cho nhng bit l thng xuyn c pht sinh trong thi gian chy ca .NET, hoc l nhng li chung thng c sinh ra bi hu ht nhng ng dng. V d nh l StackOverflowException c pht sinh trong thi gian chy .NET nu n thm d thy Stack y. Chng ta c th chn kiu pht sinh ca ArgumentException, hoc l pht sinh t mt lp con ca n trong chng trnh. Nhng lp con ca System.SystemException c th trnh by nhng li nghim trng v khng nghim trng. System.ApplicationException : y l mt lp quan trng bi v n c dng cho cc lp bit l c nh ngha bi nhng hng th ba.Do , nu bn nh ngha bt k bit l no bao ph trng thi li ca ng dng, bn nn dn xut mt cch trc tip hay gin tip t System.ApplicationException. n bt bit l Gi s chng ta c nhng i tng bit l c gi tr, vy lm th no chng ta c th s dng chng trong on m by nhng trng thi li? c th gii quyt iu ny trong C# bn thng l phi chia chng trnh ca bn thnh nhng khi thuc 3 kiu khc nhau: Khi try cha ng on m m c dng l mt phn thao tc bnh thng trong chng trnh ca bn, nhng on m ny c th gp phi mt vi trng thi li nghim trng. Khi catch cha ng on m m gii quyt nhng trng thi li nghim trng trong on try. Khi finally cha ng on m m dn dp ti nguyn hoc lm bt k hnh ng no m bn thng mun lm xong vo cui khi try hay catch... iu quan trng phi hiu rng khi finally c thc thi d c hay khng c bt k bit l no c nm ra. Bi v mc tiu chnh ca khi finally l cha ng on m r rng m lun c thc thi, trnh bin dch s bo li nu bn t mt lnh return bn trong khi finally. C php C# c s dng th hin tt c iu ny c th nh sau:
try { // m cho vic thc thi bnh thng } catch { // x l li } finally { // dn dp }

C mt vi iu c th thay i trong c php trn: Ta c th b qua khi finally. 86

Ta c th cung cp nhiu khi catch m ta mun x l nhng kiu li khc nhau. Ta c th b qua khi catch, trong trng hp c php phc v khng xc nh bit l, nhng phi m bo rng m trong khi finally s c thc thi khi vic thc thi ri khi khi try. Nhng iu ny t ra mt cu hi: nu on m ang chy trong khi try, lm th no n bit chuyn n khi catch nu mt li xut hin? nu mt li c pht sinh, m chng trnh s nm ra mt bit l. Ni cch khc, n ch ra mt lp i tng bit l v nm n:
throw new OverflowException();

y chng ta c mt th hin ca i tng bit l ca lp OverflowException. Ngay khi my tnh gp mt cu lnh throw bn trong khi try, n ngay lp tc tm khi catch kt hp vi khi try, n xc nh khi catch ng bi vic kim tra lp bit l no m khi catch kt hp vi. V d, khi i tng OverflowException uc nm ra vic thc thi s nhy vo khi catch sau:
catch (OverflowException e) { }

Ni cch khc, my tnh s tm khi catch m ch nh mt th hin lp bit l ph hp trong cng mt mt lp (hoc ca lp c s). Gi s, lc xem xt i s, c 2 li nghim trng c th xy ra trong n: li trn v mng ngoi bin. Gi s rng on m ca chng ta cha ng hai bin lun l. Overflow v OutOfBounds, m ch nh liu trng thi li ny c tn ti khng. Chng ta thy lp bit l nh ngha trc y tn ti ch nh trn (OverflowException); tng t mt lp IndexOutOfRangeException tn ti x l mng ngoi bin. By gi hy nhn vo khi try sau:
try { // m cho thc thi bnh thng if (Overflow == true) throw new OverflowException(); // x l nhiu hn if (OutOfBounds == true) throw new IndexOutOfRangeException(); // hoc tip tc x l bnh thng } catch (OverflowException e) { // x l li cho trng thi li trn } catch (IndexOutOfRangeException e) { // x l li cho trng thi li ch mc nm ngoi vng } finally { // dn dp }

87

Thc thi nhiu khi catch Xem v d sau, n lp li vic hi ngi s dng nhp vo mt s v xut gi tr ca n. Tuy nhin v mc ch ca v d, chng ta s yu cu s cn nhp phi trong khong t 0 n 5 hoc l chng trnh s khng th x l s mt cch chnh xc. Do chng ta s nm ra mt bit l nu ngi s dng nhp mt th g ngoi vng ny. Chng trnh s tip tc hi s cho n khi ngi s dng nhn enter m khng g bt k phm g khc.
using System; public class ViDu { public static void Main() { string str; while ( true ) { try { Console.Write("Nhap so tu 1 den 5" + "(hay nhn enter de thoat)> "); str = Console.ReadLine(); if (str == "") break; int index = Convert.ToInt32(str); if (index < 0 || index > 5) throw new IndexOutOfRangeException( "Ban nhap " + str); Console.WriteLine("So vua nhap la " + index); } catch (IndexOutOfRangeException e) { Console.WriteLine("Exception: " + "Nen nhap so giua 0 va 5. " + e.Message); } catch (Exception e) { Console.WriteLine( "Ngoai le duoc nem ra la: " + e.Message); } catch { Console.WriteLine("Mot so biet le khac xuat hien"); } finally { Console.WriteLine("Cam on"); } } } }

88

Chapter 7: Qun l b nh v con tr


Mc ch ca chng: Tm hiu v heap v stack v cch thc lu tr cc bin tham tr v tham chiu Khai bo cc khi m khng an ton truy xut b nh trc tip. C ch t chc v hot ng ca c ch thu gom rc trong .Net. 7. 1 Qun l b nh Mt trong nhng u im ca C# l chng ta khng cn quan tm v vic qun l b nh bn di v iu ny c b gom rc (garbage collector ) ca C# lm ri. Mc d vy nu ta mun vit cc on m tt, c hiu sut cao, ta cn tm hiu v cch qun l b nh bn di. Gi tr cc kiu d liu Windows dng h thng a ch o (virtual addressing) nh x t a ch b nh n v tr thc s trong b nh vt l hoc trn a c qun l pha sau Windows. Kt qu l mi ng dng trn nn x l 32-bit thy c 4GB b nh, khng cn bit b nh vt l thc s c kch thc bao nhiu (nn x l 64 bit th b nh ny ln hn) 4GB b nh ny c gi l khng gian a ch o ( virtual address space ) hay b nh o ( virtual memory). n gin ta gi n l b nh mi vng nh t 4GB ny c nh s t 0. Nu ta mun ch nh mt gi tr lu tr trn 1 phn c th trong b nh, ta cn cung cp s i din cho vng nh ny. Trong ngn ng cp cao nh l C#, VB, C++, Java mt trong nhng cch m trnh bin dch lm l chuyn i tn c c (v d tn bin ) thnh a ch vng nh m b x l hiu. 4GB b nh ny thc s cha tt c cc phn ca chng trnh bao gm m thc thi v ni dung ca bin c dng khi chng trnh chy. Bt k th vin lin kt ng (DLL-Dynamic Link Library) c gi s nm trong cng khng gian a ch ny, mi mc ca m hoc d liu s c vng nh ngha ring. Stack l mt vng nh ni gi tr kiu d liu c lu. Khi ta gi phng thc, stack cng c dng sao chp cc tham s c truyn. Cc kiu d liu tham chiu Chng ta c th dng mt s phng thc cp pht vng nh lu tr d liu, v gi cho d liu cn nguyn gi tr ngay c khi phng thc kt thc. iu ny c th lm vi kiu tham chiu. Xt on m sau:
void ThucHien() { KhachHang kh; kh = new KhachHang(); KhachHang m = new KhachHang60();

89

trong on m ny ta gi s gm 2 lp KhachHang v KhachHang60. Ta khai bo mt tham chiu gi l kh, c cp pht trong Stack nhng nn nh rng y l mt tham chiu, khng phi l mt th hin KhachHang. Khng gian m tham chiu kh chim l 4 byte. Ta cn 4 byte c th lu mt s nguyn gi tr t 0 n 4GB sau ta c dng:
kh = new KhachHang();

Dng ny u tin cp pht vng nh trong heap lu tr mt th hin ca KhachHang. Sau n t bin kh lu a ch ca vng nh c cp pht, ng thi n cng gi phng thc to lp KhachHang() khi to mt th hin lp. Th hin ca KhachHang khng t trong stack m s t trong heap. Ta khng bit chnh xc mt th hin KhachHang chim bao nhiu byte, ta xem n l 32 byte. 32 byte ny cha cc trng th hin ca KhachHang cng vi thng tin m .NET dng xc nh danh tnh v qun l cc th hin lp ca n. .NET tm trong heap khi 32 byte cn trng, gi s nm a ch 200000, v tham chiu kh nm v tr 799996799999 trn stack. Khng nh stack, b nh trong heap c cp pht theo chiu t di ln, v th khng gian trng c tm thy pha trn khng gian dng. Dng k tip thc hin tng t, ngoi tr khng gian trn stack cho tham chiu m cn c cp pht vo cng lc cp pht cho m trn heap:
KhachHang m = new KhachHang60();

4 byte c cp pht trn stack cho tham chiu m lu a ch 799992-799995. Trong khi th hin m s c cp pht t v tr 200032 i ln trn heap. .NET runtime s cn duy tr thng tin v trng thi ca heap, thng tin ny cng cn c cp nht khi d liu mi c thm vo heap. minh ha iu ny, ta hy xem iu g xy ra khi ta thot phng thc v tham chiu kh v m nm ngoi phm vi. Theo cch lm vic bnh thng th con tr stack s c tng nhng bin ny khng cn tn ti na. Tuy nhin cc bin ny ch lu a ch, khng phi th hin lp, d liu ca n vn nm trong heap. Ta c th thit lp cc bin tham chiu khc nhau tr n cng mt i tng- ngha l nhng i tng s c gi tr sau khi tham chiu kh v m nm ngoi phm vi v s khc bit quan trng gia stack v heap: i tng c cp pht lin tip trn heap, thi gian sng khng lng nhau. Khi ta gii thch cch hot ng trn heap, ta nhn mnh rng ch stack mi c kh nng lng thi gian sng ca cc bin. Vy khi thi gian sng ca cc tham chiu nm ngoi phm vi th heap lm vic nh th no trn cc bin ny? Cu tr li l b thu gom rc s lm iu ny. Khi b gom rc chy, n s g b tt c nhng i tng t heap m khng cn tham chiu na. Ngay sau khi n lm iu ny, heap s c cc i tng ri rc trn n, nm ln vi cc khong trng. B gom rc khng heap trong tnh trng ny, ngay khi n gii phng tt c cc i tng c th, n s di chuyn tt c chng tr v cui ca heap thnh mt khi lin tc li. Tt nhin khi nhng i tng ny c di chuyn tt c cc tham chiu ca n u c cp nht li. 7. 2 Gii phng ti nguyn 90

Chu k sng v thi gian ca mt i tng iu g xy ra khi bn to v hy mt i tng. Bn to i tng nh sau:


SinhVien a = new SinhVien(); // a l kiu tham chiu

Tin trnh to mt i tng gm hai giai on. u tin, hot ng new cp pht b nh th t heap. Bn khng th iu khin giai on ny khi i tng c to. Th hai, hot ng new chuyn b nh th vo trong mt i tng; n phi khi to i tng. Bn c th iu khin giai on ny dng phng thc to lp. Khi bn to i tng, bn c th truy xut thnh vin ca n dng ton t . . V d:
a.Ten = "Nguyen Van A";

Bn c th khai bo bin tham chiu n cng i tng:


SinhVien ref = a;

Bn c th to bao nhiu tham chiu n i tng cng c. CLR s theo di tt c nhng tham chiu ny. Nu bin a bin mt (ngoi phm v), nhng bin khc (nh l ref) vn tn ti. V vy thi gian sng ca mt i tng khng b rng buc vo mt bin tham chiu c th. Mt i tng ch c th b hy khi tt c cc tham chiu n n bin mt. Tng t nh to, hy i tng cng gm 2 giai on. u tin, bn phi thc hin mt s dn dp c vit trong phng thc hy. Th hai, b nh th c tr li cho heap, bn khng th kim sot giai on ny. Qu trnh hy mt i tng v tr b nh li heap c bit l c ch thu dn (garbage collection). Vit phng thc hy Bn c th s dng mt phng thc hy thc hin vic dn dp khi i tng cn c gom rc. Bn vit du ~ theo sau bi tn lp. Trong v d sau m s th hin ca lp bng cch tng bin tnh count trong phng thc to lp v gim bin ny trong phng thc hy:
class ViDu { public ViDu() { this.soTheHien++; } ~ViDu() { this.soTheHien--; } public static int SoTheHien()

91

{ return this.soTheHien; } ... private static int soTheHien = 0; }

Mt s hn ch khi s dng phng thc to lp: Bn khng th khai bo mt phng thc hy trong cu trc v cu trc l mt kiu gi tr lu trn stack khng phi trn heap nn khng cn s dng c ch thu dn:
struct ViDu { ~ViDu() {... } // li bin dch }

Bn khng th khai bo ch nh truy xut (nh l public) cho phng thc hy bi v bn khng th gi phng thc hy, n c gi bi c ch thu dn. public ~ViDu() {... } // li bin dch Bn khng c khai bo phng thc hy vi tham s.
~ViDu(int parameter) {... } //li bin dch

Trnh bin dch t ng dch phng thc hy thnh phng thc Object.Finalize.
class ViDu { ~ViDu() {... } }

Dch thnh:
class ViDu { protected override void Finalize() { try {... } finally { base.Finalize(); } } }

Ti sao s dng c ch thu dn Trong C#, bn khng th ch ng hy i tng, l do ti sao cc nh thit k C# cm bn thc hin iu ny: Bn qun xa i tng, iu ny c ngha l phng thc hy khng c chy v b nh s khng c thu hi li cho heap v bn c th nhanh chng cn kit b nh. 92

Khi bn ang c xa mt i tng ang hot ng. Nh rng i tng l kiu tham chiu. Nu mt lp gi mt tham chiu n mt i tng b hy. N c th tham chiu i tng khng s dng hay tham chiu n mt i tng hon ton khc trong cng vng nh. Bn mun xa cng i tng nhiu ln. iu ny c th rt tai hi da trn m trong phng thc hy. C ch thu dn c nhim v hy i tng cho bn v n m bo cc vn sau: Mi i tng s b hy v khi chng trnh kt thc tt c cc i tng ang tn ti s b hy. Mi i tng chnh xc b hy mt ln. Mi i tng b hy khi khng cn tham chiu n n. Nhng m bo ny rt hu ch v tin li cho cc lp trnh vin, bn ch tp trung vo phn logic ca chng trnh. Mt c trng quan trng na ca c ch thu dn l phng thc hy s khng chy cho ti khi i tng l rc cn c thu dn. Nu bn vit mt phng thc to lp, bn s bit n s chy nhng khng bit lc no chy? Cch thc lm vic ca c ch thu dn C ch thu dn chy trn mt tin trnh ring ca n v ch chy mt thi gian no (thng thng khi ng dng chy n cui phng thc). Khi n chy, cc tin trnh khc ang chy trong ng dng ca bn s tm thi treo, bi v c ch thu dn cn di chuyn cc i tng v cp nht cc tham chiu n cc i tng. C ch thu dn thc hin cc bc sau: 1. Xy dng mt bn ca tt c cc i tng c th n c. C ch thu dn xy dng bn ny rt cn thn v trnh tham chiu vng gy ra lp v hn. Bt k i tng no khng c trong bn ny c xem l khng n c. 2. N kim tra cc i tng khng th n c phng thc hy cn chy hay khng. Nu c n a vo trong mt hng i c bit gi l F-reachable. 3. N thu hi cc i tng khng th n cn li, bng cch di chuyn cc i tng xung di heap. V vy s phn mnh v gii phng b nh u heap. Khi c ch thu dn di chuyn mt i tng, n cng cp nht tt c tham chiu n i tng ny. 4. thi im ny, n cho php cc tin trnh khc chy li. 5. N thu hi cc i tng trong F-reachable trong mt tin trnh c lp. 7. 3 M khng an ton C nhng trng hp ta cn truy xut b nh trc tip nh khi ta mun truy xut vo cc hm bn ngoi (khng thuc .NET) hay tham s yu cu truyn vo l con tr, hoc l v ta mun truy nhp vo ni dung b nh sa li. Trong phn ny ta s xem xt cch C# p ng nhng iu ny nh th no. Con tr 93

Con tr n gin l mt bin lu a ch nh l mt tham chiu. S khc bit l c php C# trong tham chiu khng cho php ta truy xut vo a ch b nh. u im ca con tr: Ci thin s thc thi: cho ta bit nhng g ta ang lm, m bo rng d liu c truy xut hay thao tc theo cch hiu qu nht - l l do m C v C++ cho php dung con tr trong ngn ng ca mnh. Kh nng tng thch ngc: i khi ta phi s dng li cc hm API cho mc ch ca ta. M cc hm API c vit bng C, ngn ng dng con tr rt nhiu, ngha l nhiu hm ly con tr nh tham s. Hoc l cc DLL do mt hng no cung cp cha cc hm ly con tr lm tham s. Trong nhiu trng hp ta c th vit cc khai bo DLlImport theo cch trnh s dng con tr, v d nh dng lp System.IntPtr. Ta c th cn to ra cc a ch vng nh c gi tr cho ngi dng - v d nu ta mun pht trin mt ng dng m cho php ngi dng tng tc trc tip n b nh, nh l mt debugger. Nhc im: C php ly cc hm phc tp hn. Con tr kh s dng. Nu khng cn thn ta c th vit ln cc bin khc, lm trn stack, mt thng tin, ng ... C# c th t chi thc thi nhng on m khng an ton ny (on m c s dng con tr) Ta c th nh du on m c s dng con tr bng cch dng t kho unsafe V d: dng cho hm
unsafe int PhuongThuc() { // m c th s dng con tr } Dng cho lp { // bt k phng thc no trong lp cng c th dng con tr } Dng cho mt trng class ViDu { unsafe int *pX; } //khai bo mt trng con tr trong lp hay struct unsafe class ViDu

Hoc mt khi m 94

void PhuongThuc() { // m khng s dng con tr unsafe { // M s dng con tr } // M khng s dng con tr }

Tuy nhin ta khng th nh du mt bin cc b l unsafe


int PhuongThuc() { unsafe int *pX; } // Sai

bin dch cc m cha khi unsafe ta dng lnh sau:


csc /unsafe Nguon.cs

hay
csc -unsafe Nguon.cs

C php con tr
int * pWidth, pHeight; double *pResult;

Lu khc vi C++, k t * kt hp vi kiu hn l kt hp vi bin - ngha l khi ta khai bo nh trn th pWidth v pHeight u l con tr do c * sau kiu int, khc vi C++ ta phi khai bo * cho c hai bin trn th c hai mi l con tr.
Cch dng * v & ging nh trong C++:

&: ly a ch * : ly ni dung ca a ch p kiu con tr thnh kiu int V con tr l mt s int lu a ch nn ta c th chuyn tng minh con tr thnh kiu int hay ngc li. V d:
int x = 10; int *pX, pY; pX = &x; pY = pX; *pY = 20; uint y = (uint)pX; int *pD = (int*)y;

95

Mt l do ta phi p kiu l Console.WriteLine khng c np chg hm no nhn thng s l con tr do ta phi p n sang kiu s nguyn int
Console.WriteLine("Dia chi la " + pX); // sai // Li bin dch Console.WriteLine("Dia chi la " + (uint) pX); // ng

p kiu gia nhng kiu con tr Ta cng c th chuyn i tng minh gia cc con tr tr n mt kiu khc v d:
byte aByte = 8; byte *pByte= &aByte; double *pDouble = (double*)pByte;

void Pointers Nu ta mun gi mt con tr, nhng khng mun c t kiu cho con tr ta c th khai bo con tr l void:
void *pointerToVoid; pointerToVoid = (void*)pointerToInt;

mc ch l khi ta cn gi cc hm API m i hi thng s void*. Ton t sizeof Ly thng s l tn ca kiu v tr v s byte ca kiu v d:
int x = sizeof(double);

x c gi tr l 8 Bng kch thc kiu: sizeof(sbyte) = 1; sizeof(short) = 2; sizeof(int) = 4; sizeof(long) = 8; sizeof(char) = 2; sizeof(double) = 8; sizeof(byte) = 1; sizeof(ushort) = 2; sizeof(uint) = 4; sizeof(ulong) = 8; sizeof(float) = 4; sizeof(bool) = 1;

Ta cng c th dng sizeof cho struct nhng khng dng c cho lp.

96

Chng 8: Chui, biu thc quy tc v tp hp


Mc ch ca chng: S dng b th vin thao tc trn chui. S dng biu thc quy tc trong vic kim tra hp l d liu. Lm vic vi cc cu trc d liu ng nh ArrayList, HashTable 8. 1 System.String Trc khi kim tra cc lp chui khc, ta s xem li nhanh nhng phng thc trong lp chui. System.String l lp c thit k lu tr chui, bao gm mt s ln cc thao tc trn chui. Khng ch th m cn bi v tm quan trng ca kiu d liu ny, C# c t kho ring cho n v kt hp vi c php to nn cch d dng trong thao tc chui. Ta c th ni chui:
string message1 = "Hello"; message1 += ", There"; string message2 = message1 + "!"; Trch 1 phn chui dng ch mc: char char4 = message[4]; // tr v 'a'. lu rng k t bt u tnh t ch mc 0 cc phng thc khc ( s lc):

Phng thc Compare CompareOrdinal Format IndexOf IndexOfAny LastIndexOf

Mc ch so snh ni dung ca 2 chui ging compare nhng khng k n ngn ng bn a hoc vn ho nh dng mt chui cha mt gi tr khc v ch nh cch mi gi tr nn c nh dng. v tr xut hin u tin ca mt chui con hoc k t trong chui v tr xut hin u tin ca bt k mt hoc mt tp k t trong chui ging indexof, nhng tm ln xut hin cui cng

LastIndexOfAny ging indexofAny, nhng tm ln xut hin cui cng PadLeft canh phi chui, in chui bng cch thm mt k t c ch nh lp li vo u chui 97

PadRigth Replace Split Substring ToLower ToUpper Trim Xy dng chui

canh tri chui, in chui bng cch thm mt k t c ch nh lp li vo cui chui thay th k t hay chui con trong chui vi mt k t hoc chui con khc chia chui thnh 1 mng chui con, ngt bi s xut hin ca mt k t no tr v chui con bt u mt v tr ch nh trong chui. chuyn chui thnh ch thung chuyn chui thnh ch in b khong trng u v cui chui

Chui l mt lp mnh vi nhiu phng thc hu ch. Tuy nhin, n thc s l kiu d liu c nh, ngha l mi ln ta khi ng mt i tng chui, th i tng chui khng bao gi c thay i. Nhng phng thc hoc ton t m cp nht ni dung ca chui thc s l to ra mt chui mi, sao chp chui c vo nu cn thit. V d:
string str = "Lap trinh huong doi tuong."; str += "Ngon ngu C#";

u tin lp System.String c to v khi to gi tr "Lap trinh huong doi tuong." . Trong thi gian thc thi .NET s nh v b nh trong chui cha on k t ny v to ra mt bin str chuyn n mt th hin chui. dng tip theo, khi ta thm k t vo, ta s to ra mt chui mi vi kch thc lu tr c hai on; on gc " Lap trinh huong doi tuong.", s c sao chp vo chui mi vi on b sung " Ngon ngu C#". Sau a ch trong bin str c cp nht, v vy bin s tr ng n i tng chui mi. Chui c khng cn c tham chiu, khng c bin no truy cp vo n, v v vy n s c b thu gom rc g b. 8. 2 Biu thc quy tc Ngn ng biu thc chnh quy l ngn ng c thit k c bit cho vic x l chui, cha ng 2 c tnh: Mt tp m escape cho vic xc nh kiu ca cc k t. Ta quen vi vic dng k t * trnh by chui con bt k trong biu thc DOS. Biu thc chnh quy dng nhiu chui nh th trnh by cc mc nh l 'bt k mt k t', 'mt t ngt ', 'mt k t tu chn', ... 98

Mt h thng cho vic nhm nhng phn chui con, v tr v kt qu trong sut thao tc tm. Dng biu thc chnh quy, c th biu din nhng thao tc cp cao v phc tp trn chui. Mc d c th s dng cc phng thc System.String v System.Text.StringBuilder lm cc vic trn nhng nu dng biu thc chnh quy th m c th c gim xung cn vi dng. Ta khi to mt i tng System.Text.RegularExpressions. RegEx, truyn vo n chui c x l, v mt biu thc chnh quy (mt chui cha ng cc lnh trong ngn ng biu thc chnh quy ). Mt chui biu thc chnh quy nhn ging mt chui bnh thng nhng c thm mt s chui hoc k t khc lm cho n c ngha c bit hn. V d chui \b ch nh vic bt u hay kt thc mt t, v th nu ta mun ch nh tm k t th bt u mt t, ta c th tm theo biu thc chnh quy \bth. Nu mun tm tt c s xut hin ca th cui t ta vit th\b. Tuy nhin, biu thc chnh quy c th phc tp hn th, v d iu kin lu tr phn k t m tm thy bi thao tc tm kim. Bng sau th hin mt s k t hoc chui escape m ta c th dng ngha ^ $ . * + ? \s Bt u ca chui nhp Kt thc ca chui nhp Bt k k t no ngoi tr k t xung dng(\n) K t trc c th c lp li 0 hoc nhiu ln K t trc c th c lp li mt hoc nhiu ln K t trc c th c lp li 0 hoc mt ln Bt k k t khong trng V d ^B X$ i. ation ra*t ra+t ra?t \sa Cc mu s so khp B, nhng ch nu k t u tin trong chui X, nhng ch nu k t cui cng trong chui isation, ization rt, rat, raat, raaat, rat, raat, raaat , (nhng khng rt) Ch rt v rat [space]a, \ta, \na (\t v \n c ngha ging nh trong C#) aF, rF, cF, nhng khng \tf Bt k t kt thc vi ion bt k k t X gia ca mt t

\S \b \B

Bt k k t no khng phi l khong trng T bin bt k v tr no khng phi l t bin

\SF ion\b \BX\B

V d chng trnh sau dng biu thc quy tc kim tra mt chui c phi l a ch email hay khng?
using System; using System.Text.RegularExpressions;

99

public class MainClass{ public static void Main(){ Regex r = new Regex(@"\w+@(\w+\.)+\w+"); Console.WriteLine(r.IsMatch("j@by.com")); Console.WriteLine(r.IsMatch("jn@b.com")); Console.WriteLine(r.IsMatch("o47@l.com")); Console.WriteLine(r.IsMatch("oop.com")); } }

8. 3 Nhm cc i tng Array List ArrayList ging nh mng, ngoi tr n c kh nng m rng, c i din bi lp System.Collection.ArrayList. ArrayList cp vng nh lu tr mt s cc tham chiu i tng. Ta c th thao tc trn nhng tham chiu i tng ny. Nu ta th thm mt i tng n ArrayList hn dung lng cho php ca n, th n s t ng tng dung lng bng cch cp pht thm vng nh mi ln gi gp 2 ln s phn t ca dung lng hin thi. Ta c th khi to mt danh sch bng cch ch nh dung lng ta mun. V d, ta to ra mt danh sch SinhVien:
ArrayList a = new ArrayList(20);

Nu ta khng ch nh kch c ban u, mc nh s l 16:


ArrayList a = new ArrayList(); // kch c l 16

Ta c th thm phn t bng cch dng phng thc Add():


a.Add(new SinhVien()); a.Add(new SinhVien());

ArrayList xem tt c cc phn t ca n nh l cc tham chiu i tng. Ngha l ta c th lu tr bt k i tng no m ta mun vo trong mt ArrayList. Nhng khi truy nhp n i tng, ta s cn p kiu chng tr li kiu d liu tng ng:
SinhVien x = (SinhVien)a[1];

V d ny cng ch ra ArrayList nh ngha mt ch mc, ta c th truy nhp nhng phn t ca n vi cu trc nh mng. Ta cng c th chn cc phn t vo ArrayList:
a.Insert(1, new SinhVien()); // chn vo v tr 1

y l mt phng thc np chng, v vy rt c ch khi ta mun chn tt c cc phn t trong mt tp hp vo ArrayList. Ta c th b mt phn t:
a.RemoveAt(1); // b i tng v tr 1

100

Lu rng vic thm v b mt phn t s lm cho tt c cc phn t theo sau phi b thay i tng ng trong b nh, thm ch nu cn th c th ti nh v ton b ArrayList . Ta c th cp nht hoc c dung lng qua thuc tnh:
a.Capacity = 30;

Tuy nhin vic thay i dung lng s lm cho ton b ArrayList c ti nh v n mt khi b nh mi vi dung lng c yu cu. bit s phn t thc s trong ArrayList ta dng thuc tnh Count:
int num = a.Count;

Mt ArrayList c th thc s hu ch nu ta cn xy dng mt mng i tng m ta khng bit kch c ca mng s l bao nhiu. Trong trng hp , ta c th xy dng ' mng' trong ArrayList, sau sao chp ArrayList tr li mng khi ta hon thnh xong.V d nu mng c xem l mt tham s ca phng thc, ta ch phi sao chp tham chiu ch khng phi i tng:
SinhVien [] ds = new SinhVien[a.Count]; for (int i=0 ; i< a.Count ; i++) ds[i] = (SinhVien)a[i];

Tp hp (Collection) tng ca Collection l n trnh by mt tp cc i tng m ta c th truy xut bng vic lp qua tng phn t. C th l mt tp i tng m ta c th truy nhp s dng vng lp foreach. V d:
foreach (SinhVien v in a) { //Thc hin thao tc no cho SinhVien v }

Ta xem bin a l mt tp hp, kh nng dng vng lp foreach l mc ch chnh ca collection. Collection l g ? Mt i tng l mt collection nu n c th cung cp mt tham chiu n mt i tng c lin quan, c bit n nh l enumarator, m c th duyt qua tng mc trong collection. c bit hn, mt collection phi thc thi mt interface System.Collections.IEnumerable. IEnumerable nh ngha ch mt phng thc nh sau:
interface IEnumerable { IEnumerator GetEnumerator(); }

Mc ch ca GetEnumarator() l tr v i tung enumarator. Khi ta tp hp nhng on m trn i tng enumarator c mong i thc thi mt interface, System.Collections. IEnumerator. Ngoi ra cn c mt interface khc, ICollection, c dn xut t IEnumerable. Nhng collection phc tp hn s thc thi interface ny. Bn cnh GetEnumerator(), 101

n thc thi mt thuc tnh tr v trc tip s phn t trong collection. N cng h tr vic sao chp mt collection n mt mng v cung cp thng tin c t nu l mt lung an ton. IEnumarator c cu trc sau:
interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); }

IEnumarator lm vic nh sau: i tung thc thi nn c kt hp vi mt collection c th. Khi i tng ny c khi ng ln u tin, n cha tr n bt k mt phn t no trong collection, v ta phi gi MoveNext() n chuyn n phn t u tin trong collection. Ta c th nhn phn t ny vi thuc tnh Current. Current tr v mt tham chiu i tng, v th ta s p kiu n v kiu i tng m ta mun tm trong Collection. Ta c th lm bt c iu g ta mun vi i tng sau di chuyn n mc tip theo trong collection bng cch gi MoveNext() ln na. Ta lp li cho n khi ht cc mc trong collection- khi current tr v null. Nu mun ta c th quay tr v v tr u trong collection bng cch gi Reset(). Lu rng Reset() thc s tr v trc khi bt u collection, v th nu mun di chuyn n phn t u tin ta phi gi MoveNext(). Mt collection l mt kiu c bn ca nhm i tng. Bi v n khng cho php ta thm hoc b mc trong nhm. Tt c ta c th lm l nhn cc mc theo mt th t c quyt nh bi collection v kim tra chng. Thm ch, ta khng th thay th hoc cp nht mc v thuc tnh current l ch c. Hu nh cch dng thng nht ca collection l cho ta s thun tin trong c php ca lp foreach. Mng cng l mt collection, nhng lnh foreach s dng trong collection lm vic tt hn trn mng. Ta c th xem vng lp foreach trong C# l c php ngn trong vic vit:
{ IEnumerator enumerator = a.GetEnumerator(); SinhVien v; enumerator.MoveNext(); while ( (v = (SinhVien)enumerator.Current) != null) { //Thao tac sinh vien v } enumerator.MoveNext();

Mt kha cnh quan trng ca collection l b m c tr v nh l mt i tng ring bit. L do l cho php kh nng c nhiu hn mt b m c th p dng ng thi trong cng collection. T in (Dictionary) T in trnh by mt cu trc d liu rt phc tp m cho php ta truy nhp vo cc phn t da trn mt kho no , m c th l kiu d liu bt k. Ta hay gi l bng nh x hay bng bm. T in c dng khi ta mun lu tr d liu nh mng nhng mun dng mt kiu d liu no thay cho kiu d liu s lm ch mc. N cng 102

cho php ta thm hoc b cc mc, hi ging danh sch mng tuy nhin n khng phi dch chuyn cc mc pha sau trong b nh. Ta c th dng kiu d liu bt k lm ch mc, lc ny ta gi n l kho ch khng phi l ch mc na. Khi ta cung cp mt kho truy nhp vo mt phn t, n s x l trn gi tr ca kho v tr v mt s nguyn tu thuc vo kho, v c dng truy nhp vo 'mng' ly d liu.

103

Chng 9: Reflection
Mc ch ca chng: S dng siu d liu ca .Net. Vai tr ca thuc tnh trong qu trnh xy dng ng dng. S dng thuc tnh trong qu trnh pht trin. S dng reflection ly tt c thng tin v lp. 9. 1 Thuc tnh (attribute) ty chn Vit thuc tnh tu chn hiu cch vit thuc tnh ty chn, ta cn xem trnh bin dch lm g khi n gp mt mc trong m c nh du vi mt attribute. Gi s ta c thuc tnh khai bo nh sau:
[TenTruong("SoCMND")] public string SoCMND { get { // vv...

Nh ta thy thuc tnh SoCMND c mt thuc tnh TenTruong, trnh bin dch s ni chui attribute vi tn ny thnh TenTruongAttribute, sau tm trong tt c cc namespace lp c tn ny. Tuy nhin nu ta nh du mt mc vi mt thuc tnh m tn ca n c phn cui l attribute th trnh bin dch s khng thm chui attribute ln na v d:
[TenTruongattribute("SoCMND")] public string SoCMND { // vv...

Nu trnh bin dch khng tm thy mt lp thuc tnh tng ng, hoc thy nhng cch m ta dng thuc tnh khng ph hp vi thng tin trong lp thuc tnh, th trnh bin dch s sinh ra li.

Cc lp thuc tnh tu chn


Gi s ta nh ngha mt thuc tnh TenTruong nh sau:
[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)] public class TenTruongAttribute: Attribute { private string ten; public TenTruongAttribute(string ten) { this.ten = ten; } }

104

iu u tin ta ch l lp attribute c nh du vi mt thuc tnh AttributeUsage. AttributeUsage ch nh cc mc no trong m ca chng ta p dng thuc tnh ty chn. Thng tin ny c cho bi thng s u tin. Thng s ny l mt kiu lit k attributeTargets. Trong v d trn ta ch nh thuc tnh TenTruong ch c p dng n cc thuc tnh. nh ngha ca kiu lit k attributeTargets l:
public enum attributeTargets { All = 0x00003FFF, Assembly = 0x00000001, Class = 0x00000004, Constructor = 0x00000020, Delegate = 0x00001000, Enum = 0x00000010, Event = 0x00000200, Field = 0x00000100, Interface = 0x00000400, Method = 0x00000040, Module = 0x00000002, Parameter = 0x00000800, Property = 0x00000080, ReturnValue = 0x00002000, Struct = 0x00000008 }

Khi p dng thuc tnh n cc phn t chng trnh, ta t thuc tnh trong ngoc vung ngay trc phn t. Mt thuc tnh c th c p dng n mt Assembly nhng cn c nh du vi t kho Assembly:
[assembly: SomeAssemblyattribute(Parameters)]

kt hp nhiu kiu khc nhau trn mt phn t no , ta vit nh sau:


[attributeUsage(attributeTargets.Property | attributeTargets.Field, AllowMultiple=false, Inherited=false)] public class TenTruongattribute: attribute

Ta cng c th dng attributeTargets.All p dng thuc tnh cho tt c cc trng hp. Thuc tnh attributeUsage cn cha hai thng s khc l AllowMultiple and Inherited, ch nh vi c php khc ca <tn_thuc_tnh>=<gi_tr_thuc_tnh>. Thng s ny l tu chn, thng s AllowMultiple ch nh mt attribute c th p dng nhiu hn mt ln n cng mt mc. Nu thit t l false th trnh bin dch s thng bo li nu n thy:
[TenTruong("SOCMND")] [TenTruong("SOBaoHiem")] public string SOCMND { // vv...

Nu thng s Inherited l true, th mt thuc tnh c th p dng n mt lp hay mt giao din cng s c p dng n tt c cc lp hay giao din c k tha. Nu 105

thuc tnh c p dng cho phng thc hay thuc tnh th n t ng p dng n bt k phng thc hay thuc tnh no c khi bo override. c t cc thng s thuc tnh Ta s kim tra lm th no ta c th ch nh thng s cho thuc tnh tu chn, Khi trnh bin dch gp lnh:
[TenTruong("SOCMND")] public string SOCMND { ...

N kim tra thng s truyn vo attribute , trong trng hp ny l chui v tm phng thc to lp ca thuc tnh m nhn cc thng s ny, nu thy th khng c vn g ngc li trnh bin dch s sinh ra li. Cc thng s tu chn Ta thy thuc tnh attributeUsage c mt c php cho php thm cc gi tr vo trong thuc tnh. C php ny c lin quan n vic ch nh tn ca cc thng s c chn. Gi s ta cp nht li thuc tnh SoCMND nh sau:
[TenTruong("SoCMND ", ChuThich="Day la truong khoa")] public string SoCMND { ...

Trong trng hp ny, trnh bin dch s nhn ra<tn_tham_s>= c php ca thng s th hai. N s tm mt thuc tnh public (hoc field) ca tn m n c th dng t gi tr ca thng s ny. Nu ta mun on m trn lm vic ta thm m sau vo TenTruongattribute:
[attributeUsage(attributeTargets.Property, AllowMultiple=false, Inherited=false)] public class TenTruongattribute: attribute { private string chuthich; public string ChuThich { ...

9. 2 Reflection Reflection l mt k thut cho php ta tm ra thng tin v cc kiu d liu trong chng trnh. Hu ht nhng lp ny nm trong namespace System.Reflection. Lp System.Type cho php ta truy nhp thng tin lin quan n vic nh ngha bt k kiu d liu no. Lp System.Type Ta dng lp Type ly tn ca mt kiu:
Type t = typeof(double);

Mc d ta cho rng Type l mt lp nhng thc s n l mt lp c s tru tng, bt c khi no ta khi to mt i tng Type ta thc s khi to mt lp dn xut ca 106

Type. Type c mt lp dn xut p ng mi kiu d liu. C 3 cch ly mt tham chiu Type cho kiu d liu bt k: Dng tc t typeof, tc t ny ly tn ca kiu nh l thng s. Dng phng thc GetType(), m tt c cc lp k tha t System.Object:
double d = 10; Type t = d.GetType();

GetType() hu ch khi ta c mt tham chiu i tng v khng chc i tng thc s l th hin ca lp no. Ta cng c th gi phng thc static ca lp type, getType():
Type t = Type.GetType("System.Double");

Cc thuc tnh ca Type


Mt s thuc tnh ly chui cha cc tn khc nhau kt hp vi lp: Thuc tnh Name FullName Namespace Tr v tn ca kiu d liu tn y bao gm c namespace tn namespace ca kiu d liu.

C th ly tham chiu n kiu i tng ca cc lp lin quan: Thuc tnh BaseType UnderlyingSystemType Kiu tham chiu tr v tng ng vi kiu c s trc tip ca kiu ny kiu m kiu ny nh x trong thi gian chy.NET

Mt s thuc tnh lun l kim tra kiu, v d l mt lp hay mt kiu lit k... nhng thuc tnh ny bao gm: IsAbstract, IsArray, IsClassembly, IsEnum, IsInterface, IsPointer, IsPrimitive, IsPublic, IsSealed, and IsValueType. V d dng kiu d liu c bn:
Type intType = typeof(int); Console.WriteLine(intType.IsAbstract); // false Console.WriteLine(intType.IsClassembly); // false Console.WriteLine(intType.IsEnum); // false Console.WriteLine(intType.IsPrimitive); // true Console.WriteLine(intType.IsValueType); // true hoc dng lp Vector: Type intType = typeof(Vector);Console.WriteLine(intType.IsAbstract); // false Console.WriteLine(intType.IsClassembly); // true Console.WriteLine(intType.IsEnum); // false Console.WriteLine(intType.IsPrimitive); // false Console.WriteLine(intType.IsValueType); // false

Cc phng thc
107

Hu ht cc phng thc ca System.Type c s dng cha chi tit cc thnh vin ca kiu d liu tng ng - hm to lp, thuc tnh, phng thc, s kin... c nhiu phng thc nhng tt c chng u theo nn chung. V d, c hai phng thc m nhn chi tit phng thc ca kiu d liu: GetMethod() v GetMethods(). GetMethod() tr v mt tham chiu n i tng System.Reflection. MethodInfo cha chi tit ca mt phng thc. GetMethods() tr v mt mng tham chiu. V d phng thc GetMethods() khng ly thng s no v tr v chi tit ca tt c phng thc thnh vin ca kiu d liu:
Type t = typeof(double); MethodInfo [] methods = t.GetMethods(); foreach (MethodInfo nextMethod in methods) { ...

Kiu i tng tr v ConstructorInfo EventInfo FieldInfo InterfaceInfo MemberInfo MethodInfo PropertyInfo

Cc phng thc (phng thc s nhiu ( c 's' cui tn ) tr v mt mng ) Gvvonstructor(), Gvvonstructors() GetEvent(), GetEvents() GetField(), GetFields() GetInterface(), GetInterfaces() GetMember(), GetMembers() GetMethod(), GetMethods() GetProperty(), GetProperties()

Phng thc GetMember() v GetMembers() tr v chi tit ca bt k hay tt c thnh vin ca kiu d liu khng cn bit l hm to lp hay thuc tnh phng thc. Chng trnh minh ha ly tn ca tt c cc phng thc ca mt lp dng reflection:
using System; using System.Reflection; public interface IGiaoDien1 { void PhuongThucA(); } public interface IGiaoDien2 { void PhuongThucB(); }

108

public class ViDu : IGiaoDien1, IGiaoDien2 { public enum KieuLietKe { } public int nguyen; public string chuoi; public void PhuongThuc(int p1, string p2) { } public int ThuocTinh { get { return nguyen; } set { nguyen = value; } } void IGiaoDien1.PhuongThucA() { } void IGiaoDien2.PhuongThucB() { } } public class MainClass { public static void Main(string[] args) { ViDu f = new ViDu(); Type t = f.GetType(); MethodInfo[] mi = t.GetMethods(); foreach (MethodInfo m in mi) Console.WriteLine("Phuong Thuc: {0}", m.Name); } }

109

Hng dn phn thc hnh


Sinh vin hon thnh cc chng trnh mu c minh ha trn lp. Sinh vin hon thnh cc bi thc hnh t bi Lab1 n Lab5. Cc bi thc hnh ny s c cung cp theo cc bui thc hnh.

Ti liu tham kho


1) Bi ging Nguyn l lp trnh 2 2) Trang chiu v lp trnh C# ca Microsoft. 3) Professional C#, 3rd Edition. NXB: Wrox, 2005. 4) C# How to Program, NXB: Prentice Hall, 2003. 5) Ti nguyn hc tp ti http://192.168.6.1/

110

You might also like