Professional Documents
Culture Documents
Tim Hieu CSharp Va Viet Mot Ung Dung Minh Hoa PDF
Tim Hieu CSharp Va Viet Mot Ung Dung Minh Hoa PDF
TM HIU NGN NG C# V
VIT MT NG DNG MINH HA
N TT NGIP
Chng em cng xin chn thnh cm n n cc thy c khoa Cng ngh thng tin
trng i hc Khoa hc T nhin Thnh ph H Ch Minh truyn t nhng kin
thc, kinh nghim qu bu cho chng em trong qu trnh hc tp ti trng.
Li cm n.......................................................................................................................3
Mc lc ............................................................................................................................4
Tm tt.............................................................................................................................1
Phn 1 Tm hiu ngn ng C#.........................................................................................1
Chng 1 C# v .Net Framework................................................................................2
1.1 Nn tng ca .NET.............................................................................................2
1.2 .NET Framework ...............................................................................................3
1.3 Bin dch v ngn ng trung gian (MSIL).........................................................4
1.4 Ngn ng C# ......................................................................................................5
Chng 2 Khi u......................................................................................................6
2.1 Lp, i tng v kiu .......................................................................................6
2.2 Pht trin Hello World....................................................................................8
Chng 3 Nhng c s ca ngn ng C# .................................................................12
3.1 Cc kiu............................................................................................................12
3.2 Bin v hng.....................................................................................................14
3.3 Biu thc ..........................................................................................................16
3.4 Khong trng....................................................................................................16
3.5 Cu lnh ...........................................................................................................16
3.6 Ton t .............................................................................................................19
3.7 To vng tn.....................................................................................................21
3.8 Ch th tin x l ..............................................................................................22
Chng 4 Lp v i tng.......................................................................................24
4.1 nh ngha lp..................................................................................................24
4.2 To i tng ...................................................................................................25
4.3 S dng cc thnh vin tnh .............................................................................27
4.4 Hy i tng ..................................................................................................29
4.5 Truyn tham s.................................................................................................30
4.6 Np chng phng thc v hm dng .............................................................32
4.7 ng gi d liu vi property..........................................................................33
Chng 5 Tha k v a hnh...................................................................................35
5.1 c bit ho v tng qut ho..........................................................................35
5.2 S k tha.........................................................................................................35
5.3 a hnh .............................................................................................................37
5.4 Lp tru tng .................................................................................................38
5.5 Lp gc ca tt c cc lp: Object...................................................................39
5.6 Kiu Boxing v Unboxing ...............................................................................40
5.7 Lp lng ...........................................................................................................42
Chng 6 Np chng ton t.....................................................................................44
6.1 Cch dng t kho operator .............................................................................44
6.2 Cch h tr cc ngn ng .Net khc ................................................................44
6.3 S hu ch ca cc ton t ...............................................................................44
6.4 Cc ton t logic hai ngi ................................................................................45
6.5 Ton t so snh bng........................................................................................45
6.6 Ton t chuyn i kiu (p kiu) ...................................................................45
Chng 7 Cu trc.....................................................................................................48
7.1 nh ngha cu trc ..........................................................................................48
7.2 Cch to cu trc..............................................................................................49
Chng 8 Giao din...................................................................................................50
8.1 Ci t mt giao din .......................................................................................50
8.2 Truy xut phng thc ca giao din ..............................................................52
8.3 Np chng phn ci t giao din ....................................................................54
8.4 Thc hin giao din mt cch tng minh ......................................................55
Chng 9 Array, Indexer, and Collection .................................................................58
9.1 Mng (Array) ...................................................................................................58
9.2 Cu lnh foreach ..............................................................................................59
9.3 Indexers ............................................................................................................62
9.4 Cc giao din ti cha......................................................................................65
9.5 Array Lists........................................................................................................65
9.6 Hng i...........................................................................................................65
9.7 Stacks ...............................................................................................................66
9.8 Dictionary.........................................................................................................66
Chng 10 Chui.......................................................................................................67
10.1 To chui mi ................................................................................................67
10.2 Phng thc ToString() .................................................................................67
10.3 Thao tc chui ................................................................................................68
10.4 Thao tc chui ng.......................................................................................70
Chng 11 Qun l li...............................................................................................72
11.1 Nm v bt bit l ..........................................................................................73
11.2 i tng Exception ......................................................................................80
11.3 Cc bit l t to ............................................................................................82
11.4 Nm bit l ln na. .......................................................................................83
Chng 12 Delegate v Event ...................................................................................87
12.1 Delegate (y thc, y quyn) .........................................................................87
12.2 Event (S kin) ............................................................................................101
Chng 13 Lp trnh vi C#....................................................................................109
13.1 ng dng Windows vi Windows Form.....................................................109
Chng 14 Truy cp d liu vi ADO.NET ...........................................................144
14.1 C s d liu v ngn ng truy vn SQL ....................................................144
14.2 Mt s loi kt ni hin ang s dng .........................................................144
14.3 Kin trc ADO.NET ....................................................................................145
14.4 M hnh i tng ADO.NET .....................................................................146
14.5 Trnh cung cp d liu (.NET Data Providers)............................................148
14.6 Khi s vi ADO.NET ................................................................................148
14.7 S dng trnh cung cp d liu c qun l ..............................................151
14.8 Lm vic vi cc iu khin kt buc d liu .............................................152
14.9 Thay i cc bn ghi ca c s d liu........................................................161
Chng 15 ng dng Web vi Web Forms............................................................173
1.1 Tm hiu v Web Forms............................................................................173
15.1 Cc s kin ca Web Forms ........................................................................174
15.2 Hin th chui ln trang................................................................................175
15.3 iu khin xc nhn hp..............................................................................178
15.4 Mt s v d mu minh ha .........................................................................179
Chng 16 Cc dch v Web...................................................................................192
Chng 17 Assemblies v Versioning ....................................................................196
17.1 Tp tin PE.....................................................................................................196
17.2 Metadata.......................................................................................................196
17.3 Ranh gii an ninh .........................................................................................196
17.4 S hiu phin bn (Versioning) ...................................................................196
17.5 Manifest........................................................................................................196
17.6 a Module Assembly...................................................................................197
17.7 Assembly ni b (private assembly)............................................................198
17.8 Assembly chia s (shared assembly)............................................................198
Chng 18 Attributes v Reflection ........................................................................200
18.1 Attributes......................................................................................................200
18.2 Attribute mc nh (intrinsic attributes).......................................................200
18.3 Attribute do lp trnh vin to ra..................................................................201
18.4 Reflection .....................................................................................................203
Chng 19 Marshaling v Remoting.......................................................................204
19.1 Min ng Dng (Application Domains) .....................................................204
19.2 Context .........................................................................................................206
19.3 Remoting ......................................................................................................208
Chng 20 Thread v S ng B .........................................................................215
20.1 Thread ..........................................................................................................215
20.2 ng b ha (Synchronization) ...................................................................216
20.3 Race condition v DeadLock .......................................................................221
Chng 21 Lung d liu........................................................................................223
21.1 Tp tin v th mc .......................................................................................223
21.2 c v ghi d liu ........................................................................................230
21.3 Bt ng b nhp xut .................................................................................235
21.4 Serialization..................................................................................................238
21.5 Isolate Storage..............................................................................................244
Chng 22 Lp trnh .NET v COM .......................................................................246
22.1 P/Invoke .......................................................................................................246
22.2 Con tr..........................................................................................................248
Phn 2 Xy dng mt ng dng minh ha..................................................................250
Chng 23 Website dy hc ngn ng C# ..............................................................251
23.1 Hin trng v yu cu...................................................................................251
23.2 Phn tch hng i tng...........................................................................258
23.3 Thit k hng i tng.............................................................................262
Tm tt
1
C# v .Net Framework Gvhd: Nguyn Tn Trn Minh Khang
2
C# v .Net Framework Gvhd: Nguyn Tn Trn Minh Khang
3
C# v .Net Framework Gvhd: Nguyn Tn Trn Minh Khang
Thnh phn quan trng nht ca .NET Framework l CLR, n cung cp mi trng
cho ng dng thc thi, CLR l mt my o, tng t my o Java. CLR kch hot
i tng, thc hin kim tra bo mt, cp pht b nh, thc thi v thu dn chng.
Trong Hnh 1-1 tng trn ca CLR bao gm:
Cc lp c s
Cc lp d liu v XML
Cc lp cho dch v web, web form, v Windows form.
Cc lp ny c gi chung l FCL, Framework Class Library, cung cp API
hng i tng cho tt c cc chc nng ca .NET Framework (hn 5000 lp).
Cc lp c s tng t vi cc lp trong Java. Cc lp ny h tr cc thao tc nhp
xut, thao tc chui, vn bn, qun l bo mt, truyn thng mng, qun l tiu trnh
v cc chc nng tng hp khc
Trn mc ny l lp d liu v XML. Lp d liu h tr vic thao tc cc d liu
trn c s d liu. Cc lp ny bao gm cc lp SQL (Structure Query Language:
ngn ng truy vn c cu trc) cho php ta thao tc d liu thng qua mt giao tip
SQL chun. Ngoi ra cn mt tp cc lp gi l ADO.Net cng cho php thao tc
d liu. Lp XML h tr thao tc d liu XML, tm kim v din dch XML.
Trn lp d liu v XML l lp h tr xy dng cc ng dng Windows (Windows
forms), ng dng Web (Web forms) v dch v Web (Web services).
4
C# v .Net Framework Gvhd: Nguyn Tn Trn Minh Khang
1.4 Ngn ng C#
C# l mt ngn ng rt n gin, vi khong 80 t kho v hn mi kiu d liu
dng sn, nhng C# c tnh din t cao. C# h tr lp trnh c cu trc, hng i
tng, hng thnh phn (component oriented).
Trng tm ca ngn ng hng i tng l lp. Lp nh ngha kiu d liu mi,
cho php m rng ngn ng theo hng cn gii quyt. C# c nhng t kho dnh
cho vic khai bo lp, phng thc, thuc tnh (property) mi. C# h tr y
khi nim tr ct trong lp trnh hng i tng: ng gi, tha k, a hnh.
nh ngha lp trong C# khng i hi tch ri tp tin tiu vi tp tin ci t nh
C++. Hn th, C# h tr kiu su liu mi, cho php su liu trc tip trong tp tin
m ngun. n khi bin dch s to tp tin su liu theo nh dng XML.
C# h tr khi nim giao din, interfaces (tng t Java). Mt lp ch c th k
tha duy nht mt lp cha nhng c th ci t nhiu giao din.
C# c kiu cu trc, struct (khng ging C++). Cu trc l kiu hng nh v b gii
hn.Cu trc khng th tha k lp hay c k tha nhng c th ci t giao din.
C# cung cp nhng c trng lp trnh hng thnh phn nh property, s kin v
dn hng khai bo (c gi l attribute). Lp trnh hng component c h tr
bi CLR thng qua siu d liu (metadata). Siu d liu m t cc lp bao gm cc
phng thc v thuc tnh, cc thng tin bo mt .
Assembly l mt tp hp cc tp tin m theo cch nhn ca lp trnh vin l cc th
vin lin kt ng (DLL) hay tp tin thc thi (EXE). Trong .NET mt assembly l
mt on v ca vic ti s dng, xc nh phin bn, bo mt, v phn phi. CLR
cung cp mt s cc lp thao tc vi assembly.
C# cng cho truy cp trc tip b nh dng con tr kiu C++, nhng vng m
c xem nh khng an ton. CLR s khng thc thi vic thu dn rc t ng cc
i tng c tham chiu bi con tr cho n khi lp trnh vin t gii phng.
5
Khi u Gvhd: Nguyn Tn Trn Minh Khang
Chng 2 Khi u
Chng ny ta s to, bin dch v chy chng trnh Hello World bng ngn ng
C#. Phn tch ngn gn chng trnh gii thiu cc c trng chnh yu trong
ngn ng C#.
V d 2-1 Chng trnh Hello World
class HelloWorld
{
static void Main( )
{
// s dng i tng console ca h thng
System.Console.WriteLine("Hello World");
}
}
Sau khi bin dch v chy HelloWorld, kt qu l dng ch Hello World hin th
trn mn hnh.
6
Khi u Gvhd: Nguyn Tn Trn Minh Khang
2.1.2 Cc ghi ch
C# c ba kiu ghi ch trong c hai kiu rt quen thuc ca C++ l dng: "//" v
"/* */". Ngoi ra cn mt kiu ghi ch na s trnh by cc chng k.
V d 2-2 Hai hnh thc ghi ch trong C#
class HelloWorld
{
static void Main( ) // y l ghi trn mt dng
{
/* Bt u ghi ch nhiu dng
Vn cn trong ghi ch
Kt thc ghi ch bng */
System.Console.WriteLine("Hello World");
}
}
7
Khi u Gvhd: Nguyn Tn Trn Minh Khang
class HelloWorld
{
static void Main( )
{
// Console thuc vng tn System
Console.WriteLine("Hello World");
}
}
8
Khi u Gvhd: Nguyn Tn Trn Minh Khang
9
Khi u Gvhd: Nguyn Tn Trn Minh Khang
10
Khi u Gvhd: Nguyn Tn Trn Minh Khang
Cch dng trnh g ri hon ton ging vi trnh g ri trong VS 6.0. N cho php
ta dng li mt v tr bt k, cho ta kim tra gi tr tc thi bng cch di chuyn
chut n v tr bin. Ngoi ra, khi g ri ta cng c th xem gi tr cc bin thng
qua ca s Watch v Local.
chy trong ch g ri ta chn Debug Start hay nhn F5, mun chy tng
bc ta bm F11 v chy vt qua mt phng thc ta bm F10.
11
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.1 Cc kiu
C# buc phi khai bo kiu ca i tng c to. Khi kiu c khai bo r rng,
trnh bin dch s gip ngn nga li bng cch kim tra d liu c gn cho i
tng c hp l khng, ng thi cp pht ng kch thc b nh cho i tng.
C# phn thnh hai loi: loai d liu dng sn v loi do ngi dng nh ngha.
C# cng chia tp d liu thnh hai kiu: gi tr v tham chiu. Bin kiu gi tr c
lu trong vng nh stack, cn bin kiu tham chiu c lu trong vng nh heap.
C# cng h tr kiu con tr ca C++, nhng t khi c s dng. Thng thng con
tr ch c s dng khi lm vic trc tip vi Win API hay cc i tng COM.
12
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
13
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.2.2 Hng
Hng l mt bin nhng gi tr khng thay i theo thi gian. Khi cn thao tc trn
mt gi tr xc nh ta dng hng. Khai bo hng tng t khai bo bin v c thm
t kha const trc. Hng mt khi khi ng xong khng th thay i c na.
const int HANG_SO = 100;
Kt qu
Thu Hai = 0
Thu Bay = 5
14
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.2.4 Chui
Chui l kiu dng sn trong C#, n l mt chui cc k t n l. Khi khai bo
mt bin chui ta dng t kho string. V d khai bo mt bin string lu chui
"Hello World"
string myString = "Hello World";
3.2.5 nh danh
nh danh l tn m ngi lp trnh chn i din mt kiu, phng thc, bin,
hng, i tng ca h. nh danh phi bt u bng mt k t hay du _.
nh danh khng c trng vi t kho C# v phn bit hoa thng.
15
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.5 Cu lnh
Cng nh trong C++ v Java mt ch th hon chnh th c gi l mt cu lnh
(statement). Chng trnh gm nhiu cu lnh, mi cu lnh kt thc bng du ;.
V d:
int x; // l mt cu lnh
x = 23; // mt cu lnh khc
Ngoi cc cu lnh bnh thng nh trn, c cc cu lnh khc l: lnh r nhnh
khng iu kin, r nhnh c iu kin v lnh lp.
16
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
17
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
int nQuyen = 0;
switch ( sQuyenTruyCap )
{
case Administrator:
nQuyen = 1;
break;
case Admin:
goto case Administrator;
default:
nQuyen = 2;
break;
}
3.5.3 Lnh lp
C# cung cp cc lnh lp ging C++ nh for, while, do-while v lnh lp mi
foreach. N cng h tr cc cu lnh nhy nh: goto, break, continue v return.
18
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.6 Ton t
Cc php ton +, -, *, / l mt v d v ton t. p dng cc ton t ny ln cc bin
kiu s ta c kt qu nh vic thc hin cc php ton thng thng.
int a = 10;
int b = 20;
int c = a + b; // c = 10 + 20 = 30
C# cung cp cp nhiu loi ton t khc nhau thao tc trn cc kiu bin d liu,
c lit k trong bng sau theo tng nhm ng ngha.
Bng 3-3 Cc nhm ton t trong C#
Nhm ton t Ton t ngha
Ton hc + - * / % cng , tr, nhn chia, ly phn d
Logic & | ^ ! ~ && || true php ton logic v thao tc trn bit
false
Ghp chui + ghp ni 2 chui
Tng, gim ++, -- tng / gim ton hng ln / xung 1. ng
trc hoc sau ton hng.
Dch bit << >> dch tri, dch phi
Quan h == != < > <= >= bng, khc, nh/ln hn, nh/ln hn
hoc bng
Gn = += -= *= /= %= &= php gn
|= ^= <<= >>=
Ch s [] cch truy xut phn t ca mng
p kiu ()
Indirection v * -> [] & dng cho con tr
Address
19
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.6.6 Th t cc ton t
i vi cc biu thc ton, th t u tin l th t c qui nh trong ton hc.
Cn th t u tin thc hin ca cc nhm ton t c lit k theo bng di y
Bng 3-4 Th t u tin ca cc nhm ton t (chiu u tin t trn xung)
Nhm ton t Ton t ngha
Primary (chnh) {x} x.y f(x) a[x] x++
x--
Unary + - ! ~ ++x x (T)x
Nhn * / % Nhn, chia, ly phn d
Cng + - cng, tr
Dch bt << >> Dch tri, dch phi
Quan h < > <= >= is nh hn, ln hn, nh hn hay bng,
ln hn hay bng v l
Bng == != bng, khc
Logic trn bit AND & V trn bit.
XOR ^ Xor trn bit
OR | hoc trn bit
20
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
3.7 To vng tn
Nh c gii thch trong phn tch v d HelloWorld, vng tn l mt cch t chc
m ngun thnh cc nhm c ng ngha lin quan. V d:
Trong m hnh kin trc 3 lp (3 tng, ting Anh l 3 tier Architecture) chia mt
ng dng ra thnh 3 tng: tng giao din, tng nghip v v tng d liu
(Presentation, Bussiness v Data). Ta c th chia d n thnh 3 vng tn tng ng:
Presentation, Bussiness v Data. Cc vng tn ny cha cc lp thuc v tng ca
mnh.
Mt vng tn cha cc lp v cc vng tn con khc. Vy trong v d trn ta s to
mt vng tn chung cho ng dng l MyApplication v ba vng tn kia s l ba
vng tn con ca vng tn MyApplication. Cch ny gii quyt c trng hp
nu ta c nhiu d n m ch c 3 vng tn v dn n vic khng bit mt lp
thuc vng tn Data nhng khng bit thuc d n no.
S o cay vung ten
MyApplication
vung ten con Cac lp vung ten con Cac lp vung ten con Cac lp
Vng tn con c truy xut thng qua tn vng tn cha cch nhau bng du chm.
khai bo vng tn ta s dng t kha namespace. V d di y l 2 cch khai
bo cc vng tn trong v d trn.
21
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
Cch 1
namespace MyApplication
{
namespace Presentation
{
// khai bo lp
// khai bo vng tn con
}
namespace Bussiness
{
// khai bo lp
// khai bo vng tn con
}
namespace Data
{
// khai bo lp
// khai bo vng tn con
}
}
Cch 2
namespace MyApplication.Presentation
{
// khai bo lp
// khai bo vng tn con
}
namespace MyApplication.Bussiness
{
// khai bo lp
// khai bo vng tn con
}
namespace MyApplication.Data
{
// khai bo lp
// khai bo vng tn con
}
Cch khai bo vng tn th nht ch tin nu cc vng tn nm trn cng mt tp
tin. Cch th hai tin li hn khi cc vng tn nm trn nhiu tp tin khc nhau.
3.8 Ch th tin x l
Khng phi mi cu lnh u c bin dch cng lc m c mt s trong chng
c bin dch trc mt s khc. Cc cu lnh nh th ny gi l cc ch th tin
x l. Cc ch th tin x l c t sau du #.
22
Nhng c s ca ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
#if DEBUG
// m ngun c bao gm trong chng trnh
// khi chy di ch debug
#else
// m ngun c bao gm trong chng trnh
// khi chy di ch khng debug
#endif
//... cc on m ngun khng nh hng tin x l
Trnh bin dch nhy n cc on tho iu kin tin bin dch bin dch trc.
3.8.2 Hy mt nh danh
Ta hy mt nh danh bng cch dng #undef. B tin x l duyt m ngun t
trn xung di, nn nh danh c nh ngha t #define, hy khi gp #undef
hay n ht chng trnh. Ta s vit l:
#define DEBUG
#if DEBUG
// m ngun c bin dch
#endif
#undef DEBUG
#if DEBUG
// m ngun s khng c bin dch
#endif
23
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
Chng 4 Lp v i tng
i tng l mt tr c th c to ra, lu gi v s dng. Trong C# tt c cc bin
u l i tng. Cc bin kiu s, kiu chui u l i tng. Mi mt i
tng u c cc bin thnh vin lu gi d liu v c cc phng thc (hm)
tc ng ln bin thnh vin. Mi i tng thuc v mt lp i tng no . Cc
i tng c cng lp th c cng cc bin thnh vin v phng thc.
4.1 nh ngha lp
nh ngha mt lp mi vi c php nh sau:
[attribute][b t truy xut] class nh danh [:lp c s]
{
thn lp
}
V d 4-1 Khai bo mt lp
public class Tester
{
public static int Main( )
{
...
}
}
Khi khai bo mt lp ta nh ngha cc c tnh chung ca tt c cc i tng ca
lp v cc hnh vi ca chng.
V d 4-2 Khai bo, to v s dng mt lp
using System;
public class Time
{
// phng thc public
public void DisplayCurrentTime( )
{
Console.WriteLine( "stub for DisplayCurrentTime" );
}
// cc bin private
int Year; int Month; int Date;
int Hour; int Minute; int Second;
}
public class Tester
{
static void Main( )
{
Time t = new Time( );
t.DisplayCurrentTime( );
}
24
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
4.2 To i tng
To mt i tng bng cch khai bo kiu v sau dng t kho new to nh
trong Java v C++.
25
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
26
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
}
}
Kt qu:
11/16/2000 16:21:40
4.2.2 Khi to
Ta c th khi to gi tri cc bin thnh vin theo mun bng cch khi to n
trong constructor ca lp hay c th gn vo trc tip lc khai bo. Vi gi tr khi
to ny th khi mt i tng khai bo kiu ca lp ny th gi tr ban u l cc gi
tr khi to ch khng phi l gi tr mc nh.
27
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
28
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
4.4 Hy i tng
Ging vi Java, C# cng cung cp b thu dn rc t ng n s ngm hy cc bin
khi khng dng. Tuy nhin trong mt s trng hp ta cng cn hy tng minh,
khi ch vic ci t phng thc Finalize(), phng thc ny s c gi bi b
thu dn rc. Ta khng cn phi gi phng thc ny.
4.4.1 Hy t ca C#
Hy t ca C# cng ging nh hy t trong C++. Khai bo mt hy t theo c
php:
~<nh danh>() {}
trong , nh danh ca hy t trng vi dnh danh ca lp. hy tng minh ta
gi phng thc Finalize() ca lp c s trong ni dung ca hy t ny.
29
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
30
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
// bin thnh vin private
private int Year;
private int Month;
private int Date;
private int Hour;
private int Minute;
private int Second;
}
public class Tester
{
static void Main( )
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime( );
int theHour = 0;
int theMinute = 0;
int theSecond = 0;
t.GetTime(ref theHour, ref theMinute, ref theSecond);
System.Console.WriteLine("Current time: {0}:{1}:{2}",
theHour, theMinute, theSecond);
}
}
Kt qu:
11/17/2000 13:41:18
Current time: 13:41:18
31
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
32
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
}
}
33
Lp v i tng Gvhd: Nguyn Tn Trn Minh Khang
hour = dt.Hour;
minute = dt.Minute;
second = dt.Second;
}
// to mt c tnh
public int Hour
{
get { return hour; }
set { hour = value; }
}
// cc bin thnh vin kiu private
private int year;
private int month;
private int date;
private int hour;
private int minute;
private int second;
}
public class Tester
{
static void Main( )
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime( );
int theHour = t.Hour;
System.Console.WriteLine("\nRetrieved the hour: {0}\n",
theHour);
theHour++;
t.Hour = theHour;
System.Console.WriteLine("Updated the hour: {0}\n",
theHour);
}
}
4.7.3 Cc trng ch c
C# cung cp t kho readonly khai bo cc bin thnh vin. Cc bin khai bo
kiu ny ch cho php gn gi tr cho bin mt ln vo lc khi to qua constructor.
34
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
5.2 S k tha
Trong C#, mi quan h chi tit ho l mt kiu k tha. S k tha khng cho mang
ngha chi tit ho m cn mang ngha chung ca t nhin v mi quan h ny.
Khi ta ni rng ListBox k tha t Window c ngha l n chi tit ho Window.
Window c xem nh l lp c s (base class) v ListBox c xem l lp k tha
(derived class). Lp ListBox ny nhn tt c cc c tnh v hnh vi ca Window v
chi tit ho n bng mt s thuc tnh v phng thc ca n cn.
35
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
36
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
5.2.2 Gi hm dng lp c s
Trong V d 5-1 lp ListBox tha k t Window v c hm dng ba tham s. Trong
hm dng ca ListBox c li gi n hm dng ca Window thng qua t kho
base nh sau:
public ListBox( int top, int left, string theContents):
base(top, left) // gi constructor c s
Bi v cc hm dng khng c tha k nn lp k tha phi thc hin hm dng
ca ring n v ch c th dng hm dng c s thng qua li gi tng minh. Nu
lp c s c hm dng mc nh th hm dng lp k tha khng cn thit phi gi
hm dng c s mt cch tng minh (mc nh c gi ngm).
5.3 a hnh
a hnh l vic lp B tha k cc c tnh t lp A nhng c thm mt s ci t
ring. a hnh cng l cch c th dng nhiu dng ca mt kiu m khng quan
tm n chi tit.
37
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
38
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
39
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
40
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
class Boxing
{
public static void Main( )
{
int i = 123;
Console.WriteLine("The object value = {0}", i);
}
}
Console.WriteLine() mong ch mt i tng, khng phi l s nguyn. ph
hp vi phng thc, kiu interger c t ng chuyn bi CLR v ToString()
c gi ly kt qu i tng. c trng ny cho php ta to cc phng thc
ly mt i tng nh l mt tham chiu hay gi tr tham s, phng thc s lm
vic vi n.
41
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
5.7 Lp lng
Lp c khai bo trong thn ca mt lp c gi l lp ni (inner class) hay lp
lng (nested class), lp kia gi l lp ngoi (outer class). Lp ni c thun li l
truy cp c trc tip tt c cc thnh vin ca lp ngoi. Mt phng thc ca
lp ni cng c th truy cp n cc thnh vin kiu private ca cc lp ngoi. Hn
na, lp ni n n trong lp ngoi so vi cc lp khc, n c th l thnh vin kiu
private ca lp ngoi. Khi lp ni (vd: Inner) c khai bo public, n s c truy
xut thng qua tn ca lp ngoi (vd: Outer) nh: Outer.Inner.
V d 5-6 Cch dng lp ni
using System;
using System.Text;
public class Fraction
{
public Fraction(int numerator, int denominator)
{
this.numerator=numerator;
this.denominator=denominator;
42
Tha k v a hnh Gvhd: Nguyn Tn Trn Minh Khang
}
// Methods elided...
public override string ToString( )
{
StringBuilder s = new StringBuilder( );
s.AppendFormat("{0}/{1}",
numerator, denominator);
return s.ToString( );
}
internal class FractionArtist
{
public void Draw(Fraction f)
{
Console.WriteLine("Drawing the numerator: {0}",
f.numerator);
Console.WriteLine("Drawing the denominator: {0}",
f.denominator);
}
}
private int numerator;
private int denominator;
}
public class Tester
{
static void Main( )
{
Fraction f1 = new Fraction(3,4);
Console.WriteLine("f1: {0}", f1.ToString( ));
Fraction.FractionArtist fa = new Fraction.FractionArtist();
fa.Draw(f1);
}
}
43
Np chng ton t Gvhd: Nguyn Tn Trn Minh Khang
6.3 S hu ch ca cc ton t
Cc ton t c np chng c th gip cho on m ngun ca ta d nhn hn, d
qun l v trong sng hn. Tuy nhin nu ta qu lm dng a vo cc ton t qu
mi hay qu ring s lm cho chng trnh kh s dng cc ton t ny m i khi
cn c cc nhm ln v v na.
44
Np chng ton t Gvhd: Nguyn Tn Trn Minh Khang
45
Np chng ton t Gvhd: Nguyn Tn Trn Minh Khang
{
Console.WriteLine("In Fraction Constructor(int, int)");
this.numerator=numerator;
this.denominator=denominator;
}
public Fraction(int wholeNumber)
{
Console.WriteLine("In Fraction Constructor(int)");
numerator = wholeNumber;
denominator = 1;
}
public static implicit operator Fraction(int theInt)
{
System.Console.WriteLine("In implicit conversion to Fraction");
return new Fraction(theInt);
}
public static explicit operator int(Fraction theFraction)
{
System.Console.WriteLine("In explicit conversion to int");
return theFraction.numerator / theFraction.denominator;
}
public static bool operator==(Fraction lhs, Fraction rhs)
{
Console.WriteLine("In operator ==");
if (lhs.denominator == rhs.denominator &&
lhs.numerator == rhs.numerator)
{
return true;
}
// code here to handle unlike fractions
return false;
}
public static bool operator !=(Fraction lhs, Fraction rhs)
{
Console.WriteLine("In operator !=");
return !(lhs==rhs);
}
public override bool Equals(object o)
{
Console.WriteLine("In method Equals");
if (! (o is Fraction) )
{
return false;
}
return this == (Fraction) o;
}
public static Fraction operator+(Fraction lhs, Fraction rhs)
{
Console.WriteLine("In operator+");
if (lhs.denominator == rhs.denominator)
{
return new Fraction(lhs.numerator+rhs.numerator,
lhs.denominator);
}
// simplistic solution for unlike fractions
// 1/2 + 3/4 == (1*4) + (3*2) / (2*4) == 10/8
int firstProduct = lhs.numerator * rhs.denominator;
int secondProduct = rhs.numerator * lhs.denominator;
46
Np chng ton t Gvhd: Nguyn Tn Trn Minh Khang
47
Cu trc Gvhd: Nguyn Tn Trn Minh Khang
Chng 7 Cu trc
Mt cu trc (struct) l mt kiu do ngi dng nh ngha, n tng t nh lp
nh nh hn lp.
48
Cu trc Gvhd: Nguyn Tn Trn Minh Khang
7.2.2 Gi hm dng mc nh
Theo trn trnh by khi ta khng to bt k ny th khi to mt th hin ca cu
trc thng qua t kho new n s gi n constructor mc nh ca cu trc. Ni
dung ca constructor s t gi tr cc bin v 0.
49
Giao din Gvhd: Nguyn Tn Trn Minh Khang
50
Giao din Gvhd: Nguyn Tn Trn Minh Khang
{
public void Read( ) { // phi ci t...}
public void Write(object obj) { // phi ci t...}
// ...
}
51
Giao din Gvhd: Nguyn Tn Trn Minh Khang
52
Giao din Gvhd: Nguyn Tn Trn Minh Khang
8.2.2 Ton t is
Khi chng ta mun mt i tng c kh nng h tr giao din, theo nguyn tc l
chng ta phi gi phng thc tng ng ln. Trong C# c 2 phng thc h tr
cng vic ny.
C php nh sau:
expression is type
hay
if (doc is IStorable)
Chc lp giao din IStorable chc bn vn cn nh, y cu lnh if s kim tra
xem i tng doc c h tr giao din IStorable khng m thi.
Tht khng may mn cho chng ta, tuy rt d hiu vi cch vit nh th nhng
chng li khng hiu qu cho lm. hiu vn l ti sao li nh th th chng ta
cn phi nhng chng vo trong m MSIL v sau pht sinh. V sau y l mt
s kt qu (th hin bng s Hexa)
IL_0023: isinst ICompressible
IL_0028: brfalse.s IL_0039
IL_002a: ldloc.0
IL_002b: castclass ICompressible
IL_0030: stloc.2
IL_0031: ldloc.2
IL_0032: callvirt instance void ICompressible::Compress( )
IL_0037: br.s IL_0043
IL_0039: ldstr "Compressible not supported"
C mt s vn l chng ta phi ch l trong phn kim tra ICompressable trong
dng 23. T kha isinst l m MSIL ca tc t is. Nh ta thy trong phn kim tra
i tng doc pha bn phi v dng 2b th vic kim tra thnh cng khi
castclass c gi.
8.2.3 Ton t as
Ton t as kt hp tc t is v s phn b cc thao tc bng vic kim tra s phn
b c hp l hay khng (gi tr s tr v l true) v sau y s hon tt cng vic.
Nu s phn b khng hp l (tc t is s tr v gi tr false), tc t as s tr v gi
tr null. C php ca vic khai bo:
expression as type
on m sau y s dng tc t as:
static void Main( )
53
Giao din Gvhd: Nguyn Tn Trn Minh Khang
{
Document doc = new Document("Test Document");
IStorable isDoc = doc as IStorable;
if (isDoc != null)
isDoc.Read( );
else
Console.WriteLine("IStorable not supported");
54
Giao din Gvhd: Nguyn Tn Trn Minh Khang
55
Giao din Gvhd: Nguyn Tn Trn Minh Khang
{
// create a document object
Document theDoc = new Document("Test Document");
// p kiu c th gi IStorable.Read()
IStorable isDoc = theDoc as IStorable;
if (isDoc != null)
{
isDoc.Read( );
}
// p kiu c th gi ITalk.Read()
ITalk itDoc = theDoc as ITalk;
if (itDoc != null)
{
itDoc.Read( );
}
theDoc.Read( );
theDoc.Talk( );
}
}
Kt qu:
Creating document with: Test Document
Implementing IStorable.Read
Implementing ITalk.Read
Implementing IStorable.Read
Implementing ITalk.Talk
56
Giao din Gvhd: Nguyn Tn Trn Minh Khang
57
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
9.1.2 Gi tr mc nh
Gi s c on m sau:
/*1*/ int[] myArray;
/*2*/ maArray = new int[5];
58
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
59
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
}
}
}
/**
* cch truyn tham s bng cc phn t
* khng cn phi khi to mng
* (c php rt t do)
*/
t.DisplayVals(5,6,7,8);
/**
* Cch truyn tham s bng mng
* Mng phi c to sn
*/
int [] explicitArray = new int[5] {1,2,3,4,5};
t.DisplayVals(explicitArray);
}
public void DisplayVals(params int[] intVals)
{
foreach (int i in intVals)
{
Console.WriteLine("DisplayVals {0}",i);
}
}
60
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
}
}
Kt qu:
DisplayVals 5
DisplayVals 6
DisplayVals 7
DisplayVals 8
DisplayVals 1
DisplayVals 2
DisplayVals 3
DisplayVals 4
DisplayVals 5
9.2.4 Lp System.Array
Lp Array c rt nhiu hm hu ch, n lm cho mng trong C# "thng minh" hn
nhiu ngn ng khc. Chng c h tr nh l cc phng thc c dng sn
nh trng hp string. Hai phng thc quan trong nht ca lp System.Array l
Sort() v Reverse().
61
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
9.3 Indexers
Indexer tng t nh Property, tuy c khc nhau mt cht v ngha. Xt mt v d
m phng mt quyn sch c nhiu chng
// Property
public Chuong[] DsChuong
{
get{ return m_dsChuong; }
}
}
Cch lm ny c vi bt li nh sau: th nht ly ni dung tng chng chng ta
dng Property ly danh sach chng sau duyt qua mng ly chng mong
mun. Th hai l mi chng c nh danh bi tn chng nn ta mong mun c
cch ly mt chng thng qua tn ca n. Ta c th ci t mt hm duyt qua
mng cc chng, nhng Indexer s gip lm vic ny.
V d 9-3 S dng indexer
using System;
using System.Collections;
namespace ConsoleApplication
{
// Ci t lp Chuong
public class Chuong
{
private string m_sTen;
private string m_sNoiDung;
public Chuong()
{
m_sTen = "";
m_sNoiDung = "";
}
public Chuong(string sTen, string sNoiDung)
{
m_sTen = sTen;
62
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
m_sNoiDung = sNoiDung;
}
public string Ten
{
get { return m_sTen; }
set { m_sTen = value; }
}
public string NoiDung
{
get { return m_sNoiDung; }
set { m_sNoiDung = value; }
}
} // ht class Chuong
// Ci t lp Sach
public class Sach
{
private string m_sTen;
private ArrayList m_dsChuong;
public Sach()
{
m_sTen = "";
m_dsChuong = new ArrayList();
}
public Sach(string sTen)
{
m_sTen = sTen;
m_dsChuong = new ArrayList();
}
public string Ten
{
get { return m_sTen; }
set
{
if ( value == null )
throw new ArgumentNullException();
m_sTen = value;
}
}
// indexer th nht c mt tham s kiu int
public Chuong this[int index]
{
get
{
if ( index < 0 || index > m_dsChuong.Count - 1 )
return null;
return (Chuong)m_dsChuong[index];
}
set
{
if ( index < 0 || index > m_dsChuong.Count - 1 )
throw new ArgumentOutOfRangeException();
m_dsChuong[index] = value;
}
}
63
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
return m_dsChuong.Add(chuong);
}
}// ht class Sach
class Class
{
static void Main(string[] args)
{
Sach s = new Sach("tlv");
s.add(new Chuong("CS", "Tac gia CS"));
s.add(new Chuong("VB", "Tac gia VB"));
Console.WriteLine(s.Ten);
// dng indexer th nht
Console.WriteLine(s[0].Ten + ": "+ s[0].NoiDung);
// dng indexer th hai
Console.WriteLine("VB: " + s["VB"].NoiDung);
Console.Read();
}
}
}
Trc ht quan st lp Sach xem khai bo mt indexer
// indexer th nht c mt tham s kiu int
public Chuong this[int index]
64
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
9.6 Hng i
Hng i (queue) l mt ti cha hot ng theo c ch FIFO (First in first out -
vo trc ra trc). Cng ging nh ta i xp hng mua v xem phim, nu ta vo
trc mua v th ta s c mua v trc.
Hng i l mt tp hp tt cho vic ta s dng qun l ngun ti nguyn c gii
hn. V d nh ta gi i nhng thng ip n ti nguyn, m ti nguyn th ch c
th gii quyt cho mt thng ip. Do chng ta phi to mt hng i nhng
65
Array, Indexer, and Collection Gvhd: Nguyn Tn Trn Minh Khang
9.7 Stacks
Stack l ti cha hot ng theo c ch LIFO (Last in first out - vo sau ra trc).
Hai phng thc c bn trong vic thm hoc xa Stack l:Push( ) v Pop( ). Ngoi
ra Stack cn c phng thc Peek( ), tng t nh Pop() nhng khng xa b phn
t ny.
Cc lp ArrayList, Queue v Stack u c nhng phng thc ging nhau nh
CopyTo( ) v ToArray( ) dng sao chp nhng phn t vo trong mt mng.
Trong trng hp Stack th phng thc CopyTo( ) s sao chp nhng phn t vo
mt mng mt chiu tn ti, v ni dung chng s ghi ln v tr bt u m
chng ta ch nh. Phng thc ToArray( ) tr v mt mng mi vi ni dung l
nhngphn t trong stack.
9.8 Dictionary
Dictionary l tn gi chung cho cc ti cha lu tr cc phn t theo quan h
kha/gi tr. iu ny c ngha l tng ng vi mt "kha", ta tm c mt v ch
duy nht mt "gi tr" tng ng.Ni cch khc l mt "gi tr" c mt "kha" duy
nht khng trng vi bt k "kha" ca gi tr khc.
Mt lp mun l mt Dictionary th ci t giao din IDictionary. Lp Dictionary
mun c s dng trong cu lnh foreach th ci t giao din
IDictionaryEnumerator.
Dictionary thng c dng nht l bng bm (Hashtable).
Bng bm
Hashtable l cu trc d liu c mc tiu ti u ha vic tm kim. .et Framework
cung cp lp Hashtable ci t cu trc d liu ny.
Mt i tng c dng nh "kha" phi ci t hay tha k phng thc
Object.GetHashCode() v Object.Equals() (cc lp th vin .NET Framework hin
nhin tha iu kin ny). Mt iu kin na l i tng ny phi immutable (d
liu cc trng thnh vin khng thay i) trong lc ang l kha.
66
Chui Gvhd: Nguyn Tn Trn Minh Khang
Chng 10 Chui
Chui (string) trong C# l mt kiu dng sn nh cc kiu int, long, c y
tnh cht mm do, mnh m v d dng. Mt i tng chui trong C# l mt hay
nhiu k t Unicode khng th thay i th t. Ni cch khc l cc phng thc
p dng ln chui khng lm thay i bn thn chui, chng ch to mt bn sao c
sa i, chui gc vn gi nguyn.
khai bo mt i tng chui, s dng t kha string; i tng ny tht s
trng vi i tng System.String trong th vin lp .NET Framework. Vic s
dng hai i tng ny l nh nhau trong mi trng hp.
Khai bo lp System.String nh sau:
public sealed class String:IComparable,ICloneable,Iconvertible
Khai bo ny c ngha nh sau:
seal - khng th tha k t lp ny
ICompareable - cc i tng chui c th c sp th th
IClonable - c th to mt i tng B mi y ht i tng A.
IConvertible - c th chuyn thnh cc kiu dng sn khc nh
ToInt32(), ToDouble()
10.1 To chui mi
Cch n gin nht to mt bin kiu chui l khai bo v gn mt chui cho n
string sChuoi = "Khai bo v gn mt chui";
67
Chui Gvhd: Nguyn Tn Trn Minh Khang
68
Chui Gvhd: Nguyn Tn Trn Minh Khang
Ch : v tr rn chui bt u t v tr s 0
Chiu di chui
bit s k t ca chui, dng thuc tnh Length
string s = "Xin cho";
int l = s.Length; // l = 8
69
Chui Gvhd: Nguyn Tn Trn Minh Khang
70
Chui Gvhd: Nguyn Tn Trn Minh Khang
71
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
Chng 11 Qun l li
C# qun l li v cc trng thi bt thng bng bit l (exception). Mt bit l l
mt i tng cha cc thng tin v s c bt thng ca chng trnh.
iu quan trng trc ht l phi phn bit r s khc nhau gia bug, error v bit
l. Bug l li v mt lp trnh do chnh lp trnh vin khng kim sot c m
ngun. Bit l khng th sa cc bug. Mc d bug s pht sinh (nm) mt bit l,
chng ta khng nn da vo cc bit l sa cc bug, m nn vit li m ngun
cho ng.
Error l li gy ra bi ngi dng. Chng hn nh ngi dng nhp mt con s thay
v phi nhp cc k t ch ci. Mt error cng nm ra mt bit l, nhng ta c th
ngn chn bng cch bt ly li ny, yu cu ngi dng chnh sa cho n khi hp
l. Bt c khi no c th, error nn c tin on trc v ngn chn.
Ngay c khi cc bug c sa, cc error c tin on ht th vn cn nhiu
tnh hung khng th lng trc nh: h thng ht b nh hay chng trnh
ang truy cp mt tp tin khng tn ti. Chng ta khng th ngn chn c bit
l nhng c li c th qun l c chng chng khng lm gy ng dng.
Khi chng trnh gp phi tnh hung trn, chng hn ht b nh, n s nm (pht
sinh) mt bit l. Khi mt bit l c nm ra, hm ang thc thi s b tm dng v
vng nh stack s c duyt ngc cho n khi gp trnh gii quyt bit l.
iu ny c ngha l nu hm hin hnh khng c trnh gii quyt bit l th hm s
b ngt v hm gi s c c hi gii quyt li. Nu khng c hm gi no gii
quyt bit l th bit l s c nm cho CLR gii quyt. iu ny ng ngha vi
vic chng trnh s b dng mt cch bt thng.
Trnh qun l li (exception handler) l mt on m c thit k gii quyt cc
bit l c nm ra. Trnh gii quyt li c ci t trong khi lnh bt u bi t
kha catch{}. Mt cch l tng th khi bit l c bt v gii quyt th chng
trnh tip tc thc thi v vn c gii quyt. Ngay c trong trng hp chng
trnh khng th tip tc c th bng cch bt bit l ta vn cn mt c hi in (hoc
ghi li thnh tp tin) cc thng bo li v kt thc chng trnh mt m p.
Nu trong hm c nhng on m phi c thc thi bt chp c hay khng c xy
ra bit l (nh on m gii phng cc ngun lc c cp pht), on m ny nn
c b trong khi lnh finnally{}.
72
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
11.1 Nm v bt bit l
Trong C# chng ta c th nm bt k mt i tng no thuc lp hay lp con ca
lp System.Exception (vit tt l Exception). Vng tn System khai bo sn
nhiu lp bit l hu ch chng hn nh ArgumentNullException,
InValidCastException, OverflowException
73
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
in ...exceptions01.cs:line 26
at Programming_CSharp.Test.Func1( )
in ...exceptions01.cs:line 20
at Programming_CSharp.Test.Main( )
in ...exceptions01.cs:line 12
74
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
Console.WriteLine(
"Exception caught and handled.");
}
Console.WriteLine("Exit Func2...");
}
}
}
Kt qu:
Enter Main...
Enter Func1...
Enter Func2...
Entering try block...
Exception caught and handled.
Exit Func2...
Exit Func1...
Exit Main...
V d ny y ht nh v d 11-1 ngoi tr chng trnh c t trong khi lnh
try/catch. Ta t cc on m d gy li trong khi lnh try, chng hn nh
on m truy cp tp tin, xin cp pht vng nh.
Theo sau khi lnh try l khi lnh catch. Khi lnh catch trong v d l khi
lnh catch chung v ta khng th on trc c loi bit l no s pht sinh. Nu
bit chnh xc loi bit l no pht sinh, ta s vit khi lnh catch cho loi bit l
(s cp phn sau).
11.1.2.1 Sa cha li lm
Trong v d 11-2, lnh bt catch ch n gin thng bo rng mt bit l c
bt v qun l. Trong ng dng thc t, chng ta s vit cc on m gii quyt li
y. V d nu ngi dng c m mt tp ch c, ta hn cho gi mt phng
thc cho php ngi dng thay i thuc tnh tp tin. Nu trng hp ht b nh, ta
hn cho ngi dng c hi ng cc ng dng khc. Nu tt c u tht bi, khi
lnh catch s cho in cc thng bo m t chi tit li ngi dng bit r vn .
75
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
76
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
77
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
Kt qu:
DivideByZeroException caught!
Trong v d ny, DoDivide() s khng cho php chia mt s cho 0 hay chia 0 cho
s khc. N s nm ra bit l DivideByZeroException nu ta c chia cho
khng. Nu ta em chia 0 cho s khc, s khng c bit l thch hp: v chia khng
cho mt s l mt php ton hp l v khng nn nm bt k bit l no. Tuy nhin
gi s trong v d ny ta khng mun em 0 chia cho s khc v s nm ra bit l
ArithmeticException.
Khi mt bit l c nm ra, CLR tm kim trnh gii quyt bit l theo theo trnh
t, v chn trnh gii quyt ph hp vi bit l. Khi chy chng trnh vi a = 5
v b = 7, kt qu l:
5 / 7 = 0.7142857142857143
78
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
79
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
Trong v d ny dng thng bo Close file here lun lun xut hin, cho d bit
l c xy ra hay khng.
Ghi ch: khi lnh finally c th c to m khng cn khi catch,
nhng bt buc phi c khi try. Khng th dng cc lnh break,
continue, return v goto trong khi finally.
80
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
{
Console.WriteLine("Unknown exception caught");
}
finally
{
Console.WriteLine ("Close file here.");
}
}
public double DoDivide(double a, double b)
{
if (b == 0)
{
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = "http://www.libertyassociates.com";
throw e;
}
if (a == 0)
throw new ArithmeticException( );
return a / b;
}
}
}
Kt qu:
Open file here
DivideByZeroException! Msg: Attempted to divide by zero.
HelpLink: http://www.libertyassociates.com
Here's a stack trace:
at Programming_CSharp.Test.DoDivide(Double a, Double b)
in c:\...exception06.cs:line 56
at Programming_CSharp.Test.TestFunc( )
in...exception06.cs:line 22
Close file here.
Kt qu lit k cc phng thc theo trnh t ngc vi trnh t chng c gi.
c kt qu trn nh sau: C mt bit l xy ra ti hm DoDivide(), hm
DoDivide ny c gi bi hm TestFunc().
Trong v d ny ta to mt th hin ca DivideByZeroException
DivideByZeroException e = new DivideByZeroException();
Do khng truyn tham s, thng bo mc nh c dng:
DivideByZeroException! Msg: Attempted to divide by zero.
Ta c th thay thng bo mc nh ny bng cch truyn tham s khi khi to:
new DivideByZeroException(
"You tried to divide by zero which is not meaningful");
Trong trng hp ny kt qu s l:
DivideByZeroException! Msg:You tried to divide by zero which is not
meaningful
81
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
{
Console.WriteLine("\nDivideByZeroException! Msg: {0}",
e.Message);
Console.WriteLine("\nHelpLink: {0}", e.HelpLink);
Nh vy ta c th cung cp cc thng tin cn thit cho ngi dng. Sau l in
StackTrace
Console.WriteLine("\nHere's a stack trace:{0}", e.StackTrace);
Ta c kt qu cui cng.
11.3 Cc bit l t to
Vi cc bit l c th ty bin thng bo do CLR cung cp, thng cho hu ht
cc ng dng. Tuy nhin s c lc ta mun thm nhiu dng thng tin hn cho i
tng bit l, khi ta phi t to ly cc bit l mong mun. Bit l t to bt buc
tha k t lp System.Exception. V d 11-7 m t cch to mt bit l mi.
V d 11-7. T to bit l
using System;
namespace Programming_CSharp
{
public class MyCustomException : System.ApplicationException
{
public MyCustomException(string message) : base(message)
{
}
}
public class Test
{
public static void Main( )
{
Test t = new Test( );
t.TestFunc( );
}
public void TestFunc( )
{
try
{
Console.WriteLine("Open file here");
double a = 0;
double b = 5;
Console.WriteLine("{0}/{1}={2}", a, b, DoDivide(a,b));
Console.WriteLine("This line may or may not print");
}
catch (System.DivideByZeroException e)
{
Console.WriteLine("\nDivideByZeroException! Msg: {0}",
e.Message);
Console.WriteLine("\nHelpLink: {0}\n", e.HelpLink);
}
catch (MyCustomException e)
{
Console.WriteLine("\nMyCustomException! Msg: {0}",
e.Message);
Console.WriteLine("\nHelpLink: {0}\n", e.HelpLink);
82
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
}
catch
{
Console.WriteLine("Unknown exception caught");
}
finally
{
Console.WriteLine ("Close file here.");
}
}
// do the division if legal
public double DoDivide(double a, double b)
{
if (b == 0)
{
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = "http://www.libertyassociates.com";
throw e;
}
if (a == 0)
{
MyCustomException e = new MyCustomException(
"Can't have zero divisor");
e.HelpLink =
"http://www.libertyassociates.com/NoZeroDivisor.htm";
throw e;
}
return a / b;
}
}
}
83
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
public class MyCustomException : System.Exception
{
public MyCustomException(string message,Exception inner):
base(message,inner)
{
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
public void TestFunc()
{
try
{
DangerousFunc1();
}
// khi bt c bit l t to
// in lch s cc bit l
catch (MyCustomException e)
{
Console.WriteLine("\n{0}", e.Message);
Console.WriteLine("Retrieving exception history...");
Exception inner = e.InnerException;
while (inner != null)
{
Console.WriteLine("{0}",inner.Message);
inner = inner.InnerException;
}
}
}
public void DangerousFunc1( )
{
try
{
DangerousFunc2( );
}
// nu bt c mt bit l
// nm mt bit l t to
catch(System.Exception e)
{
MyCustomException ex = new MyCustomException(
"E3 - Custom Exception Situation!",e);
throw ex;
}
}
public void DangerousFunc2( )
{
try
84
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
{
DangerousFunc3( );
}
// nu bt c bit l DivideByZeroException thc hin
// vi cng vic sa li v nm ra bit l tng qut
catch (System.DivideByZeroException e)
{
Exception ex = new Exception(
"E2 - Func2 caught divide by zero",e);
throw ex;
}
}
public void DangerousFunc3( )
{
try
{
DangerousFunc4( );
}
catch (System.ArithmeticException)
{
throw;
}
catch (System.Exception)
{
Console.WriteLine("Exception handled here.");
}
}
public void DangerousFunc4( )
{
throw new DivideByZeroException(
"E1 - DivideByZero Exception");
}
}
}
Kt qu:
E3 - Custom Exception Situation!
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 - DivideByZeroException
85
Qun l li Gvhd: Nguyn Tn Trn Minh Khang
C php trn nm cng mt loi bit l cho khi try bn ngoi (ch cn t kha
throw)
DangerousFunc2() s bt c bit l ny, n s nm ra mt bit l mi thuc
kiu Exception. Khi khi to bit l ny, ta truyn cho n hai tham s: thng bo
E2 - Func2 caught divide by zero, v bit l c lm bit l ni.
DangerousFunc1() bt bit l ny, lm vi cng vic no , sau to mt bit
l c kiu MyCustomException. Tng t nh trn khi khi to bit l ta truyn
cho n hai tham s: thng bo E3 - Custom Exception Situation!, v bit
l va bt c lm bit l ni. n thi im ny bit l c hai mc bit l ni.
Cui cng, khi catch s bt bit l ny v in thng bo
E3 - Custom Exception Situation!
Sau s tip tc in cc thng bo ca cc bit l ni
while (inner != null)
{
Console.WriteLine("{0}",inner.Message);
inner = inner.InnerException;
}
V ta c kt qu
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 - DivideByZero Exception
86
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
87
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
88
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
}
Chng ta c hai i tng trong lp Pair v c th in chng ra. By gi l phn
sp xp chng v in kt qu sp xp. Chng ta khng th bit trc s c loi i
tng no, v v vy chng ta s y thc quyn quyt nh i tng no c th t
trc cho chnh cc i tng. Nh vy ta s yu cu i tng c xp th t
trong lp Pair phi ci t phng thc cho bit trong hai i tng, i tng no
c th t trc. Phng thc ny s nhn vo hai i tng (thuc bt k loi no)
v tr v kiu lit k: theFirstComeFirst nu i tng u c th t trc v
theSecondComeFirst nu i tng sau c th t trc.
Nhng phng thc ny s c ng gi bi delegate WhichIsFirst nh
ngha trong lp Pair.
public delegate comparisn WhichIsFirst(object obj1,object obj2)
Tr tr v thuc kiu kiu lit k comparison.
public enum comparison
{
theFirstComesFirst = 1,
theSecondComesFirst = 2
}
89
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
90
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
91
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
92
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
comparison.theSecondComesFirst);
}
public override string ToString( )
{
return name;
}
private string name;
}
public class Test
{
public static void Main( )
{
// to hai i tng sinh vin v hai i tng ch
// y chng vo 2 i tng Pair
Student Jesse = new Student("Jesse");
Student Stacey = new Student ("Stacey");
93
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
Chng trnh test to ra hai i tng Student v hai i tng Dog, sau a
chng vo ti cha Pair. Hm khi to ca Student nhn vo tn sinh vin c
hm khi to Dog nhn vo trng lng ca ch.
Student Jesse = new Student("Jesse");
Student Stacey = new Student ("Stacey");
Dog Milo = new Dog(65);
Dog Fred = new Dog(12);
Pair studentPair = new Pair(Jesse,Stacey);
Pair dogPair = new Pair(Milo, Fred);
Console.WriteLine("studentPair\t\t\t:{0}",studentPair.ToString());
Console.WriteLine("dogPair\t\t\t\t: {0}", dogPair.ToString( ));
94
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
95
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
96
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
97
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
{
Console.WriteLine("Blurring image");
}
public static void Filter( )
{
Console.WriteLine("Filtering image");
}
public static void Sharpen( )
{
Console.WriteLine("Sharpening image");
}
public static void Rotate( )
{
Console.WriteLine("Rotating image");
}
public void ProcessImages( )
{
for (int i = 0;i < numEffectsRegistered;i++)
{
arrayOfEffects[i]( );
}
}
// cc bin thnh vin
private DoEffect[] arrayOfEffects;
private Image image;
private int numEffectsRegistered = 0;
}
// lp kim th
public class Test
{
public static void Main( )
{
Image theImage = new Image( );
// khng giao din lm n gin vn
ImageProcessor theProc = new ImageProcessor(theImage);
theProc.AddToEffects(theProc.BlurEffect);
theProc.AddToEffects(theProc.FilterEffect);
theProc.AddToEffects(theProc.RotateEffect);
theProc.AddToEffects(theProc.SharpenEffect);
theProc.ProcessImages( );
}
}
}
Kt qu:
An image created
Blurring image
Filtering image
Rotating image
Sharpening image
98
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
12.1.5 Multicasting
Multicasting l cch gi hai phng thc thng qua mt delegate n.
iu ny s tr nn quan trng khi qun l cc s kin. Mc tiu chnh l c mt
delegate n c th gi nhiu phng thc cng mt lc. N khc vi mng cc
delagte, trong mng delegate mi delegate ch gi mt phng thc. V d
trc dng mt mng lm ti cha nhiu delegate khc nhau.
Vi multicasting ta c th to mt delegate n ng gi nhiu phng thc.
V d khi mt button c nhn, ta hn mun thao tc nhiu hnh ng cng mt
lc. Ta c th ci t iu ny bng cch cho mi button mt mng cc
delegate, nhng s d hn v r ngha hn khi to mt multicasting
delegate.
Bt k mt delegate no tr v void u l multicast delegate, mc d ta
c th i x n nh single cast delegate (l delegate cp phn trn) nu
mun. Hai multicast delegate c th kt ni vi nhau bng ton t cng (+).
Kt qu l mt multicast delegate mi ng gi tt c cc phng thc ca
hai delegate ton hng. V d, gi s Writer v Logger l cc delegate tr v
kiu void, dng lnh sau s kt ni chng v to ra mt multicast delegate
mi c tn l myMulticastDelegate
myMulticastDelegate = Writer + Logger;
99
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
100
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
101
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
102
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
103
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
Hm Run c vng lp for v tn lun lun kim tra gi h thng. Nu thi gian
thay i n s thng bo n tt c cc subscriber.
u tin l ng trong 10 mili giy
Thread.Sleep(10);
104
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
105
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
}
}
Mc d trong v d ny hai lp tng t nh nhau, nhng bt k lp no cng c
th subscribe mt event.
Ch rng event c thm vo bng ton t +=. iu ny cho php cc s kin
mi c thm vo s kin OnSecondChange ca i tng Clock m khng lm
hng i cc s kin ng k trc . Khi LogCurrentTime subscribe vo
s kin OnSecondChanged, ta khng cn quan tm rng DisplayClock
subscribe hay cha.
V d 12-4. Lm vic vi event
using System;
using System.Threading;
namespace Programming_CSharp
{
// lp gi thng tin v mt s kin
// trong trng hp ny l thng tin v ng h
// nhng tt hn l phi c thm thng tin trng thi
public class TimeInfoEventArgs : EventArgs
{
public TimeInfoEventArgs(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
public readonly int hour;
public readonly int minute;
public readonly int second;
}
// lp chnh ca ta.
public class Clock
{
// delegate m subscribers phi ci t
public delegate void SecondChangeHandler( object clock,
TimeInfoEventArgs timeInformation);
// s kin publish
public event SecondChangeHandler OnSecondChange;
// vn hnh ng h
// hm s pht sinh s kin sau mi giy
public void Run( )
{
for(;;)
{
// ng 10 milli giy
Thread.Sleep(10);
// ly gi hin ti
System.DateTime dt = System.DateTime.Now;
// nu thi gian thay i
// thng bo cho cc subscriber
if (dt.Second != second)
{
106
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
// to i tng TimeInfoEventArgs
// truyn cho subscriber
TimeInfoEventArgs timeInformation=new TimeInfoEventArgs(
dt.Hour,dt.Minute,dt.Second);
// nu c subscriber, thng bo cho chng
if (OnSecondChange != null)
{
OnSecondChange( this,timeInformation );
}
}
// cp nht trng thi
this.second = dt.Second;
this.minute = dt.Minute;
this.hour = dt.Hour;
}
}
private int hour;
private int minute;
private int second;
}
public class DisplayClock
{
// subscribe s kin SecondChangeHandler ca theClock
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(TimeHasChanged);
}
// phng thc ci t hm delegated
public void TimeHasChanged( object theClock,
` TimeInfoEventArgs ti)
{
Console.WriteLine("Current Time: {0}:{1}:{2}",
ti.hour.ToString( ),
ti.minute.ToString( ),
ti.second.ToString( ));
}
}
public class LogCurrentTime
{
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(WriteLogEntry);
}
107
Delegate v Event Gvhd: Nguyn Tn Trn Minh Khang
108
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
Chng 13 Lp trnh vi C#
Phn ny s gii thiu chi tit v cch vit cc chng trnh .NET, bao gm
Windows Forms v Web Forms. Ngoi ra, chng ta s kho st thm v cch tng
tc vi c s d liu (Database) v cc dch v Web (Web Services).
Quan im v kin trc .NET l to s d dng, thun tin khi pht trin cc phn
mm theo tnh hng i tng. Vi mc ch ny, tng trn cng ca kin trc
.NET c thit k bao gm hai phn: ASP.NET v Windows Form. ASP.NET
c dng cho hai mc ch chnh: hoc to cc ng dng Web vi Web Forms
hoc to cc i tng Web (Web Objects) khng c giao din ngi dng (User
Interface: UI) vi Web Services.
Ta s kho st chi tit cc mc chnh sau :
1. Cch to ra cc ng dng Windows c tnh chuyn nghip cao trong mi
trng pht trin Windows Form mt cch nhanh chng theo m hnh RAD (
Rapid Application Development ).
2. c th truy cp d liu trong cc h qun tr d liu, ta s tho lun chi tit
v ADO.NET v cch tng tc vi Microsoft SQL Server v cc trnh cung
cp d liu (Providers Data ) khc.
3. L s kt hp cng ngh RAD trong phn (1) v ADO.NET trong phn (2)
minh ha vic to ra cc ng dng Web vi Web Forms.
4. Khng phi tt c mi ng dng u c giao din ngi dng thn thin. Web
Services gip to cc ng dng nh vy, chng l nhng ng dng c tnh
phn phi, cung cp cc chc nng da trn cc nghi thc Web chun, thng
dng nht l XML v HTTP.
109
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
110
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
111
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
112
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
public HandDrawnClass( )
{
// To cc i tng
this.lblOutput = new System.Windows.Forms.Label ( );
this.btnCancel = new System.Windows.Forms.Button ( );
// Chy ng dng
public static void Main()
{
Application.Run(new HandDrawnClass( ));
}
}
}
113
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
114
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
115
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
116
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label lblOutput;
private System.Windows.Forms.Button btnCancel;
/// <summary>
/// Required designer variable.
/// </summary>
117
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
public Form1( )
{
InitializeComponent( );
}
//
// lblOutput
//
this.lblOutput.Font = new System.Drawing.Font("Arial",
15.75F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point,((System.Byte)(0)));
this.lblOutput.Location = new System.Drawing.Point(24, 16);
this.lblOutput.Name = "lblOutput";
this.lblOutput.Size = new System.Drawing.Size(136, 48);
this.lblOutput.TabIndex = 0;
this.lblOutput.Text = "Hello World";
// btnCancel
this.btnCancel.Location = new System.Drawing.Point(192, 208);
this.btnCancel.Name = "btnCancel";
this.btnCancel.TabIndex = 1;
this.btnCancel.Text = "Cancel";
this.btnCancel.Click +=
new System.EventHandler( this.btnCancel_Click );
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[]{
this.btnCancel, this.lblOutput});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
118
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main( )
{
Application.Run(new Form1( ));
}
}
}
So vi on m ta g vo trong ng dng trc th m do IDE pht sinh khng khc
g nhiu. Cc dng ch thch c dng lm su liu bo co cho d n. (mc
ny s c tho lun sau)
/// <summary>
/// Summary description for Form1.
/// </summary>
Cc m to v hiu chnh i tng thay v c t trc tip vo hm khi to ca
Form, th y IDE t chng vo trong hm InitializeComponent(), Sau hm
ny c gi bi hm khi to ca Form. Mi ng dng Windows Form u pht
sinh ra hm ny.
119
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
120
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
Sau khi to giao din xong, ta t thuc tnh CheckBoxes cho cy bn tri c tn
tvwSource thnh true, cn cy bn phi c tn tvwTargetDir thnh false, thc
hin ta n gin ch chn v sa i trn ca s thuc tnh ca tng i tng. Khi
ta nhn p ln bt k iu khin no th t ng Visual Studio .NET s pht sinh
ra m tng ng bt s kin ca iu khin v t con tr ( Cursor ) vo ngay
ti hm , ta nhn p vo Button Cancel v b sung m nh sau :
protected void btnCancel_Click( object sender, System.EventArgs e)
{
Application.Exit( );
}
121
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
FillDirectoryTree(tvwSource, true);
FillDirectoryTree(tvwTargetDir, false);
i tng TreeNode
iu khin TreeView c mt thuc tnh Nodes. thuc tnh ny nhn vo mt i
tng TreeNodeCollection , i tng ny thc cht l mt mng cha cc i
tng TreeNode, mi mt TreeNode l mt nt trn cy.
Trc tin ta cn khi to cy v rng :
tvw.Nodes.Clear( );
Sau ta gi hm tnh GetLogicalDrives() ca i tng Enviroment ly v tt
c cc a logic hin ang c trn my. i tng Enviroment cung cp cc thng
tin nh : tn my tnh, phin bn h iu hnh, h thng th mc trn my tnh
hin hnh.
string[] strDrives = Environment.GetLogicalDrives( );
strDrives s cha tn cc a logic hin c trn my.
Sau ta s duyt qua tng a bng cch dng lnh foreach. Vi mi a logic,
ta gi hm GetDirectories() ca i tng DirectoryInfo. Hm ny s tr v danh
sch cc i tng DirectoryInfo, cha tt c cc tp tin v th mc trn a logic
. Nhng ti y ta khng quan tm n kt qu m n tr v, mc ch ta gi hm
ny ch yu l kim tra xem cc a c hp l hay khng, nu c bt k mt li
no trn a th hm GetDirectories() s qung ra mt ngoi l. Ta s dng khi
bt li trycatch bt li ny.
foreach (string rootDirectoryName in strDrives)
{
DirectoryInfo dir = new DirectoryInfo(rootDirectoryName);
dir.GetDirectories( );
...
}
Khi a hp l, ta s to ra mt TreeNode ng vi rootDirectoryName a ,
chng hn nh : C:\, D:\ Ri thm TreeNode ny vo iu khin cy dng
hm Add() thng qua thuc tnh Nodes ca cy.
TreeNode ndRoot = new TreeNode(rootDirectoryName);
tvw.Nodes.Add(ndRoot);
Tip theo ta tin hnh duyt trn mi th mc con ca i tng TreeNode gc trn,
lm iu ny ta gi hm GetSubDirectoriesNodes( ), hm ny cn nhn vo cc
i s : TreeNode gc, tn ca n v c xc nh l c y c tp tin vo cy hay
khng.
if (isSource)
{
GetSubDirectoryNodes(ndRoot, ndRoot.Text, true);
}
else
{
GetSubDirectoryNodes(ndRoot, ndRoot.Text, false);
}
122
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
123
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
124
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
125
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
126
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
{
FileInfo file = new File(fileName);
if (file.Exists)
fileList.Add(file);
}
127
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
/// <remarks>
/// chp tp tin ng dng minh ha cho Windows Form
/// </remarks>
namespace FileCopier
{
/// <summary>
/// Form minh ha cho ng dng Windows Form
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// lp bn trong ca lp Form1, so snh 2 tp tin
/// </summary>
public class FileComparer : IComparer
{
public int Compare (object f1, object f2)
{
FileInfo file1 = (FileInfo) f1;
FileInfo file2 = (FileInfo) f2;
if (file1.Length > file2.Length)
{
return -1;
}
if (file1.Length < file2.Length)
{
return 1;
}
return 0;
}
}
public Form1( )
{
InitializeComponent( );
// y d liu vo cy bn tri v bn phi
FillDirectoryTree(tvwSource, true);
FillDirectoryTree(tvwTargetDir, false);
}
/// <summary>
/// phng thc ny dng y d liu vo cy
/// </summary>
private void FillDirectoryTree(TreeView tvw, bool isSource)
{
// trc khi y d liu vo cy, ta phi xa b cc nt
// hin ang tn ti trn cy.
tvw.Nodes.Clear( );
128
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
{
if (rootDirectoryName != @"C:\")
continue;
try
{
// nu a khng hp l ta s qung ra mt li.
DirectoryInfo dir =
new DirectoryInfo(rootDirectoryName);
dir.GetDirectories( );
TreeNode ndRoot = new TreeNode(rootDirectoryName);
// thm nt gc vo cy
tvw.Nodes.Add(ndRoot);
/// <summary>
/// ly v tt c cc th mc con ca nt cha truyn vo,
/// thm cc th mc con tm c vo cy
/// hm ny c 3 i s : nt cha, tn y ca nt cha,
/// v bin c getFileNames xc nh c ly tp tin khng
/// </summary>
private void GetSubDirectoryNodes( TreeNode parentNode,
string fullName, bool getFileNames)
{
DirectoryInfo dir = new DirectoryInfo(fullName);
DirectoryInfo[] dirSubs = dir.GetDirectories( );
/// <summary>
/// ta ch cn tn nt thm vo cy, cn ta phi
/// truyn vo tn ng dn y ca nt trn cy
/// cho hm lp qui GetSubDirectoryNodes() n c
/// th tm c cc nt con ca nt
/// </summary>
TreeNode subNode = new TreeNode(dirSub.Name);
129
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
parentNode.Nodes.Add(subNode);
// lp qui hm GetSubDirectoryNodes().
GetSubDirectoryNodes(
subNode,dirSub.FullName,getFileNames);
}
if (getFileNames)
{
// ly mi tp tin thuc nt
FileInfo[] files = dir.GetFiles( );
/// <summary>
130
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
/// <summary>
/// bt s kin xa b cc nt c chn trn cy bn tri
/// </summary>
private void btnClear_Click( object sender, System.EventArgs e)
{
// ly v nt gc trn cy bn tri v
// tin hnh lp qui
foreach (TreeNode node in tvwSource.Nodes)
{
SetCheck(node, false);
}
}
/// <summary>
/// m bo ngi dng mun xa nt
/// </summary>
private void btnDelete_Click(object sender, System.EventArgs e)
{
// xc nhn xa
System.Windows.Forms.DialogResult result = MessageBox.Show(
"Are you quite sure?", // thng ip
"Delete Files", // tiu
MessageBox.Buttons.OKCancel, // nt nhn
MessageBox.Icon.Exclamation, // biu tng
MessageBoxDefaultButton.Button2); // nt mc nh
// nu ng xa
if (result == System.Windows.Forms.DialogResult.OK)
{
// duyt danh sch cc tp tin v xo cc tp tin
/ c chn
ArrayList fileNames = GetFileList( );
foreach (FileInfo file in fileNames)
{
try
{
// cp nht nhn
lblStatus.Text = "Deleting " +
txtTargetDir.Text + "\\" + file.Name + "...";
Application.DoEvents( );
file.Delete( );
}
catch (Exception ex)
{
// hp thoi thng bo
MessageBox.Show(ex.Message);
}
}
lblStatus.Text = "Done.";
Application.DoEvents( );
131
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
}
}
/// <summary>
/// ly ng dn y ca nt c chn v gn vo
/// iu khin TextBox txtTargetDir
/// </summary>
private void tvwTargetDir_AfterSelect( object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
// ly ng dn y ca nt
string theFullPath = GetParentString(e.Node);
/// <summary>
/// nh du chn nt hin hnh v cc nt con ca n
/// </summary>
private void tvwSource_AfterCheck(object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
SetCheck(e.Node,e.Node.Checked);
}
/// <summary>
/// lp qui vic nh du chn hay loi b du chn trn
/// nt trun vo da vo c check
/// </summary>
private void SetCheck(TreeNode node, bool check)
{
// set this node's check mark
node.Checked = check;
// tm tt c cc nt con ca nt
foreach (TreeNode n in node.Nodes)
{
// nu l nt l th ta nh du chn hoc khng chn
if (node.Nodes.Count == 0)
node.Checked = check;
// nu khng l l th ta lp qui
else
SetCheck(n,check);
}
}
132
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
// nu l nt l
if (node.Nodes.Count == 0)
{
// nu nt l nh du chn
if (node.Checked)
{
// ly ng dn y ca nt v thm vo cy
string fullPath = GetParentString(node);
fileNames.Add(fullPath);
}
}
else // khng l nt l
{
// thc hin trn tt c nt con
foreach (TreeNode n in node.Nodes)
{
GetCheckedFiles(n,fileNames);
}
}
}
/// <summary>
/// ly v ng dn y ca nt truyn vo
/// </summary>
private string GetParentString(TreeNode node)
{
// nu l nt gc th tr v tn nt ( c:\ )
if(node.Parent == null)
return node.Text;
else
// nu l nt cha th thm du // vo chui tr v
// nu nt l ta khng thm g c
return GetParentString(node.Parent) + node.Text +
(node.Nodes.Count == 0 ? "" : "\\");
}
/// <summary>
/// tr v danh sch cc tp tin c chn theo th t
/// </summary>
private ArrayList GetFileList( )
{
// danh sch tn tp tin y khng c sp
ArrayList fileNames = new ArrayList( );
133
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
// to ra mt th hin IComparer
IComparer comparer = (IComparer) new FileComparer( );
Ta cng c th to su liu XML trc tip ngay trong Visual Studio .NET, bng
cch nhn chut phi ln biu tng ca d n v chn Properties hin ln hp
thoi thuc tnh ca d n (Property Pages), sau chn mc Configuration
Properties \ Build ri g tn tp tin su liu XML cn to ra vo dng XML
Document File. Khi bin dch d n, tp tin su liu XML s t ng c to ra
trong th mc cha d n. Di y l mt on m c trch ra t tp tin su liu
XML c to ra t ng dng FileCopier trn :
<?xml version="1.0"?>
<doc>
<assembly>
<name>FileCopier</name>
</assembly>
<members>
<member name="T:FileCopier.Form1">
<summary>
Form demonstrating Windows Forms implementation
</summary>
</member>
<member name="F:FileCopier.Form1.components">
<summary>
Required designer variable.
</summary>
</member>
<member name="F:FileCopier.Form1.tvwTargetDir">
<summary>
Tree view of potential target directories
134
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
</summary>
</member>
<member name="F:FileCopier.Form1.tvwSource">
<summary>
Tree view of source directories
includes check boxes for checking
chosen files or directories
</summary>
</member>
<member name="F:FileCopier.Form1.txtTargetDir">
Do on m trn c nh dng di kiu di dng XML, do khng thun tin
lm khi quan st. Ta c th vit mt tp tin theo nh dng XSLT chuyn t nh
dng XML sang HTML.
Mt cch n gin hn to su liu XML thnh cc bo co HTML d c hn
l dng chc nng Tool \ Build Command Web Page , VS.NET s t ng to ra
mt tp cc tp tin su liu HTML tng ng vi tp tin XML. Di y l giao
din ca mn hnh su liu ng dng FileCopier c to bi VS.NET :
Hnh 13-9 Su liu di dng Web c to bi Visual Studio .NET
135
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
136
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
137
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
138
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
139
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
140
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
141
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
142
Lp trnh vi C# Gvhd: Nguyn Tn Trn Minh Khang
143
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
144
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
D
DataSet l thnh phn chnh cho c trng kt ni khng lin tc ca kin trc
ADO.NET. DataSet c thit k c th thch ng vi bt k ngun d liu no.
DataSet cha mt hay nhiu i tng DataTable m n c to t tp cc dng
v ct d liu, cng vi kho chnh, kha ngoi, rng buc v cc thng tin lin
145
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
146
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
147
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
148
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
namespace ProgrammingCSharpWinForm
{
public class ADOForm1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private System.Windows.Forms.ListBox lbCustomers;
public ADOForm1( )
{
InitializeComponent( );
149
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
// y d liu vo DataSet
DataAdapter.Fill(DataSet,"Customers");
// ly v mt bng d liu
DataTable dataTable = DataSet.Tables[0];
150
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
151
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
// chui kt ni n c s d liu
string connectionString = "provider=Microsoft.JET.OLEDB.4.0;"
+ "data source = c:\\nwind.mdb";
// y d liu vo dataSet
DataAdapter.Fill(DataSet,"Customers");
152
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
Trong ng dng trc, ta phi duyt qua tng dng ca i tng DataTable ly
d liu, sau hin th chng ln iu khin ListBox. Trong ng dng ny cng
vic hin th d liu ln iu khin c thc hin n gin hn, ta ch cn ly v
i tng DataView ca DataSet, sau gn DataView ny cho thuc tnh
DataSource ca iu khin li, sau gi hm DataBind() th t ng d liu s
c y ln iu khin li d liu.
CustomerDataGrid.DataSource =
DataSet.Tables["Customers"].DefaultView;
Trc tin ta cn to ra i tng li trn Form bng cch ko th, t tn li cho
iu khin li l CustomerDataGrid. Sau y l m hon chnh ca ng dng kt
buc d liu cho iu khin li :
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace ProgrammingCSharpWindows.Form
{
public class ADOForm3 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private System.Windows.Forms.DataGrid CustomerDataGrid;
public ADOForm3( )
{
InitializeComponent( );
153
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
154
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
SqlDataAdapter DataAdapter =
new SqlDataAdapter(commandString, connectionString);
V d sau y s minh ha vic ly v i tng DataSet bng cch to ra cc i
tng Connection v Command mt cch ring bit, khi ta cn dng li chng hay
mun thc hin hon chnh mt thao tc th s thun li hn.
u tin ta s khai bo bn bin thnh vin thuc lp, nh sau :
private System.Data.SqlClient.SqlConnection myConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
i tng Connection s c to ring vi chun kt ni :
string connectionString =
"server=localhost; uid=sa; pwd=; database=northwind";
myConnection = new
System.Data.Sql.SqlConnection(connectionString);
Sau ta s m kt ni :
myConnection.Open( );
Ta c th thc hin nhiu giao tc trn c s d liu khi kt ni c m v sau khi
dng xong ta ch n gin ng kt ni li. Tip theo ta s to ra i tng DataSet:
myDataSet = new System.Data.DataSet( );
V tip tc to i tng Command, gn cho n i tng Connection m v
chui truy vn d liu :
myCommand = new System.Data.SqlClient.SqlCommand( )
myCommand.Connection=myConnection;
myCommand.CommandText = "Select * from Customers";
Cui cng ta cn to ra i tng SqlDataAdapter, gn i tng SqlCommand va
to trn cho n, ng thi phi tin hnh nh x bng d liu n nhn c t cu
truy vn ca i tng Command to s ng nht v tn cc ct khi y bng
d liu ny vo DataSet.
DataAdapter = new System.Data.SqlClient.SqlDataAdapter( );
DataAdapter.SelectCommand= myCommand;
DataAdapter.TableMappings.Add("Table","Customers");
DataAdapter.Fill(myDataSet);
By gi ta ch vic gn DataSet vo thuc tnh DataSoucre ca iu khin li:
dataGrid1.DataSource=myDataSet.Tables["Customers"].DefaultView;
Di y l m hon chnh ca ng dng ny :
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace ProgrammingCSharpWindows.Form
{
155
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
public ADOForm1( )
{
InitializeComponent( );
// to i tng connection v m n
string connectionString =
"server=Neptune; uid=sa; pwd=oWenmEany;" +
"database=northwind";
myConnection = new SqlConnection(connectionString);
myConnection.Open();
// to i tng DataSet mi
myDataSet = new DataSet( );
// y d liu vo DataSet
DataAdapter.Fill(myDataSet);
// gn d liu vo li
dataGrid1.DataSource =
myDataSet.Tables["Customers"].DefaultView;
}
156
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
this.Text = "ADOFrm1";
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(536, 501);
this.Controls.Add(this.dataGrid1);
dataGrid1.EndInit( );
}
157
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
namespace ProgrammingCSharpWindows.Form
{
public class ADOForm1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private System.Windows.Forms.DataGrid dataGrid1;
private System.Data.SqlClient.SqlConnection myConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlCommand myCommand2;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
private System.Data.SqlClient.SqlDataAdapter DataAdapter2;
public ADOForm1( )
{
InitializeComponent( );
// to kt ni
string connectionString = "server=Neptune; uid=sa;" +
" pwd=oWenmEany; database=northwind";
158
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
// to DataSet
myDataSet = new System.Data.DataSet( );
159
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
dataGrid1.DataMember = "";
dataGrid1.TabIndex = 0;
this.Text = "ADOFrm1";
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size (536, 501);
this.Controls.Add (this.dataGrid1);
dataGrid1.EndInit ( );
}
160
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
161
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
162
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
163
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
{
DataRow[] errorRows = theTable.GetErrors( );
foreach (DataRow theRow in errorRows)
msg = msg + theRow["CustomerID"];
}
}
lblMessage.Text = msg;
}
164
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
namespace ProgrammingCSharpWindows.Form
{
public class ADOForm1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox txtPhone;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.TextBox txtContactTitle;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox txtZip;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox txtCity;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox txtAddress;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox txtContactName;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox txtCompanyName;
165
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
public ADOForm1( )
{
InitializeComponent( );
string connectionString = "server=Neptune; uid=sa;" +
" pwd=oWenmEany; database=northwind";
string commandString = "Select * from Customers";
DataAdapter =
new SqlDataAdapter(commandString, connectionString);
DataSet = new DataSet( );
DataAdapter.Fill(DataSet,"Customers");
PopulateLB( );
}
166
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
this.txtContactTitle=new System.Windows.Forms.TextBox();
this.txtAddress = new System.Windows.Forms.TextBox();
this.txtCompanyName=new System.Windows.Forms.TextBox( );
this.label5 = new System.Windows.Forms.Label( );
this.label6 = new System.Windows.Forms.Label( );
this.label7 = new System.Windows.Forms.Label( );
this.label8 = new System.Windows.Forms.Label( );
this.label9 = new System.Windows.Forms.Label( );
this.label4 = new System.Windows.Forms.Label( );
this.lbCustomers = new System.Windows.Forms.ListBox( );
this.txtPhone = new System.Windows.Forms.TextBox( );
this.btnNew = new System.Windows.Forms.Button( );
this.label1 = new System.Windows.Forms.Label( );
this.label2 = new System.Windows.Forms.Label( );
this.label3 = new System.Windows.Forms.Label( );
txtCustomerName.Location =
new System.Drawing.Point(256, 120);
txtCustomerName.TabIndex = 4;
txtCustomerName.Size = new System.Drawing.Size(160, 20);
txtCity.Location = new System.Drawing.Point(384, 245);
txtCity.TabIndex = 15;
txtCity.Size = new System.Drawing.Size (160, 20);
txtCompanyID.Location =
new System.Drawing.Point (136, 216);
txtCompanyID.TabIndex = 7;
txtCompanyID.Size = new System.Drawing.Size (160, 20);
lblMessage.Location = new System.Drawing.Point(32, 368);
lblMessage.Text = "Press New, Update or Delete";
lblMessage.Size = new System.Drawing.Size (416, 48);
lblMessage.TabIndex = 1;
btnUpdate.Location = new System.Drawing.Point (32, 120);
btnUpdate.Size = new System.Drawing.Size (75, 23);
btnUpdate.TabIndex = 0;
btnUpdate.Text = "Update";
btnUpdate.Click +=
new System.EventHandler (this.btnUpdate_Click);
txtContactName.Location =
new System.Drawing.Point(136, 274);
txtContactName.TabIndex = 11;
txtContactName.Size = new System.Drawing.Size (160, 20);
txtZip.Location = new System.Drawing.Point (384, 274);
txtZip.TabIndex = 17;
txtZip.Size = new System.Drawing.Size (160, 20);
btnDelete.Location = new System.Drawing.Point(472, 120);
btnDelete.Size = new System.Drawing.Size(75, 23);
btnDelete.TabIndex = 2;
btnDelete.Text = "Delete";
btnDelete.Click +=
new System.EventHandler (this.btnDelete_Click);
txtContactTitle.Location =
new System.Drawing.Point(136, 303);
txtContactTitle.TabIndex = 19;
txtContactTitle.Size = new System.Drawing.Size(160, 20);
txtAddress.Location = new System.Drawing.Point(384, 216);
txtAddress.TabIndex = 13;
txtAddress.Size = new System.Drawing.Size (160, 20);
txtCompanyName.Location= new System.Drawing.Point (136, 245);
txtCompanyName.TabIndex = 9;
167
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
168
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
this.Controls.Add (this.txtCity);
this.Controls.Add (this.label5);
this.Controls.Add (this.txtAddress);
this.Controls.Add (this.label4);
this.Controls.Add (this.txtContactName);
this.Controls.Add (this.label3);
this.Controls.Add (this.txtCompanyName);
this.Controls.Add (this.label2);
this.Controls.Add (this.txtCompanyID);
this.Controls.Add (this.label1);
this.Controls.Add (this.btnNew);
this.Controls.Add (this.txtCustomerName);
this.Controls.Add (this.btnUpdate);
this.Controls.Add (this.lblMessage);
this.Controls.Add (this.btnDelete);
this.Controls.Add (this.lbCustomers);
}
// cp nht vo c s d liu
DataAdapter.Update(DataSet,"Customers");
// Xo trng cc TextBox
ClearFields( );
}
// Xa trng cc TextBox
private void ClearFields( )
{
txtCompanyID.Text = "";
txtCompanyName.Text = "";
txtContactName.Text = "";
txtContactTitle.Text = "";
txtAddress.Text = "";
169
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
txtCity.Text = "";
txtZip.Text = "";
txtPhone.Text = "";
}
// ly v cc dng thay i
DataSet DataSetChanged =
DataSet.GetChanges(DataRowState.Modified);
// m bo khng c dng no c li
bool okayFlag = true;
if (DataSetChanged.HasErrors)
{
okayFlag = false;
string msg = "Error in row with customer ID ";
// nu khng c li
if (okayFlag)
{
// trn cc thay i trong 2 DataSet thnh mt
DataSet.Merge(DataSetChanged);
// cp nht c s d liu
170
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
DataAdapter.Update(DataSet,"Customers");
// cp nht DataSet v
// hin th d liu mi cho ListBox
DataSet.AcceptChanges( );
PopulateLB( );
}
else // nu c li
DataSet.RejectChanges( );
}
// qun l s kin xa
protected void btnDelete_Click( object sender, EventArgs e)
{
// ly v dng c chn trn ListBox
DataRow targetRow =
dataTable.Rows[lbCustomers.SelectedIndex];
// xa dng c chn
dataTable.Rows[lbCustomers.SelectedIndex].Delete( );
// cp nht c s d liu
DataAdapter.Update(DataSet,"Customers");
// hin th li ListBox vi d liu thay i
PopulateLB( );
171
Truy cp d liu vi ADO.NET Gvhd: Nguyn Tn Trn Minh Khang
172
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
173
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
174
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
175
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
176
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
177
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
Hnh 15-4
178
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
15.4 Mt s v d mu minh ha
Mt cch thun tin nht hc mt cng ngh mi chnh l da vo cc v d, v
vy trong phn ny chng ta s kho st mt vi v d minh ha cho phn l
thuyt ca chng ta. Nh ta bit, ta c th vit m qun l theo hai cch : hoc l
vit trong tp tin .cs hoc l vit trc tip trong trang cha m HTML. y d
tp trung vo cc v d ca chng ta, ta s vit m qun l trc tip trn trang
HTML.
179
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
</head>
<body>
<h3><font face="Verdana"> Ket buoc khong dung DataSource
</font></h3>
<form runat=server>
Khach hang: <b><%# custID %></b><br>
So hoa don: <b><%# orderCount %></b>
</form>
</body>
</html>
Hnh 15-5 Giao din ca v d
180
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
// nu trang c gi ln u tin
if (!Page.IsPostBack) {
<body>
181
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="4"
CellSpacing="0">
// y l mt thuc tnh ca li, khi gi hm
// DabaBind(), d liu trong DataSource s c trch ra
// (nu l danh cc i tng th mi ln trch s ly ra
// mt phn t kiu i tng , sau dng hm
// DataBinder.Eval() gn gi tr, cn nu l mt bng
// d liu th mi ln kt buc s ly ra mt dng d
// liu, hm DataBind.Eval() s ly d liu ca tng
// trng) kt buc ln trang. N s lp li thao tc
// ny cho ti khi d liu c kt buc ht.
<ItemTemplate>
//ly d liu trn ct u tin kt buc
Ngay hoa don: <%# DataBinder.Eval(Container.DataItem,
"DateTimeValue", "{0:d}") %>
//ct th 3
Muc: <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
//ct th 4
Ngay hoa don: <asp:CheckBox id=chk1 Checked='<%#
(bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>'
runat=server/><p>
</ItemTemplate>
</asp:Datalist>
</form>
</body>
</html>
182
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
183
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
//sau khi hiu chnh d liu, ngi dng tin hnh cp nht public
void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e) {
184
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
//xa dng c
CartView.RowFilter = "Item='"+item+"'";
if (CartView.Count > 0) {
CartView.Delete(0);
}
CartView.RowFilter = "";
</script>
<form runat="server">
<h3><font face="Verdana">Using an Edit Command Column in
DataGrid</font></h3>
185
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
</form>
</body>
</html>
Giao din ca v d khi chy :
Hnh 15-7 Hiu chnh trc tip trn li d liu
Sau khi ngi dng chn nt Edit trn li, mn hnh ng dng s nh sau :
186
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
187
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
<html>
<head>
<script language="C#" runat=server>
<body>
<h3><font face="Verdana">V d v xc nhn iu khin hp l
ValidationSummary</font></h3>
<p>
<form runat="server">
<table cellpadding=10><tr> <td>
<table bgcolor="#eeeeee" cellpadding=10><tr><td colspan=3>
<td>
// danh sch cc nt chn c bt li bi iu //khin xc nhn hp
l RequireFieldValidator1
<ASP:RadioButtonList id=RadioButtonList1 RepeatLayout="Flow"
runat=server>
<asp:ListItem>MasterCard</asp:ListItem>
<asp:ListItem>Visa</asp:ListItem>
</ASP:RadioButtonList>
</td>
<tr>
<td align=right>
<font face=Verdana size=2>Card Number:</font>
</td>
<td>
<ASP:TextBox id=TextBox1 runat=server />
</td>
<td>
188
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
189
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
<td>
//nt nhn xc nh hp l
<ASP:Button id=Button1 text="Validate" runat=server /></td></tr>
</table>
</td>
<td valign=top>
<table cellpadding=20><tr><td>
</form>
</body>
</html>
Giao din ca v d khi chy :
190
ng dng Web vi Web Forms Gvhd: Nguyn Tn Trn Minh Khang
Hnh 15-10 Hin th li do b trng trn TextBox theo dng du chm trn Bullet
191
Cc dch v Web Gvhd: Nguyn Tn Trn Minh Khang
192
Cc dch v Web Gvhd: Nguyn Tn Trn Minh Khang
namespace MathService
{
public class MathService :System.Web.Services.WebService
{
public MathService()
{
InitializeComponent();
}
}
protected override void Dispose( bool disposing )
193
Cc dch v Web Gvhd: Nguyn Tn Trn Minh Khang
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
[WebMethod]
public float Subtract(float a, float b)
{
return a - b;
}
[WebMethod]
public float Multiply(float a, float b)
{
return a * b;
}
[WebMethod]
public float Divide(float a, float b)
{
if (b==0) return -1;
return a / b;
}
}
}
By gi chng ta s vit m thc thi cho trang Web. Trang Web ca chng ta s gi
cc hm ca dch v tng ng vi cc php cng, tr, nhn, chia . Sau y l m
ca trang Web:
<%@ Import Namespace="MathService" %>
<html>
<script language="C#" runat="server">
float operand1 = 0;
float operand2 = 0;
public void Submit_Click(Object sender, EventArgs E)
{
try
{
operand1 = float.Parse(Operand1.Text);
operand2 = float.Parse(Operand2.Text);
}
catch (Exception) { /* b qua li nu c */ }
194
Cc dch v Web Gvhd: Nguyn Tn Trn Minh Khang
</script>
Operand 2:<br>
<asp:TextBox id="Operand2" Text="5" runat="server"
/><p>
195
Assemblies v Versioning Gvhd: Nguyn Tn Trn Minh Khang
17.1 Tp tin PE
Assembly c lu tr trn da t theo dng thc tp tin Portable Executable (PE).
Dng thc tp tin PE ca .NET cng ging nh tp tin PE bnh thng ca
Windows NT. Dng thc PE c ci t thnh dng thc tp tin DLL v EXE.
V mt logic, assembly cha ng mt hay nhiu module. Mi module c t
chc thnh mt DLL v ng thi mi module l mt cu thnh ca assembly. Cc
module t bn thn chng khng th chy c, cc module phi kt hp vi nhau
thnh assembly th mi c th lm c vic g hu ch.
17.2 Metadata
Metadata l thng tin c lu tr bn trong assembly vi mc ch l m t cc
kiu d liu, cc phng thc v cc thng tin khc v assembly. Do c cha
metadata nn assembly c kh nng t m t.
17.5 Manifest
Manifest chnh l mt thnh phn ca metadata. Manifest m t mt assembly cha
nhng g, v d nh: thng tin nhn dng (tn, phin bn), danh sch cc kiu d
196
Assemblies v Versioning Gvhd: Nguyn Tn Trn Minh Khang
liu, danh sch cc resource, danh sch cc assembly khc c assembly ny tham
chiu n,
197
Assemblies v Versioning Gvhd: Nguyn Tn Trn Minh Khang
17.8.2 Phin bn
Assembly chia s trong .NET c nh v bng tn duy nht (unique) v phin bn.
Phin bn c biu din bi 4 s phn cch bng du : v d nh 1:2:6:1246
S u tin m t phin bn chnh (major version)
S th 2 m t phin bn ph (minor version)
S th 3 m t th t bn xy dng (build)
S cui cng m t ln xem xt cp nht (revision) sa li
198
Assemblies v Versioning Gvhd: Nguyn Tn Trn Minh Khang
17.8.3 Tn mnh
Mt tn mnh l mt chui cc k t hexa mang thuc tnh l duy nht trong ton
cu (globally unique). Ngoi ra chui cn c m ha bng thut ton kha
cng khai 1 bo m rng assembly khng b thay i v tnh hay c .
to ra tn mnh, mt cp kha cng khai-b mt c to ra cho assembly. Mt
m bm (hash code) c to ra t tn, ni dung ca cc tp tin bn trong assembly
v chui biu din kha cng khai. Sau m bm ny c m ha bng kha b
mt, kt qu m ha c ghi vo manifest. Qu trnh trn c gi l k xc nhn
vo assembly (signing the assembly).
Khi assembly c CLR np vo b nh, CLR s dng kha cng khai trong
manifest gii m m bm xc nh xem assembly c b thay i khng.
1
M ha kha cng khai b mt: l mt thut ton m ha c bit, u tin dng mt
thut ton ring to ra 2 kha, mt kha ph bin rng ri nn gi l kha cng khai, kha cn li
do ch nhn ca n ct ni an ton nn gi l b mt. Sau dng thut ton m ha m ha d
liu. Mt khi d liu b m ha bng mt kha th d liu ch c th c gii m bng kha kia
v ngc li.
199
Attributes v Reflection Gvhd: Nguyn Tn Trn Minh Khang
18.1 Attributes
Mt attribute l mt i tng, trong i tng cha mt mu d liu, m lp
trnh vin mun nh km vi mt phn t (element) no trong ng dng. Phn
t (element) m lp trnh vin mun nh km attribute gi l mc tiu (target) ca
attribute. V d attribute:
[NoIDispatch]
c nh km vi mt lp hay mt giao din ni rng lp ch (target class) nn
c tha k t giao din IUnknown ch khng phi tha k t IDispatch.
18.2.1 ch ca Attribute
Mi attribute ch ng hng n mt ch (target) m n khai bo. ch c th l
lp, giao din, phng thc Bng sau lit k tt c cc ch
Bng 18-1 Cc ch ca attribute
Loi ngha
All p dng cho tt c cc loi bn di
Assembly p dng cho chnh assembly
Class p dng cho mt th hin ca lp
ClassMembers p dng cho cc loi t sau hng ny tr i
200
Attributes v Reflection Gvhd: Nguyn Tn Trn Minh Khang
201
Attributes v Reflection Gvhd: Nguyn Tn Trn Minh Khang
18.3.2 t tn mt attribute
Lp trnh vin hon ton t do trong vic t tn cho attribute. Tuy nhin, compiler
ca .NET cn c thm kh nng t ni thm chui Attribute vo tn. iu c
ngha l nu lp trnh vin nh ngha mt attribute c tn l MyBugFix th khi
tm kim hoc truy xut attribute trn, lp trnh vin c th vit tn attribute:
MyBugFix hoc MyBugFixAttribute. Nu mt attribute c tn l
MyBugFixAttribute th lp trnh vin cng c th ghi tn attribute l
MyBugFix hoc MyBugFixAttribute.
V d:
[MyBugFix(123, "Jesse Liberty", "01/01/05", Comment="Off by one")]
202
Attributes v Reflection Gvhd: Nguyn Tn Trn Minh Khang
18.4 Reflection
cho vic lu attribute trong metadata c ch, cn phi c c ch truy xut chng
vo lc chy. Cc lp trong vng tn (namespace) Reflection, cng vi cc lp
trong System.Type v System.TypeReference, cung cp s h tr truy xut
metadata.
Reflection l mt khi nim chung cho bt k thao tc no trong cc thao tc sau
y:
Xem xt metadata
Tm hiu kiu d liu (type discovery): lp, interface, phng thc, i s ca
phng thc, properties, event, field,
Ni kt tr cc phng thc v properties (late binding to methods and
properties)
To ra mt kiu d liu mi ngay trong lc thc thi. Lp trnh vin c th nh
ngha mt assembly mi ngay lc chy, c th lu xung da t dng li.
203
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
204
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
205
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
19.2 Context
Min ng dng (app domain) n lt n li c chia ra thnh cc context.
Context c th xem nh mt ranh gii m cc i tng bn trong context c cng
quy tc s dng (usage rules). Cc quy tc s dng nh: ng b ha giao dch
(synchronization transaction),
206
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
207
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
19.3 Remoting
Cng vi vic marshaling i tng vt qua ranh gii context v min ng dng,
i tng c th c marshaling vt qua ranh gii process v thm ch qua ranh
gii my - mng - my. Khi mt i tng c marshaling vt qua ranh gii
process hay my - mng my, n c gi l Remoted.
208
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
// implement the calculator class
public class Calculator : MarshalByRefObject, ICalc
{
public Calculator( )
{
Console.WriteLine("Calculator constructor");
}
209
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
{
Console.WriteLine("Mult {0} * {1}", x, y);
return x*y;
}
210
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
public class CalcClient
{
public static void Main( )
{
int[] myIntArray = new int[3];
Console.WriteLine("Watson, come here I need you...");
// create an Http channel and register it
// uses port 0 to indicate won't be listening
HttpChannel chan = new HttpChannel(0);
ChannelServices.RegisterChannel(chan);
// get my object from across the http channel
MarshalByRefObject obj =
(MarshalByRefObject) RemotingServices.Connect
(typeof(Programming_CSharp.ICalc),
"http://localhost:65100/theEndPoint");
try
{
// cast the object to our interface
Programming_CSharp.ICalc calc =
obj as Programming_CSharp.ICalc;
// use the interface to call methods
double sum = calc.Add(3.0,4.0);
double difference = calc.Sub(3,4);
double product = calc.Mult(3,4);
double quotient = calc.Div(3,4);
// print the results
Console.WriteLine("3+4 = {0}", sum);
Console.WriteLine("3-4 = {0}", difference);
Console.WriteLine("3*4 = {0}", product);
Console.WriteLine("3/4 = {0}", quotient);
}
catch( System.Exception ex )
{
Console.WriteLine("Exception caught: ");
Console.WriteLine(ex.Message);
}
}
}
}
211
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
Div 3 / 4
212
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
213
Marshaling v Remoting Gvhd: Nguyn Tn Trn Minh Khang
214
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
Chng 20 Thread v S ng B
Thread l mt process nh cn cung cp kh nng multitasking trong mt ng
dng. Vng tn System.Threading cung cp nhiu lp v giao din h tr lp
trnh nhiu thread.
20.1 Thread
Thread thng c to ra khi bn mun lm ng thi 2 vic trong cng mt
thi im. Gi s ng dng ca bn ang tin hnh c vo b nh mt tp tin c
kch thc khong 500MB, trong lc ang c th d nhin ng dng khng th p
ng yu cu x l giao din. Gi s ngi dng mun ngng gia chng, khng
cho ng dng c tip tp tin ln na, do cn mt thread khc x l giao
din, lc ny khi ngi dng n nt Stop th ng dng p ng c yu cu trong
khi thread ban u vn ang c tp tin.
20.1.1 To Thread
Cch n gin nht l to mt th hin ca lp Thread. Contructor ca lp Thread
nhn mt tham s kiu delegate. CLR cung cp lp delegate ThreadStart nhm mc
ch ch n phng thc m bn mun thread mi thc thi. Khai bo delegate
ThreadStart nh sau:
public delegate void ThreadStart( );
Phng thc m bn mun gn vo delegate phi khng cha tham s v phi tr v
kiu void. Sau y l v d:
Thread myThread = new Thread( new ThreadStart(myFunc) );
myFunc phi l phng thc khng tham s v tr v kiu void.
Xin lu l i tng Thread mi to s khng t thc thi (execute), i tng
thc thi, bn cn gi phng thc Start() ca n.
Thread t1 = new Thread( new ThreadStart(Incrementer) );
Thread t2 = new Thread( new ThreadStart(Decrementer) );
t1.Start( );
t2.Start( );
Thread s chm dt khi hm m n thc thi tr v (return).
215
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
t2.Join( );
Nu cu lnh trn c thc hin bi thread 1, thread 1 s dng li v ch cho n
khi thread 2 kt thc.
20.2 ng b ha (Synchronization)
Khi bn cn bo v mt ti nguyn, trong mt lc ch cho php mt thread thay i
hoc s dng ti nguyn , bn cn ng b ha.
ng b ha c cung cp bi mt kha trn i tng , kha s ngn cn
thread th 2 truy cp vo i tng nu thread th nht cha tr quyn truy cp i
tng.
Sau y l v d cn s ng b ha. Gi s 2 thread s tin hnh tng tun t 1
n v mt bin tn l counter.
int counter = 0;
Hm lm thay i gi tr ca Counter:
public void Incrementer( )
{
try
{
while (counter < 1000)
{
int temp = counter;
temp++; // increment
// simulate some work in this method
Thread.Sleep(1);
// assign the Incremented value
216
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
217
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
218
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
if (counter < 5)
{
Monitor.Wait(this);
}
Li gi Wait() gii phng monitor nhng bn bo cho CLR bit l bn mun ly
li monitor ngay sau khi monitor c t do mt ln na. Thread thc thi phng
thc Wait() s b treo li. Cc thread ang treo v ch i monitor s tip tc chy
khi thread ang thc thi gi hm Pulse().
Monitor.Pulse(this);
Pulse() bo hiu cho CLR rng c s thay i trong trng thi monitor c th dn
n vic gii phng (tip tc chy) mt thread ang trong tnh trng ch i.
Khi thread hon tt vic s dng monitor, n gi hm Exit() tr monitor.
Monitor.Exit(this);
Source code v d:
namespace Programming_CSharp
{
using System;
using System.Threading;
class Tester
{
static void Main( )
{
// make an instance of this class
Tester t = new Tester( );
// run outside static Main
t.DoTest( );
}
public void DoTest( )
{
// create an array of unnamed threads
Thread[] myThreads = {
new Thread( new ThreadStart(Decrementer) ),
new Thread( new ThreadStart(Incrementer) ) };
// start each thread
int ctr = 1;
foreach (Thread myThread in myThreads)
{
myThread.IsBackground=true;
myThread.Start( );
myThread.Name = "Thread" + ctr.ToString( );
ctr++;
Console.WriteLine("Started thread {0}",myThread.Name);
Thread.Sleep(50);
}
// wait for all threads to end before continuing
foreach (Thread myThread in myThreads)
{
myThread.Join( );
}
// after all threads end, print a message
Console.WriteLine("All my threads are done.");
}
219
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
void Decrementer( )
{
try
{
// synchronize this area of code
Monitor.Enter(this);
// if counter is not yet 10
// then free the monitor to other waiting
// threads, but wait in line for your turn
if (counter < 10)
{
Console.WriteLine(
"[{0}] In Decrementer. Counter: {1}. Gotta Wait!",
Thread.CurrentThread.Name, counter);
Monitor.Wait(this);
}
while (counter >0)
{
long temp = counter;
temp--;
Thread.Sleep(1);
counter = temp;
Console.WriteLine("[{0}] In Decrementer. Counter: {1}.",
Thread.CurrentThread.Name, counter);
}
}
finally
{
Monitor.Exit(this);
}
}
void Incrementer( )
{
try
{
Monitor.Enter(this);
while (counter < 10)
{
long temp = counter;
temp++;
Thread.Sleep(1);
counter = temp;
Console.WriteLine("[{0}] In Incrementer. Counter: {1}",
Thread.CurrentThread.Name, counter);
}
// I'm done incrementing for now, let another
// thread have the Monitor
Monitor.Pulse(this);
}
finally
{
Console.WriteLine("[{0}] Exiting...",
Thread.CurrentThread.Name);
Monitor.Exit(this);
}
}
private long counter = 0;
}
220
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
}
Kt qu:
Started thread Thread1
[Thread1] In Decrementer. Counter: 0. Gotta Wait!
Started thread Thread2
[Thread2] In Incrementer. Counter: 1
[Thread2] In Incrementer. Counter: 2
[Thread2] In Incrementer. Counter: 3
[Thread2] In Incrementer. Counter: 4
[Thread2] In Incrementer. Counter: 5
[Thread2] In Incrementer. Counter: 6
[Thread2] In Incrementer. Counter: 7
[Thread2] In Incrementer. Counter: 8
[Thread2] In Incrementer. Counter: 9
[Thread2] In Incrementer. Counter: 10
[Thread2] Exiting...
[Thread1] In Decrementer. Counter: 9.
[Thread1] In Decrementer. Counter: 8.
[Thread1] In Decrementer. Counter: 7.
[Thread1] In Decrementer. Counter: 6.
[Thread1] In Decrementer. Counter: 5.
[Thread1] In Decrementer. Counter: 4.
[Thread1] In Decrementer. Counter: 3.
[Thread1] In Decrementer. Counter: 2.
[Thread1] In Decrementer. Counter: 1.
[Thread1] In Decrementer. Counter: 0.
All my threads are done.
20.3.2 Deadlock
Gi s thread A nm monitor ca ti nguyn X v ang ch monitor ca ti
nguyn Y. Trong khi th thread B li nm monitor ca ti nguyn Y v ch
221
Thread v S ng B Gvhd: Nguyn Tn Trn Minh Khang
222
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
21.1 Tp tin v th mc
Cc lp cp trong chng ny thuc v vng tn System.IO. Cc lp ny bao
gm lp File m phng cho mt tp tin trn a, v lp Directory m phng
cho mt th mc trn a.
21.1.1 Lm vic vi th mc
Lp Directory c nhiu phng thc dnh cho vic to, di chuyn, duyt th
mc. Cc phng thc trong lp Directory u l phng thc tnh;v vy khng
cn phi to mt th hin lp Directory m c th truy xut trc tip t tn lp.
Lp DirectoryInfo l lp tng t nh lp Directory. N cung cc tt c cc
phng thc m lp Directory c ng thi b sung nhiu phng thc hu ch
hn cho vic duyt cu trc cy th mc. Lp DirectoryInfo tha k t lp
FileSystemInfo, v v vy cng tha k lp MarshalByRefObj. Lp
DirectoryInfo khng c phng thc tnh, v vy cn to mt th hin lp trc
khi s dng cc phng thc.
C mt khc bit quan trong gia Directory v DirectoryInfo l cc phng
thc ca lp Directory s c kim tra v bo mt mi khi c gi trong khi
i tng DirectoryInfo ch kim tra mt ln vo lc khi to, cc phng thc
v vy s thc hin nhanh hn.
Di y l bng lit k cc phng thc quan trng ca hai lp
Bng 21-1 Cc phng thc lp Directory
Phong thc Gii thch
CreateDirectory() To tt c cc th mc v th mc con trong ng dn tham s.
Delete() Xo th mc v cc ni dung ca n.
223
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Tr v kt qu kiu logic, ng nu ng dn n th mc tn ti (c
Exists( )
ngha l th mc tn ti).
GetCreationTime( )
Ly/thit t ngy gi to th mc
SetCreationTime( )
GetCurrentDirectory( )
Ly/thit t th mc hin hnh
SetCurrentDirectory( )
GetDirectories( ) Ly v mt mng cc th mc con mt th mc
GetDirectoryRoot( ) Tr v th mc gc ca ng dn
GetFiles( ) Tr v mng chui tn cc tp tin cha trong mt th mc
GetLastAccessTime( )
Ly/thit t ngy gi ln truy cp cui cng n th mc
SetLastAccessTime( )
GetLastWriteTime( )
Ly/thit t ngy gi ln chnh sa cui cng ln th mc
SetLastWriteTime( )
GetLogicalDrives( ) Tr v tn ca tt c cc a logic theo nh dng <_a>:\
GetParent() Tr v th mc cha ca mt ng dn.
Move() Di chuyn th mc (c ni dung) n mt v tr khc.
224
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
class Tester
{
public static void Main()
{
Tester t = new Tester( );
// mt mt th mc
string theDirectory = @"c:\WinNT";
// duyt th mc v hin th ngy truy cp gn nht
// v tt c cc th mc con
DirectoryInfo dir = new DirectoryInfo(theDirectory);
t.ExploreDirectory(dir);
// hon tt. in ra s lng thng k
Console.WriteLine( "\n\n{0} directories found.\n",
dirCounter);
}
// vi mi th mc tm thy, n gi chnh n
private void ExploreDirectory(DirectoryInfo dir)
{
indentLevel++; // cp th mc
// nh dng cho vic trnh by
for (int i = 0; i < indentLevel; i++)
Console.Write(" "); // hai khong trng cho mi cp
// in th mc v ngy truy cp gn nht
Console.WriteLine("[{0}] {1} [{2}]\n",
indentLevel, dir.Name, dir.LastAccessTime);
// ly tt c th mc con ca th mc hin ti
// quy tng th mc
DirectoryInfo[] directories = dir.GetDirectories( );
foreach (DirectoryInfo newDir in directories)
{
225
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Kt qu (mt phn):
[2] logiscan [5/1/2001 3:06:41 PM]
[2] miitwain [5/1/2001 3:06:41 PM]
[1] Web [5/1/2001 3:06:41 PM]
[2] printers [5/1/2001 3:06:41 PM]
[3] images [5/1/2001 3:06:41 PM]
[2] Wallpaper [5/1/2001 3:06:41 PM]
363 directories found.
226
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
227
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
class Tester
{
public static void Main( )
{
Tester t = new Tester( );
string theDirectory = @"c:\WinNT";
DirectoryInfo dir = new DirectoryInfo(theDirectory);
t.ExploreDirectory(dir);
Console.WriteLine(
"\n\n{0} files in {1} directories found.\n",
fileCounter,dirCounter );
}
// ly tt c cc tp tin trong th mc v
// in tn, ngy truy cp gn nht, kch thc ca chng
FileInfo[] filesInDir = dir.GetFiles( );
foreach (FileInfo file in filesInDir)
{
// li vo mt khong pha di th mc
// phc v vic trnh by
for (int i = 0; i < indentLevel+1; i++)
Console.Write(" "); // hai khong trng cho mi cp
Console.WriteLine("{0} [{1}] Size: {2} bytes",
file.Name, file.LastWriteTime, file.Length);
fileCounter++;
}
DirectoryInfo[] directories = dir.GetDirectories( );
foreach (DirectoryInfo newDir in directories)
{
dirCounter++;
ExploreDirectory(newDir);
}
indentLevel--;
}
228
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Kt qu (mt phn):
[0] WinNT [5/1/2001 3:34:01 PM]
namespace Programming_CSharp
{
class Tester
{
public static void Main( )
{
Tester t = new Tester( );
string theDirectory = @"c:\test\media";
DirectoryInfo dir = new DirectoryInfo(theDirectory);
t.ExploreDirectory(dir);
}
229
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
int counter = 0;
foreach (FileInfo file in filesInDir)
{
string fullName = file.FullName;
if (counter++ %2 == 0)
{
file.MoveTo(fullName + ".bak");
Console.WriteLine("{0} renamed to {1}",
fullName,file.FullName);
}
else
{
file.Delete( );
Console.WriteLine("{0} deleted.", fullName);
}
}
newSubDir.Delete(true); // hy th mc con ny
}
}
}
Kt qu (mt phn):
c:\test\media\Bach's Brandenburg Concerto No. 3.RMI
copied to newTest
c:\test\media\Beethoven's 5th Symphony.RMI copied to newTest
c:\test\media\Beethoven's Fur Elise.RMI copied to newTest
c:\test\media\canyon.mid copied to newTest
c:\test\media\newTest\Bach's Brandenburg Concerto
No. 3.RMI renamed to
c:\test\media\newTest\Bach's Brandenburg Concerto
No. 3.RMI.bak
c:\test\media\newTest\Beethoven's 5th Symphony.RMI deleted.
c:\test\media\newTest\Beethoven's Fur Elise.RMI renamed to
c:\test\media\newTest\Beethoven's Fur Elise.RMI.bak
c:\test\media\newTest\canyon.mid deleted.
230
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
class Tester
{
231
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
232
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
class Tester
{
const int SizeBuff = 1024;
public static void Main( )
{
Tester t = new Tester( );
t.Run( );
}
private void Run( )
{
// to mt lung nh phn
Stream inputStream = File.OpenRead(
@"C:\test\source\folder3.cs");
Stream outputStream = File.OpenWrite(
@"C:\test\source\folder3.bak");
// to lung vng m kt buc vi lung nh phn
BufferedStream bufferedInput =
new BufferedStream(inputStream);
BufferedStream bufferedOutput =
new BufferedStream(outputStream);
byte[] buffer = new Byte[SizeBuff];
int bytesRead;
while ( (bytesRead =
bufferedInput.Read(buffer,0,SizeBuff)) > 0 )
{
bufferedOutput.Write(buffer,0,bytesRead);
}
bufferedOutput.Flush( );
bufferedInput.Close( );
bufferedOutput.Close( );
}
}
}
233
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Vi tp tin c dung lng ln, chng trnh ny s chy nhanh hn chng trnh v
d trc.
tham s th hai thuc kiu bool, nu tp tin tn ti, gi tr true s ghi d liu
mi vo cui tp tin, gi tr false s xa d liu c, d liu mi s ghi d liu
c.
V d 21-6. c v ghi tp tin vn bn
using System;
using System.IO;
namespace Programming_CSharp
{
class Tester
{
public static void Main( )
{
Tester t = new Tester( );
t.Run( );
}
private void Run( )
{
// m mt tp tin
FileInfo theSourceFile = new FileInfo(
@"C:\test\source\test.cs");
// to lung c vn bn cho tp tin
StreamReader reader = theSourceFile.OpenText( );
// to lung ghi vn bn cho tp tin xut
StreamWriter writer = new StreamWriter(
@"C:\test\source\test.bak",false);
// to mt bin chui l gi mt dng vn bn
234
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
string text;
235
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Sau thc hin cng vic khc, trng hp ny l vng lp for thc hin 500.000
ln.
for (long i = 0; i < 500000; i++)
{
if (i%1000 == 0)
{
Console.WriteLine("i: {0}", i);
}
}
236
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
{
string s = Encoding.ASCII.GetString (buffer, 0, bytesRead);
Console.WriteLine(s);
inputStream.BeginRead(buffer, 0, buffer.Length,
myCallBack, null);
}
Hiu qu ca chng trnh l ta c th thc hin cc cng vic khng cn kt qu
ca vic c d liu khc. V d hon chnh lit k di y
V d 21-7. ci t nhp xut bt ng b
using System;
using System.IO;
using System.Threading;
using System.Text;
namespace Programming_CSharp
{
public class AsynchIOTester
{
private Stream inputStream;
// delegated
private AsyncCallback myCallBack;
// vng nh buffer lu gi liu c c
private byte[] buffer;
// kch thc buffer
const int BufferSize = 256;
AsynchIOTester( )
{
// m mt lung nhp
inputStream = File.OpenRead(
@"C:\test\source\AskTim.txt");
// cp pht vng buffer
buffer = new byte[BufferSize];
// gn mt hm callback
myCallBack = new AsyncCallback(this.OnCompletedRead);
}
public static void Main( )
{
AsynchIOTester theApp = new AsynchIOTester();
theApp.Run( );
}
void Run()
{
inputStream.BeginRead(
buffer, // cha kt qu
0, // v tr bt u trn buffer
buffer.Length, // kch thc buffer
myCallBack, // callback delegate
null); // i tng trng thi cc b
// lm chuyn g trong lc c d liu
for (long i = 0; i < 500000; i++)
{
if (i%1000 == 0)
{
237
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
// hm callback
void OnCompletedRead(IAsyncResult asyncResult)
{
int bytesRead =
inputStream.EndRead(asyncResult);
// nu c c d liu
if (bytesRead > 0)
{
// chuyn n thnh chui
String s =
Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine(s);
inputStream.BeginRead(
buffer, 0, buffer.Length, myCallBack, null);
}
}
}
}
Kt qu (mt phn)
i: 47000
i: 48000
i: 49000
Date: January 2001
From: Dave Heisler
To: Ask Tim
Subject: Questions About O'Reilly
Dear Tim,
I've been a programmer for about ten years. I had heard of
O'Reilly books,then...
Dave,
You might be amazed at how many requests for help with
school projects I get;
i: 50000
i: 51000
i: 52000
Trong cc ng dng thc t, ta s tng tc vi ngi dng hoc thc hin cc tnh
ton trong khi cng vic nhp xut tp tin hay c s d liu c thc hin mt
cch bt ng b mt tiu trnh khc.
21.4 Serialization
Serialize c ngha l sp theo th t. Khi ta mun lu mt i tng xung tp tin
trn a t lu tr, ta phi nh ra trnh t lu tr ca d liu trong i tng.
Khi cn ti to li i tng t thng tin trn tp tin lu tr, ta s "np" ng
theo trnh t nh trc . y gi l qu trnh Serialize.
Ni chnh xc hn, serialize l tin trnh bin i trng thi ca i tng theo
mt nh dng c th c lu tr hay dch chuyn (transfer).
238
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
239
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
[Serializable]
class SumOf
{
public static void Main( )
{
Console.WriteLine("Creating first one with new...");
SumOf app = new SumOf(1,10);
Console.WriteLine("Creating second one with
deserialize...");
SumOf newInstance = SumOf.DeSerialize( );
newInstance.DisplaySums( );
}
240
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
FileStream fileStream =
new FileStream("DoSum.out",FileMode.Create);
//s dung binary formatter
BinaryFormatter binaryFormatter =
new BinaryFormatter( );
// serialize
binaryFormatter.Serialize(fileStream,this);
Console.WriteLine("...completed");
fileStream.Close( );
}
Kt qu:
Creating first one with new...
1,
3,
6,
10,
15,
21,
28,
36,
45,
55,
Serializing......completed
Creating second one with deserialize...
1,
3,
6,
10,
15,
21,
28,
36,
45,
55,
241
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
CLR bit ta khng mun Serialize bin thnh vin ny, ta t attribute
[NonSerialize] trc khai bo:
[NonSerialized] private int[] theSums;
namespace Programming_CSharp
{
[Serializable]
class SumOf : IDeserializationCallback
{
public static void Main( )
{
Console.WriteLine("Creating first one with new...");
SumOf app = new SumOf(1,5);
Console.WriteLine("Creating second one with
deserialize...");
SumOf newInstance = SumOf.DeSerialize( );
newInstance.DisplaySums( );
}
242
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
Kt qu:
Creating first one with new...
1,
3,
6,
10,
15,
Serializing......completed
Creating second one with deserialize...
243
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
1,
3,
6,
10,
15,
namespace Programming_CSharp
{
public class Tester
{
public static void Main( )
{
Tester app = new Tester( );
app.Run( );
}
private void Run( )
{
// to mt lung cho tp tin cu hnh
IsolatedStorageFileStream configFile = new
IsolatedStorageFileStream("Tester.cfg",FileMode.Create);
// to mt writer ghi ln lung
StreamWriter writer = new StreamWriter(configFile);
// ghi d liu lr6n tp tin config
String output;
System.DateTime currentTime = System.DateTime.Now;
output = "Last access: " + currentTime.ToString( );
writer.WriteLine(output);
output = "Last position = 27,35";
writer.WriteLine(output);
// tng sch d liu
writer.Flush( );
writer.Close( );
244
Lung d liu. Gvhd: Nguyn Tn Trn Minh Khang
configFile.Close( );
}
}
}
Sau khi chy on m ny ta, thc hin vic tm kim tp tin test.cfg, ta s thy
n trong ng dn sau:
c:\Documents and Settings\Administrator\ApplicationData\
Microsoft\COMPlus\IsolatedStorage\0.4\
Url.wj4zpd5ni41dynqxx1uz0x0aoaraftc\
Url.wj4zpd5ni41dynqxx1uz0ix0aoaraftc\files
M tp tin ny bng Notepad, ni dung tp tin nh sau
Last access: 5/2/2001 10:00:57 AM
Last position = 27,35
Ta cng c th c tp tin ny bng chnh lung IsolatedStorageFileStream
245
Lp trnh .NET v COM Gvhd: Nguyn Tn Trn Minh Khang
22.1 P/Invoke
Khi u Platform invoke facility (P/Invoke - d dng gi cc giao din lp trnh
ca h iu hnh/sn din) c d nh cung cp mt cch thc truy cp n
cc hm Windows API, nhng ta c th dng n gi cc hm th vin DLL.
V d sp trnh by s dng hm Win API MoveFile ca th vin kernal32.dll. Ta
khai bo phng thc static extern bng attribute DllImport nh sau:
[DllImport("kernel32.dll", EntryPoint="MoveFile",
ExactSpelling=false, CharSet=CharSet.Unicode,
SetLastError=true)]
static extern bool MoveFile(
string sourceFile, string destinationFile);
246
Lp trnh .NET v COM Gvhd: Nguyn Tn Trn Minh Khang
namespace Programming_CSharp
{
class Tester
{
// khai bo hm WinAPI mun gi P/Invoke
[DllImport("kernel32.dll", EntryPoint="MoveFile",
ExactSpelling=false, CharSet=CharSet.Unicode,
SetLastError=true)]
static extern bool MoveFile( string sourceFile,
string destinationFile);
filesInDir = newSubDir.GetFiles( );
// xa mt vi tp tin v
// i tn mt vi tp tin
int counter = 0;
foreach (FileInfo file in filesInDir)
{
string fullName = file.FullName;
if (counter++ %2 == 0)
{
// P/Invoke Win API
Tester.MoveFile(fullName, fullName + ".bak");
Console.WriteLine("{0} renamed to {1}",
fullName,file.FullName);
}
else
247
Lp trnh .NET v COM Gvhd: Nguyn Tn Trn Minh Khang
{
file.Delete( );
Console.WriteLine("{0} deleted.", fullName);
}
}
newSubDir.Delete(true);
}
}
}
Kt qu (mt phn):
c:\test\media\newTest\recycle.wav renamed to
c:\test\media\newTest\recycle.wav
c:\test\media\newTest\ringin.wav renamed to
c:\test\media\newTest\ringin.wav
Mt ln na, ch nn gi P/Invoke trong trng bt kh khng. S dng cc lp
.NET Framework c on m c qun l.
22.2 Con tr
Nh cp trn, ch nn s dng con tr khi lm vic vi cc COM, WinAPI,
hm DLL.
Cc ton t s dng vi con tr tng t nh C/C++
&: ton t ly a ch
*: ton t ly ni dung con tr
->: ton t n cc thnh vin ca con tr
V d di y s dng con tr lm tham s cho hai hm WinAPI CreatFile v
ReadFile.
V d 22-2 S dng con tr trong C#
using System;
using System.Runtime.InteropServices;
using System.Text;
class APIFileReader
{
// import hai phng thc, phi c t kha unsafe
[DllImport("kernel32", SetLastError=true)]
static extern unsafe int CreateFile(
string filename,
uint desiredAccess,
uint shareMode,
uint attributes,
uint creationDisposition,
uint flagsAndAttributes,
uint templateFile);
248
Lp trnh .NET v COM Gvhd: Nguyn Tn Trn Minh Khang
int nBytesToRead,
int* nBytesRead,
int overlapped);
// hm dng: m mt tp tin tn ti
public APIFileReader(string filename)
{
fileHandle = CreateFile(
filename, // tp tin
GenericRead, // cch truy xut - desiredAccess
UseDefault, // shareMode
UseDefault, // attributes
OpenExisting, // creationDisposition
UseDefault, // flagsAndAttributes
UseDefault); // templateFile
}
249
Lp trnh .NET v COM Gvhd: Nguyn Tn Trn Minh Khang
Phn 2
Xy dng mt ng dng minh ha
250
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
251
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
252
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
253
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
254
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
255
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
23.1.2 Xc nh yu cu
ng dng phi gip ngi dng c th nm bt c kin thc mt cch nhanh
nht, trnh trn lan, di dng v phi h tr chc nng hiu chnh ( Admin ).
256
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
257
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
23.2.2.2 CHNG
Chng thuc v mt ch no , mi chng c mt hay nhiu mc chnh,
v d, trc nghim.
23.2.2.3 MC CHNH
Mc chnh thuc v mt chng no , mi mc chnh c mt hay nhiu
chnh con v mt tp tin m t chi tit cho mc chnh ny nu c.
23.2.2.4 V D
V d thuc v mt chng no , mi v d s c phn m ngun v kt xut
tng ng vi m ngun ny, c th s c mt tp tin m t chi tit v v d nu
cn thit.
258
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
2 TEN VARCHAR(50) Tn ch
3 NOIDUNG VARCHAR(1000) Ni dung ca ch
4 SOCHUONG INT S chng c trong ch
5 TENTP VARCHAR(50) Tn thnh phn : L
thuyt, V d, Trc
nghim, Qun tr
6 NOIDUNGTP VARCHAR(500) Ni dung tng quan ca
thnh phn thuc ch
259
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
260
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
X l trn i tng : V D
Stt Tn x l Loi ngha
1 Hin th thng tin v v d Qui nh Hin th danh sch cc v d ca
chng
2 Thm v d mi Qui nh D liu nhp l tn, gii thiu s v
v d, m ngun, kt xut tng ng
v c tn tp tin m t v d nu cn
thit
3 Xa v d c sn Qui nh Xa ton b thng tin v v d : tn,
m ngun, kt xut v tn tp tin
4 Sa i thng tin v v d Qui nh Hiu chnh tn, gii thiu v d, m
ngun, kt xut v tn tp tin nu
c.
5 Kim tra hp l vic thay i v Qui nh Kim tra cc rng buc v tnh hp
d l khi thm, xa, sa
261
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
nghim, cc cu chn la v p n
ca cu.
3 Xa cu trc nghim c sn Qui nh Xa ton b thng tin v cu trc
nghim : tn, cu hi trc nghim,
cc cu chn la v p n ca cu.
4 Sa i thng tin v cu trc Qui nh Hiu chnh tn, cu hi trc nghim,
nghim cc cu chn la v p n ca cu.
5 Kim tra hp l vic thay i cu Qui nh Kim tra cc rng buc v tnh hp
trc nghim l khi thm, xa, sa
262
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
MN
HNH
CHNH
ng nhp
Qun tr
Thng
bo li
L thuyt V d Trc nghim
263
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
264
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
265
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
266
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
267
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
268
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
Kt qu bi lm trc nghim
Hnh 23-13 Kt qu chm im bi lm trc nghim
269
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
270
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
Giao din tng quan hiu chnh ni dung chi tit ca tng ch
Hnh 23-15 Tng quan v hiu chnh l thuyt, v d v trc nghim
271
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
272
Website dy hc ngn ng C# Gvhd: Nguyn Tn Trn Minh Khang
273