intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Các giải pháp lập trình C Sharp_2

Chia sẻ: Thao Thao | Ngày: | Loại File: PDF | Số trang:53

83
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Trong chương trình viết bằng ngôn ngữ C#, để miêu tả các chuỗi văn bản, ta thường dùng biến thuộc kiểu string hay String. string hay String là các class đối tượng có sẵn trong môi trường .Net được dùng để quản lý chuỗi văn bản. Để chuyển chuỗi sang 1 mảng ký tự, bạn có thể gọi tác vụ ToCharArray() của biến string hay String. Thí dụ sau là đoạn code C# demo việc chuyển chuỗi sang mảng các ký tự...

Chủ đề:
Lưu

Nội dung Text: Các giải pháp lập trình C Sharp_2

  1. 53 Chương 2: Thao tác d li u H u h t các ng d ng u c n thao tác trên m t lo i d li u nào ó. Microsoft .NET Framework cung c p nhi u k thu t ơn gi n hóa hay nâng cao hi u qu các thao tác d li u thông d ng. Chương này s c p các k thu t sau: Thao tác chu i m t cách hi u qu (m c 2.1). Mô t các ki u d li u cơ s b ng các ki u mã hóa khác nhau (m c 2.2, 2.3, và 2.4). S d ng bi u th c chính quy xác nh n tính h p l và thao tác chu i (m c 2.5 và 2.6). Làm vi c v i ngày và gi (m c 2.7 và 2.8). Làm vi c v i m ng và t p h p (m c 2.9, 2.10, và 2.11). Tu n t hóa tr ng thái i tư ng và lưu nó vào file (m c 2.12). Thao tác chuỗi một cách hiệu quả 2.1 B n c n thao tác trên n i dung c a m t i tư ng String và tránh chi phí c a vi c t ng t o các i tư ng String m i do tính không i c a i tư ng String. S d ng l p System.Text.StringBuilder th c hi n các thao tác, sau ó chuy n k t qu thành String b ng phương th c StringBuilder.ToString. Các i tư ng String trong .NET là không i, nghĩa là m t khi ã ư c t o thì chúng không th b thay i. Ví d , n u b n t o m t String b ng cách n i m t s ký t ho c chu i, thì khi thêm m t ph n t m i vào cu i String hi n có, b th c thi s t o ra m t String m i ch a k t qu (ch không ph i String cũ b thay i). Do ó s n y sinh chi phí áng k n u ng d ng c a b n thư ng xuyên thao tác trên String. L p StringBuilder kh c ph c v n này b ng cách cung c p m t b m ký t , và cho phép thao tác trên n i dung c a nó mà b th c thi không ph i t o i tư ng m i ch a k t qu sau m i l n thay i. B n có th t o m t i tư ng StringBuilder r ng ho c ư c kh i t o là n i dung c a m t String hi n có. Sau ó, thao tác trên n i dung c a StringBuilder này b ng các phương th c n p ch ng (cho phép b n chèn, thêm d ng chu i c a các ki u d li u khác nhau). Cu i cùng, g i StringBuilder.ToString chuy n n i dung hi n t i c a StringBuilder thành m t String. Khi b n thêm d li u m i vào chu i, có hai thu c tính quan tr ng nh hư ng n ho t ng c a StringBuilder là Capacity và Length. Capacity mô t kích thư c c a b m StringBuilder, còn Length mô t kích thư c c a chu i ký t trong b m. N u vi c thêm d li u m i vào StringBuilder làm kích thư c chu i (Length) vư t quá kích thư c b m (Capacity) thì StringBuilder s c p phát b mm i ch a chu i. N u thi u c n th n, vi c c p phát b m này có th ph nh l i ích c a vi c s d ng StringBuilder. Do ó, n u bi t chính xác kích thư c c a chu i, ho c bi t kích thư c t i a c a chu i, b n có th tránh vi c c p phát b m quá m c c n thi t b ng cách thi t l p thu c tính Capacity ho c ch nh kích thư c b m lúc t o StringBuilder. Khi thi t l p các thu c tính Capacity và Length, c n chú ý các i m sau:
  2. 54 Chương 2: Thao tác d li u N u b n thi t l p giá tr Capacity nh hơn giá tr Length, thu c tính Capacity s ném • ngo i l System.ArgumentOutOfRangeException. N u b n thi t l p giá tr Length nh hơn kích thư c c a chu i hi n có trong b m, • chu i s b c t b t ph n l n hơn. N u b n thi t l p giá tr Length l n hơn kích thư c c a chu i, b m s ư c "l p" • thêm các kho ng tr ng cho b ng v i Length. Vi c thi t l p giá tr Length l n hơn giá tr Capacity s t ng i u ch nh Capacity cho b ng v i Length. Phương th c ReverseString dư i ây minh h a cách s d ng l p StringBuilder om t chu i. N u không s d ng l p StringBuilder th c hi n thao tác này thì s t n chi phí áng k , c bi t khi chu i ngu n dài. Vi c kh i t o StringBuilder v i kích thư c b ng chu i ngu n b o m không c n ph i c p phát l i b m trong quá trình o chu i. public static string ReverseString(string str) { // Ki m tra các trư ng h p không c n o chu i. if (str == null || str.Length == 1) { return str; } // T o m t StringBuilder v i s c ch a c n thi t. System.Text.StringBuilder revStr = new System.Text.StringBuilder(str.Length); // Duy t ngư c chu i ngu n t ng ký t m t // và thêm t ng ký t c ư c vào StringBuilder. for (int count = str.Length-1; count > -1; count--) { revStr.Append(str[count]); } // Tr v chu i ã ư c o. return revStr.ToString(); } Mã hóa chuỗi bằng các kiểu mã hóa ký tự 2.2 B n c n trao i d li u d ng ký t v i các h th ng s d ng ki u mã hóa khác v i UTF-16 (ki u mã hóa này ư c s d ng b i CRL). S d ng l p System.Text.Encoding và các l p con c a nó chuy n i k ý t gi a các ki u mã hóa khác nhau. Unicode không ph i là ki u mã hóa duy nh t, cũng như UTF-16 không ph i cách duy nh t bi u di n ký t Unicode. Khi ng d ng c n trao i d li u ký t v i các h th ng bên ngoài ( c bi t là các h th ng cũ), d li u c n ph i ư c chuy n i gi a UTF-16 và ki u mã hóa mà h th ng ó h tr . L p tr u tư ng Encoding, và các l p con c a nó cung c p các ch c năng chuy n ký t qua l i gi a nhi u ki u mã hóa khác nhau. M i th hi n c a l p con h tr vi c chuy n i gi a UTF-16 và m t ki u mã hóa khác. Phương th c tĩnh Encoding.GetEncoding nh n vào tên ho c s hi u trang mã (code page number) c a m t ki u mã hóa và tr v th hi n c a l p mã hóa tương ng.
  3. 55 Chương 2: Thao tác d li u B ng 2.1 li t kê m t vài ki u mã ký t và s hi u trang mã mà b n ph i truy n cho phương th c GetEncoding t o ra th hi n c a l p mã hóa tương ng. B ng này cũng cung c p các thu c tính tĩnh c a l p Encoding i di n cho phương th c GetEncoding tương ng. B ng 2.1 Các l p mã hóa ký t Ki u mã hóa Lp S d ng GetEncoding(20127) ASCIIEncoding ASCII hay thu c tính ASCII M c nh (ki u mã hóa GetEncoding(0) Encoding hay thu c tính Default hi n hành trên h th ng) GetEncoding(65000) UTF7Encoding UTF-7 hay thu c tính UTF7 GetEncoding(65001) UTF8Encoding UTF-8 hay thu c tính UTF8 GetEncoding(1201) UnicodeEncoding UTF-16 (Big Endian) hay thu c tính BigEndianUnicode GetEncoding(1200) UnicodeEncoding UTF-16 (Little Endian) hay thu c tính Unicode Encoding GetEncoding(1252) Windows OS Sau khi ã l y ư c i tư ng l p Encoding h tr ki u mã hóa thích h p, s d ng phương th c GetBytes chuy n chu i ngu n ( ư c mã hóa theo UTF-16) thành m ng ki u byte ch a các ký t ư c mã hóa theo ki u c n chuy n, và s d ng GetString chuy n m ng byte thành chu i ích. Ví d dư i ây trình bày cách s d ng m t vài l p mã hóa: using System; using System.IO; using System.Text; public class CharacterEncodingExample { public static void Main() { // T o file gi các k t qu . using (StreamWriter output = new StreamWriter("output.txt")) { // T o và ghi ra file m t chu i ch a ký hi u c a s PI. string srcString = "Area = \u03A0r^2"; output.WriteLine("Source Text : " + srcString); // Ghi các byte ư c mã hóa theo UTF-16 // c a chu i ngu n ra file. byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF-16 Bytes: {0}", BitConverter.ToString(utf16String)); // Chuy n chu i ngu n ư c mã hóa theo UTF-16 // thành UTF-8 và ASCII byte[] utf8String = Encoding.UTF8.GetBytes(srcString); byte[] asciiString = Encoding.ASCII.GetBytes(srcString); // Ghi m ng các byte ư c mã hóa theo UTF-8 và ASCII ra file.
  4. 56 Chương 2: Thao tác d li u output.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String)); output.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString)); // Chuy n các byte ư c mã hóa theo UTF-8 và ASCII // thành chu i ư c mã hóa theo UTF-16 và ghi ra file. output.WriteLine("UTF-8 Text : {0}", Encoding.UTF8.GetString(utf8String)); output.WriteLine("ASCII Text : {0}", Encoding.ASCII.GetString(asciiString)); // Ghi d li u xu ng file và óng file. output.Flush(); output.Close(); } } } Ch y CharacterEncodingExample s t o ra file output.txt. M file này trong m t trình so n th o có h tr Unicode, b n s th y k t qu như sau: Source Text : Area = Πr^2 UTF-16 Bytes: 41-00-72-00-65-00-61-00-20-00-3D-00-20-00-A0-03-72-00-5E-00-32-00 UTF-8 Bytes: 41-72-65-61-20-3D-20-CE-A0-72-5E-32 ASCII Bytes: 41-72-65-61-20-3D-20-3F-72-5E-32 UTF-8 Text : Area = Πr^2 ASCII Text : Area = ?r^2 Chú ý r ng, n u s d ng UTF-16 thì m i ký t ư c mã hóa b i 2 byte, nhưng vì h u h t các ký t u là ký t chu n nên byte cao là 0 (n u s d ng little-endian thì byte th p vi t trư c). Do ó, h u h t các ký t u ư c mã hóa b i nh ng s gi ng nhau trong ba ki u mã hóa, ngo i tr ký hi u PI ư c mã hóa khác ( ư c in m trong k t qu trên). mã hóa PI c n 2 byte, òi h i này ư c UTF-8 h tr nên th hi n ư c Π, trong khi ó ASCII ch s d ng m t byte nên thay PI b ng mã 3F, ây là mã c a d u h i (?). N u chuy n các ký t Unicode sang ASCII ho c m t ki u mã hóa khác thì có th m t d li u. B t kỳ ký t Unicode nào có mã ký t không bi u di n ư c trong ki u mã hóa ích s b b qua khi chuy n i. L p Encoding cũng cung c p phương th c tĩnh Covert ơn gi n hóa vi c chuy n m t m ng byte t ki u mã hóa này sang ki u mã hóa khác không ph i qua trung gian UTF-16. Ví d , dòng mã sau chuy n tr c ti p các byte trong m ng asciiString t ASCII sang UTF-8: byte[] utf8String = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, asciiString); Chuyển các kiểu giá trị cơ bản thành mảng kiểu 2.3 byte B n c n chuy n các ki u giá tr cơ b n thành m ng ki u byte.
  5. 57 Chương 2: Thao tác d li u L p System.BitConverter cung c p các phương th c tĩnh r t ti n l i cho vi c chuy n i qua l i gi a các m ng ki u byte và h u h t các ki u giá tr cơ b n—tr ki u decimal. chuy n m t giá tr ki u decimal sang m ng ki u byte, b n c n s d ng i tư ng System.IO.BinaryWriter ghi giá tr ó vào m t th hi n System.IO.MemoryStream, sau ó g i phương th c Memorystream.ToArray. có m t giá tr decimal t m t m ng ki u byte, b n c n t o m t i tư ng MemoryStream t m ng ki u byte, sau ó s d ng th hi n System.IO.BinaryReader c giá tr này t MemoryStream. Phương th c tĩnh GetBytes c a l p BitConverter cung c p nhi u phiên b n n p ch ng cho phép chuy n h u h t các ki u giá tr cơ b n sang m ng ki u byte. Các ki u ư c h tr là bool, char, double, short, int, long, float, ushort, uint, và ulong. L p BitConverter cũng cung c p các phương th c tĩnh cho phép chuy n các m ng ki u byte thành các ki u giá tr chu n như ToBoolean, ToUInt32, ToDouble,... Ví d sau minh h a cách chuy n các giá tr bool và int thành m ng ki u byte, và ngư c l i. i s th hai trong ToBoolean và ToUInt32 cho bi t v trí (tính t 0) trong m ng byte mà BitConverter s l y các byte k t ó t o giá tr d li u. byte[] b = null; // Chuy n m t giá tr bool thành m ng ki u byte và hi n th . b = BitConverter.GetBytes(true); Console.WriteLine(BitConverter.ToString(b)); // Chuy n m t m ng ki u byte thành giá tr bool và hi n th . Console.WriteLine(BitConverter.ToBoolean(b,0)); // Chuy n m t giá tr int thành m ng ki u byte và hi n th . b = BitConverter.GetBytes(3678); Console.WriteLine(BitConverter.ToString(b)); // Chuy n m t m ng ki u byte thành giá tr int và hi n th . Console.WriteLine(BitConverter.ToInt32(b,0)); i v i ki u decimal, l p BitConverter không h tr , nên b n ph i s d ng thêm MemoryStream và BinaryWriter. // T o m ng ki u byte t giá tr decimal. public static byte[] DecimalToByteArray (decimal src) { // T o m t MemoryStream làm b m c h a d l i u nh phân. using (MemoryStream stream = new MemoryStream()) { // T o m t BinaryWriter ghi d li u nh phân vào stream. using (BinaryWriter writer = new BinaryWriter(stream)) { // Ghi giá tr decimal vào BinaryWriter/MemoryStream. writer.Write(src); // Tr v m ng ki u byte. return stream.ToArray(); } } }
  6. 58 Chương 2: Thao tác d li u chuy n m t m ng ki u byte thành m t giá tr decimal, s d ng BinaryReader ct MemoryStream. // T o giá tr decimal t m ng ki u byte. public static decimal ByteArrayToDecimal (byte[] src) { // T o m t MemoryStream ch a m ng. using (MemoryStream stream = new MemoryStream(src)) { // T o m t BinaryReader c t stream. using (BinaryReader reader = new BinaryReader(stream)) { // c và tr v giá tr decimal t // BinaryReader/MemoryStream. return reader.ReadDecimal(); } } } L p BitConverter cũng cung c p phương th c ToString t o m t String ch a giá tr m ng. G i ToString và truy n i s là m t m ng byte s tr v m t String ch a giá tr th p l c phân c a các byte trong m ng, các giá tr này cách nhau b i d u g ch n i, ví d “34-A7-2C”. Tuy nhiên, không có phương th c nào t o m t m ng ki u byte t m t chu i theo nh d ng này. Mã hóa dữ liệu nhị phân thành văn bản 2.4 B n c n chuy n d li u nh phân sang m t d ng sao cho có th ư c lưu tr trong m t file văn b n ASCII (ch ng h n file XML), ho c ư c g i i trong e-mail. S d ng các phương th c tĩnh ToBase64String và FromBase64String c a l p chuy n i qua l i gi a d li u nh phân và chu i ư c mã System.Converter hóa theo Base64. Base64 là m t ki u mã hóa cho phép b n mô t d li u nh phân như m t dãy các ký t ASCII nó có th ư c chèn vào m t file văn b n ho c m t e-mail, mà ó d li u nh phân không ư c cho phép. Base64 làm vi c trên nguyên t c s d ng 4 byte ch a 3 byte d li u ngu n và m b o m i byte ch s d ng 7 bit th p ch a d li u. i u này có nghĩa là m i byte d li u ư c mã hóa theo Base64 có d ng gi ng như m t ký t ASCII, nên có th ư c lưu tr ho c truy n i b t c nơi âu cho phép ký t ASCII. L p Convert cung c p hai phương th c ToBase64String và FromBase64String mã hóa và gi i mã Base64. Tuy nhiên, trư c khi mã hóa Base64, b n ph i chuy n d li u thành m ng ki u byte; và sau khi gi i mã, b n ph i chuy n m ng ki u byte tr v ki u d li u thích h p (xem l i m c 2.2 và 2.3). Ví d sau minh h a cách s d ng l p Convert mã hóa và gi i mã Base64 v i chu i Unicode, giá tr int, giá tr decimal. i v i giá tr decimal, b n ph i s d ng l i các phương th c ByteArrayToDecimal và DecimalToByteArray trong m c 2.3. // Mã hóa Base64 v i chu i Unicode. public static string StringToBase64 (string src) {
  7. 59 Chương 2: Thao tác d li u // Chuy n chu i thành m ng ki u byte. byte[] b = Encoding.Unicode.GetBytes(src); // Tr v chu i ư c mã hóa theo Base64. return Convert.ToBase64String(b); } // Gi i mã m t chu i Unicode ư c mã hóa theo Base64. public static string Base64ToString (string src) { // Gi i mã vào m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v chu i Unicode. return Encoding.Unicode.GetString(b); } // Mã hóa Base64 v i giá tr decimal. public static string DecimalToBase64 (decimal src) { // Chuy n giá tr decimal thành m ng ki u byte. byte[] b = DecimalToByteArray(src); // Tr v giá tr decimal ư c mã hóa theo Base64. return Convert.ToBase64String(b); } // Gi i mã m t giá tr decimal ư c mã hóa theo Base64. public static decimal Base64ToDecimal (string src) { // Gi i mã vào m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v giá tr decimal. return ByteArrayToDecimal(b); } // Mã hóa Base64 v i giá tr int. public static string IntToBase64 (int src) { // Chuy n giá tr int thành m ng ki u byte. byte[] b = BitConverter.GetBytes(src); // Tr v giá tr int ư c mã hóa theo Base64. return Convert.ToBase64String(b); } // Gi i mã m t giá tr int ư c mã hóa theo Base64. public static int Base64ToInt (string src) { // Gi i mã vào m ng ki u byte. byte[] b = Convert.FromBase64String(src); // Tr v giá tr int. return BitConverter.ToInt32(b,0); }
  8. 60 Chương 2: Thao tác d li u Sử dụng biểu thức chính quy để kiểm tra dữ liệu 2.5 nhập B n c n ki m tra d li u nh p vào có úng v i c u trúc và n i dung ư c quy nh trư c hay không. Ví d , b n mu n b o m ngư i dùng nh p a ch IP, s i n tho i, hay a ch e-mail h p l . S d ng bi u th c chính quy b o m d li u nh p úng c u trúc và ch ch a các ký t ư c quy nh trư c i v i t ng d ng thông tin. Khi ng d ng nh n d li u t ngư i dùng ho c c d li u t file, b n nên gi nh d li u này là chưa chính xác và c n ư c ki m tra l i. M t nhu c u ki m tra khá ph bi n là xác nh các s i n tho i, s th tín d ng, a ch e-mail có úng d ng hay không. Vi c ki m tra c u trúc và n i dung c a d li u không m b o d li u là chính xác nhưng giúp lo i b nhi u d li u sai và ơn gi n hóa vi c ki m tra sau này. Bi u th c chính quy (regular expression) cung c p m t cơ ch r t t t ki m tra m t chu i có úng v i c u trúc quy nh trư c hay không, do ó b n có th l i d ng tính năng này cho m c ích ki m tra d li u nh p. Trư c tiên, b n ph i xác nh cú pháp c a bi u th c chính quy cho phù h p v i c u trúc và n i dung c a d li u c n ki m tra, ây là ph n khó nh t khi s d ng bi u th c chính quy. Bi u th c chính quy ư c xây d ng trên hai y u t : tr c ki n (literal) và siêu ký t (metacharacter). Tr c ki n mô t các ký t có th xu t hi n trong m u mà b n mu n so trùng; siêu ký t h tr vi c so trùng các ký t i di n (wildcard), t m tr , nhóm, l p, i u ki n, và các cơ ch i u khi n khác. ây không th o lu n y v cú pháp bi u th c chính quy (tham kh o tài li u .NET SDK hi u thêm v bi u th c chính quy), nhưng b ng 2.2 s mô t các siêu ký t thư ng dùng. B ng 2.2 Các siêu ký t thư ng dùng Siêu ký t Mô t M i ký t tr ký t xu ng dòng (\n). . Ký t ch s th p phân (digit). \d Ký t không ph i ch s (non-digit). \D Ký t whitespace (như kho ng tr ng, tab...). \s Ký t non-whitespace. \S Ký t word (g m m u t , ch s , và d u g ch dư i). \w Ký t non-word. \W Bt u m t chu i ho c dòng. ^ Bt u m t chu i. \A K t thúc m t chu i ho c dòng. $ K t thúc m t chu i. \z
  9. 61 Chương 2: Thao tác d li u Ngăn cách các bi u th c có th so trùng, ví d AAA|ABA|ABB s so trùng v i | AAA, ABA, ho c ABB (các bi u th c ư c so trùng t trái sang). So trùng v i m t trong các ký t trong nhóm, ví d [AbC] s so trùng v i A, [abc] b, ho c C. So trùng v i b t c ký t nào không thu c các ký t trong nhóm, ví d [^abc] [^AbC] s không so trùng v i A, b, or C nhưng so trùng v i B, F,… So trùng v i b t kỳ ký t nào thu c kho ng này, ví d [A-C] s so trùng v i [a-z] A, B, ho c C. Xác nh m t bi u th c con sao cho nó ư c xem như m t y u t ơn l () i v i các y u t ư c trình bày trong b ng này. Xác nh có m t ho c không có ký t ho c bi u th c con ng trư c nó, ví ? d A?B so trùng v i B, AB, nhưng không so trùng v i AAB. Xác nh không có ho c có nhi u ký t ho c bi u th c con ng trư c nó, * ví d A*B so trùng v i B, AB, AAB, AAAB,… Xác nh có m t ho c có nhi u ký t ho c bi u th c con ng trư c nó, ví + d A+B so trùng v i AB, AAB, AAAB,… nhưng không so trùng v i B. Xác nh có úng n ký t ho c bi u th c con ng trư c nó, ví d A{2} ch {n} so trùng v i AA. Xác nh có ít nh t n ký t ho c bi u th c con ng trư c nó, ví d A{2,} {n,} so trùng v i AA, AAA, AAAA,… nhưng không so trùng v i A. Xác nh có t n n m ký t ng trư c nó, ví d A{2,4} so trùng v i AA, {n, m} AAA, và AAAA nhưng không so trùng v i A ho c AAAAA. Khi d li u c n ki m tra càng ph c t p thì cú pháp c a bi u th c chính quy cũng càng ph c t p. Ví d , d dàng ki m tra d li u nh p ch ch a s hay có chi u dài t i thi u, nhưng ki m tra m t URL khá ph c t p. B ng 2.3 li t kê m t s bi u th c chính quy dùng ki m tra các ki u d li u thông d ng. B ng 2.3 M t s bi u th c chính quy thông d ng Ki u d li u nh p Mô t Bi u th c chính quy Ch ch a các ch s th p phân; ví d S ^\d+$ 5, ho c 5683874674. Ch a 4 ch s th p phân, ^\d{4}$ PIN ví d 1234. Ch a t 6 n 8 ký t ; ví d ghtd6f M t kh u ơn gi n ^\w{6,8}$ ho c b8c7hogh.
  10. 62 Chương 2: Thao tác d li u Ch a d li u phù h p v i c u trúc c a h u h t các lo i s th tín d ng, ^\d{4}-?\d{4}-?\d{4}- S th tín d ng ví d 4921835221552042 ho c 4921- ?\d{4}$ 8352-2155-2042. [\w-]+ nghĩa là ch a m t ho c nhi u ký t word ^[\w-]+@([\w- a ch e-mail ]+\.)+[\w-]+$ ho c d u g ch ngang, ví d some-body@adatum.com D li u là m t URL d a-trên-HTTP ^https?://([\w- HTTP ho c HTTPS hay d a-trên-HTTPS, ví d ]+\.)+[\w-]+(/[\w- ./ URL ?%=]*)?$ http://www.microsoft.com M t khi ã bi t cú pháp c a bi u th c chính quy, b n t o m t i tư ng System.Text.RegularExpression.Regex b ng cách truy n cho phương th c kh i d ng c a nó chu i ch a bi u th c chính quy. Sau ó, g i phương th c IsMatch c a i tư ng Regex và truy n chu i c n ki m tra, phương th c này tr v m t giá tr lu n lý cho bi t chu i có h p l không. Cú pháp c a bi u th c chính quy s ch nh Regex so trùng toàn b chu i hay ch so trùng m t ph n c a chu i (xem ^, \A, $, và \z trong b ng 2.2) Phương th c ValidateInput dư i ây minh h a cách ki m tra chu i nh p b ng bi u th c chính quy: public static bool ValidateInput(string regex, string input) { // T o i tư ng Regex d a trên bi u th c chính quy. Regex r = new Regex(regex); // Ki m tra d li u nh p có trùng v i bi u th c chính quy hay không. return r.IsMatch(input); } B n có th s d ng i tư ng Regex ki m tra nhi u chu i, nhưng không th thay i bi u th c chính quy ư c g n cho nó; b n ph i t o m t i tư ng Regex m i tương ng v i m t c u trúc m i. Phương th c ValidateInput trên t o ra m t i tư ng Regex m i m i l n ư c g i, thay vào ó b n có th s d ng phương th c tĩnh n p ch ng IsMatch. public static bool ValidateInput(string regex, string input) { // Ki m tra d li u nh p có trùng v i bi u th c chính quy hay không. return Regex.IsMatch(input, regex); } Sử dụng biểu thức chính quy đã được biên dịch 2.6 B n c n gi m thi u các tác ng lên hi u năng c a ng d ng khi các bi u th c chính quy ph c t p ư c s d ng thư ng xuyên. Khi kh i t o i tư ng System.Text.RegularExpressions.Regex, hãy truy n thêm tùy ch n Compiled thu c ki u li t kê System.Text.RegularExpressions.
  11. 63 Chương 2: Thao tác d li u biên d ch bi u th c chính quy thành Microsoft Intermediate RegexOptions Language (MSIL). Theo m c nh, khi b n t o i tư ng Regex, m u bi u th c chính quy do b n xác nh trong phương th c kh i d ng ư c biên d ch thành m t d ng trung gian (không ph i MSIL). M i l n b n s d ng i tư ng Regex, b th c thi phiên d ch d ng trung gian này và áp d ng nó ki m tra chu i. V i các bi u th c chính quy ph c t p ư c s d ng thư ng xuyên, vi c phiên d ch l p l p i l i có th gây tác ng x u lên hi u năng c a ng d ng. Khi tùy ch n RegexOptions.Compiled ư c ch nh, b th c thi s biên d ch bi u th c chính quy thành MSIL. MSIL này ư c g i là mã just-in-time (JIT), ư c biên d ch thành mã máy nguyên sinh trong l n th c thi u tiên, gi ng như mã assembly thông thư ng. Bi u th c chính quy ư c biên d ch cũng ư c s d ng gi ng như i tư ng Regex, vi c biên d ch ch giúp th c thi nhanh hơn. Tuy nhiên, vi c biên d ch bi u th c chính quy cũng có vài như c i m. Trư c tiên, trình biên d ch JIT ph i làm vi c nhi u hơn, d n n ch m quá trình biên d ch, c bi t khi t o bi u th c chính quy ư c biên d ch khi ng d ng kh i ng. Th hai, bi u th c chính quy ư c biên d ch v n t n t i trong b nh khi không còn ư c s d ng n a, nó không b b thu gom rác (Garbage Collector) xóa i như các bi u th c chính quy thông thư ng. Vùng nh b chi m ch ư c gi i phóng khi chương trình k t thúc, ho c khi b n gi i phóng mi n ng d ng. Dòng mã sau minh h a cách t o m t i tư ng Regex ư c biên d ch thành MSIL: Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+", RegexOptions.Compiled); Ngoài ra, phương th c tĩnh Regex.CompileToAssembly cho phép b n t o m t bi u th c chính quy ư c biên d ch và ghi nó vào m t assembly khác. Nghĩa là b n có th t o m t assembly ch a các bi u th c chính quy s d ng cho nhi u ng d ng sau này. biên d ch m t bi u th c chính quy và lưu nó vào m t assembly, th c hi n các bư c sau: 1. T o m t m ng System.Text.RegularExpressions.RegexCompilationInfo ln ch a các i tư ng RegexCompilationInfo, m i i tư ng ng v i m t bi u th c chính quy c n ư c biên d ch. 2. T o m t i tư ng RegexCompilationInfo cho m i bi u th c chính quy và truy n i s cho phương th c kh i d ng xác nh các thu c tính c a bi u th c chính quy này. Các thu c tính thông d ng là: IsPublicgiá tr bool xác nh l p bi u th c chính quy ư c t o ra có t m v c • là công khai hay không. Namem t String xác nh tên c a l p. • Namespacem t String xác nh không gian tên c a l p. • Patternm t String xác nh m u mà bi u th c chính quy s so trùng (xem chi • ti t m c 2.5). Optionsm t giá tr thu c ki u li t kê System.Text.RegularExpressions. • RegexOptions xác nh các tùy ch n cho bi u th c chính quy. 3. T o m t i tư ng System.Reflection.AssemblyName xác nh tên c a assembly mà phương th c Regex.CompileToAssembly s t o ra.
  12. 64 Chương 2: Thao tác d li u 4. Gi phương th c Regex.CompileToAssembly, truy n các i s là m ng RegexCompilationInfo và i tư ng AssemblyName. Quá trình trên t o ra m t assembly ch a các khai báo l p cho t ng bi u th c chính quy ư c biên d ch, m i l p d n xu t t Regex. s d ng m t bi u th c chính quy ã ư c biên d ch trong assembly, b n c n t o i tư ng bi u th c chính quy này và g i các phương th c c a nó gi ng như khi t o nó v i phương th c kh i d ng Regex bình thư ng. B n nh thêm tham chi u t i assembly khi s d ng các l p bi u th c chính quy n m trong nó. o n mã sau minh h a cách t o m t assembly có tên là MyRegex.dll, ch a hai bi u th c chính quy có tên là PinRegex và CreditCardRegex: using System.Text.RegularExpressions; using System.Reflection; public class CompiledRegexExample { public static void Main() { // T o m ng ch a các i tư ng RegexCompilationInfo. RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2]; // T o i tư ng RegexCompilationInfo cho PinRegex. regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$", RegexOptions.Compiled, "PinRegex", "", true); // T o i tư ng RegexCompilationInfo cho CreditCardRegex. regexInfo[1] = new RegexCompilationInfo( @"^\d{4}-?\d{4}-?\d{4}-?\d{4}$", RegexOptions.Compiled, "CreditCardRegex", "", true); // T o i tư ng AssemblyName nh nghĩa assembly. AssemblyName assembly = new AssemblyName(); assembly.Name = "MyRegEx"; // T o các bi u th c chính quy ư c biên d ch. Regex.CompileToAssembly(regexInfo, assembly); } } Tạo ngày và giờ từ chuỗi 2.7 B n c n t o m t th hi n System.DateTime mô t gi , ngày ư c ch nh trong m t chu i. S d ng phương th c Parse ho c ParseExact c a l p DateTime. Có nhi u cách mô t ngày, gi ; ví d 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cùng ch m t ngày; 16:43 và 4:43 PM cùng ch m t gi . L p DateTime cung c p phương th c tĩnh Parse r t linh ho t, cho phép t o th hi n DateTime t nhi u cách mô t khác nhau trong chu i. Phương th c Parse r t m nh trong vi c t o i tư ng DateTime t m t chu i cho trư c. Nó có th x lý m t chu i ch ch a m t ph n thông tin hay ch a thông tin sai, và thay th các giá tr thi u b ng các giá tr m c nh. Ngày m c nh là ngày hi n t i, gi m c nh là 12:00:00
  13. 65 Chương 2: Thao tác d li u AM. N u sau m i c g ng, Parse không th t o i tư ng DateTime, nó s ném ngo i l System.FormatException. Ví d sau minh h a tính linh ho t c a Parse: // 01/09/2004 12:00:00 AM DateTime dt1 = DateTime.Parse("Sep 2004"); // 05/09/2004 02:15:33 PM DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33"); // 05/09/2004 12:00:00 AM DateTime dt3 = DateTime.Parse("5,9,04"); // 05/09/2004 02:15:33 PM DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33"); // 07/10/2004 02:15:00 PM (gi s ngày hi n t i là 07/10/2004) DateTime dt5 = DateTime.Parse("2:15 PM"); Phương th c Parse linh ho t và có th t s a l i. Tuy nhiên, m c linh ho t này không c n thi t trong trư ng h p b n mu n b o m các chu i ph i theo m t nh d ng nh t nh. Khi ó, s d ng phương th c ParseExact thay cho Parse. D ng ơn gi n nh t c a ParseExact nh n ba i s : chu i ch a ngày gi , chu i nh d ng xác nh c u trúc mà chu i ch a ngày gi ph i tuân theo, và m t tham chi u IFormatProvider cung c p thông tin c thù v b n a. N u IFormatProvider là null, thông tin v b n a c a ti u trình (thread) hi n hành s ư c s d ng. N u ngày gi trong chu i ang xét không úng v i nh d ng quy nh, ParseExact s ném ngo i l System.FormatException. Chu i nh d ng ư c s d ng tương t như khi b n ch nh chu i i di n cho m t i tư ng DateTime. i u này có nghĩa là b n có th s d ng c nh d ng chu n l n nh d ng tùy bi n. Tham kh o ph n tài li u cho l p System.Globalization.DateTimeFormatInfo trong tài li u .NET Framework SDK có thông tin y v t t c các ki u nh d ng. // Ch phân tích các chu i ch a LongTimePattern. DateTime dt6 = DateTime.ParseExact("2:13:30 PM", "h:mm:ss tt", null); // Ch phân tích các chu i ch a RFC1123Pattern. DateTime dt7 = DateTime.ParseExact( "Sun, 05 Sep 2004 14:13:30 GMT", "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null); // Ch phân tích các chu i ch a MonthDayPattern. DateTime dt8 = DateTime.ParseExact("September 03", "MMMM dd", null); Cộng, trừ, so sánh ngày giờ 2.8 B n c n th c hi n các phép tính s h c cơ b n hay phép so sánh trên ngày, gi . S d ng các c u trúc DateTime và TimeSpan (h tr các toán t s h c và so sánh).
  14. 66 Chương 2: Thao tác d li u M t i tư ng DateTime mô t m t th i i m xác nh (ch ng h n 4:15 AM, ngày 21 tháng 04 năm 1980), trong khi i tư ng TimeSpan mô t m t kho ng th i gian (ch ng h n 2 gi , 35 phút). B n có th c ng, tr , so sánh các i tư ng TimeSpan và DateTime. Th c ch t, c DateTime và TimeSpan u s d ng tick mô t th i gian—1 tick b ng 100 nano-giây (m t nano-giây b ng m t ph n t (10-9) giây). TimeSpan lưu kho ng th i gian c a nó là s tick b ng kho ng th i gian ó, DateTime lưu s tick ã trôi qua k t 12:00:00 khuya ngày 1 tháng 1 năm 0001 sau công nguyên. Cách ti p c n này và vi c s d ng toán t n p ch ng giúp DateTime và TimeSpan d dàng h tr các phép tính s h c và so sánh. B ng 2.4 tóm t t các toán t mà hai c u trúc này h tr . B ng 2.4 Các toán t ư c cung c p b i DateTime và TimeSpan Toán t TimeSpan DateTime Vì TimeSpan là m t c u trúc nên Vì DateTime là m t c u trúc nên Gán (=) phép gán tr v m t b n sao, phép gán tr v m t b n sao, không không ph i m t tham chi u. ph i m t tham chi u. C ng mt vào mt TimeSpan C ng (+) C ng hai i tư ng TimeSpan. DateTime. Tr mt cho mt DateTime Tr (-) Tr hai i tư ng TimeSpan. DateTime ho c m t TimeSpan. So sánh hai i tư ng TimeSpan và So sánh hai i tư ng DateTime và B ng (==) tr v true n u b ng nhau. tr v true n u b ng nhau. Không b ng So sánh hai i tư ng TimeSpan và So sánh hai i tư ng DateTime và (!=) tr v true n u không b ng nhau. tr v true n u không b ng nhau. Xác nh m t i tư ng TimeSpan Xác nh m t i tư ng DateTime có l n hơn m t i tư ng L n hơn (>) có l n hơn m t i tư ng DateTime TimeSpan khác hay không. khác hay không. Xác nh m t i tư ng TimeSpan Xác nh m t i tư ng DateTime L n ho c b ng có l n hơn ho c b ng m t i có l n hơn ho c b ng m t i (>=) tư ng TimeSpan khác hay không. tư ng DateTime khác hay không. Xác nh m t i tư ng TimeSpan Xác nh m t i tư ng DateTime có nh hơn m t i tư ng Nh hơn (
  15. 67 Chương 2: Thao tác d li u C u trúc DateTime cũng hi n th c các phương th c AddTicks, AddMilliseconds, AddSeconds, AddMinutes, AddHours, AddDays, AddMonths, và AddYears. M i phương th c này cho phép b n c ng (ho c tr b ng các giá tr âm) ph n t th i gian thích h p v i i tư ng DateTime. Các phương th c này và các toán t ư c li t kê trong b ng 2.4 không làm thay i DateTime g c—thay vào ó chúng s t o m t i tư ng m i v i giá tr ã ư c thay i. o n mã dư i ây trình bày cách s d ng các toán t thao tác các c u trúc DateTime và TimeSpan: // T o m t TimeSpan mô t 2.5 ngày. TimeSpan timespan1 = new TimeSpan(2,12,0,0); // T o m t TimeSpan mô t 4.5 ngày. TimeSpan timespan2 = new TimeSpan(4,12,0,0); // T o m t TimeSpan mô t 1 tu n. TimeSpan oneWeek = timespan1 + timespan2; // T o m t DateTime v i ngày gi hi n t i. DateTime now = DateTime.Now; // T o m t DateTime mô t 1 tu n trư c ây. DateTime past = now - oneWeek; // T o m t DateTime mô t 1 tu n trong tương lai. DateTime future = now + oneWeek; Sắp xếp một mảng hoặc một ArrayList 2.9 B n c n s p x p các ph n t trong m t m ng ho c m t ArrayList. S d ng phương th c ArrayList.Sort s p x p ArrayList và phương th c tĩnh s p x p m ng. Array.Sort D ng ơn gi n nh t c a Sort là s p x p các i tư ng n m trong m t m ng ho c ArrayList khi các i tư ng này có hi n th c giao di n System.Icomparable và có ki u gi ng nhau—t t c các ki u d li u cơ b n u hi n th c Icomparable. o n mã dư i ây minh h a cách s d ng phương th c Sort: // T o m t m ng m i và thêm ph n t vào. int[] array = {4, 2, 9, 3}; // S p x p m ng. Array.Sort(array); // Hi n th n i dung c a m ng ã ư c s p x p. foreach (int i in array) { Console.WriteLine(i);} // T o m t ArrayList m i và thêm ph n t vào. ArrayList list = new ArrayList(4); list.Add("Phong"); list.Add("Phuong"); list.Add("Khoa"); list.Add("Tam"); // S p x p ArrayList. list.Sort(); // Hi n th n i dung c a ArrayList ã ư c s p x p. foreach (string s in list) { Console.WriteLine(s);}
  16. 68 Chương 2: Thao tác d li u s p x p các i tư ng không hi n th c IComparable, b n c n truy n cho phương th c Sort m t i tư ng hi n th c giao di n System.Collections.IComparer. Hi n th c c a IComparer ph i có kh năng so sánh các i tư ng n m trong m ng ho c ArrayList (xem m c 16.3 bi t cách hi n th c IComparable và IComparer). Chép một tập hợp vào một mảng 2.10 B n c n chép n i dung c a m t t p h p vào m t m ng. S d ng phương th c ICollection.CopyTo ( ư c hi n th c b i t t c các l p t p h p), ho c s d ng phương th c ToArray ( ư c hi n th c b i các t p h p ArrayList, Stack, Queue). Các phương th c ICollection.CopyTo và ToArray có cùng ch c năng, chúng chép các ph n t trong m t t p h p vào m t m ng. S khác bi t n m ch CopyTo chép vào m t m ng ã có, trong khi ToArray t o ra m t m ng m i r i chép vào ó. CopyTo nh n hai i s : m t m ng và m t ch s . M ng này là ích c a quá trình sao chép và ph i có ki u tương thích v i các ph n t c a t p h p. N u ki u không tương thích hay không có s chuy n i ng m t ki u ph n t c a t p h p sang ki u ph n t c a m ng thì ngo i l System.InvalidCastException s b ném. Ch s là m t v trí trong m ng mà b t ut ó các ph n t c a t p h p s ư c chép vào. N u ch s này l n hơn ho c b ng chi u dài c a m ng, ho c s ph n t c a t p h p vư t quá s c ch a c a m ng thì ngo i l System.ArgumentException s b ném. o n mã sau minh h a cách s d ng CopyTo chép n i dung c a m t ArrayList vào m t m ng: // T o m t ArrayList m i và thêm ph n t vào. ArrayList list = new ArrayList(5); list.Add("Phuong"); list.Add("Phong"); list.Add("Nam"); list.Add("Tam"); list.Add("Nhan"); // T o m t string[] và s d ng ICollection.CopyTo // chép n i dung c a ArrayList. string[] array1 = new string[5]; list.CopyTo(array1,0); Các l p ArrayList, Stack, và Queue cũng hi n th c phương th c ToArray, phương th c này t ng t o m t m ng v i kích thư c ch a các ph n t c a c a t p h p. N u b n không truy n i s cho ToArray, nó s tr v m t object[] b t ch p ki u c a các i tư ng trong t p h p. Tuy nhiên, b n có th truy n m t i tư ng System.Type ch nh ki u c a m ng (B n ph i ép m ng ki u m nh v úng ki u). Ví d sau minh h a cách s d ng ToArray cho ArrayList trên: // S d ng ArrayList.ToArray t o m t object[] // t n i dung c a t p h p. object[] array2 = list.ToArray(); // S d ng ArrayList.ToArray t o m t string[] ki u m nh // t n i dung c a t p h p.
  17. 69 Chương 2: Thao tác d li u string[] array3 = (string[])list.ToArray(System.Type.GetType("System.String")); Tạo một tập hợp kiểu mạnh 2.11 B n c n t o m t t p h p ch ch a các ph n t thu c m t ki u nh t nh. To mt lp dn xu t t lp hay System.Collections.CollectionBase System.Collections.DictionaryBase, và hi n th c các phương th c an-toàn-v - ki u-d -li u (type-safe) thao tác trên t p h p. Các l p CollectionBase và DictionaryBase có th óng vai trò các l p cơ s d n xu t ra các l p t p h p an-toàn-ki u mà không ph i hi n th c l i các giao di n chu n: IDictionary, IList, ICollection, và IEnumerable. CollectionBasedùng cho các t p h p d a-trên-Ilist (như ArrayList). Th c ch t, • CollectionBase duy trì t p h p b ng m t i tư ng ArrayList chu n, có th ư c truy xu t thông qua thu c tính b o v List. DictionaryBasedùng cho các t p h p d a-trên-IDictionary (như Hashtable). Th c • ch t, DictionaryBase duy trì t p h p b ng m t i tư ng Hashtable chu n, có th ưc truy xu t thông qua thu c tính b o v Dictionary. o n mã sau hi n th c m t t p h p tên m nh (d a trên l p CollectionBase) th hi n m t danh sách các i tư ng System.Reflection.AssemblyName. using System.Reflection; using System.Collections; public class AssemblyNameList : CollectionBase { public int Add(AssemblyName value) { return this.List.Add(value); } public void Remove(AssemblyName value) { this.List.Remove(value); } public AssemblyName this[int index] { get { return (AssemblyName)this.List[index]; } set { this.List[index] = value; } } public bool Contains(AssemblyName value) { return this.List.Contains(value); }
  18. 70 Chương 2: Thao tác d li u public void Insert(int index, AssemblyName value) { this.List.Insert(index, value); } } C hai l p CollectionBase và DictionaryBase u hi n th c m t t p các phương th c ư c- b o-v có ti p u ng On*. Các phương th c này (ch ng h n OnClear, OnClearComplete, OnGet, OnGetComplete,…) thư ng ư c chép è các l p d n xu t nh m cho phép b n hi n th c các ch c năng tùy bi n c n thi t qu n lý t p h p ki u m nh. Các l p CollectionBase và DictionaryBase s g i phương th c phù h p trư c và sau khi vi c ch nh s a ư c th c hi n trên t p h p n m dư i thông qua thu c tính List hay Dictionary. Lưu một đối tượng khả-tuần-tự-hóa vào file 2.12 B n c n lưu m t i tư ng kh -tu n-t -hóa và các tr ng thái c a nó vào file, sau ó gi i tu n t hóa khi c n. S d ng m t formatter tu n t hóa i tư ng và ghi nó vào m t System.IO.FileStream. Khi c n truy xu t i tư ng, s d ng formatter cùng ki u c d li u ư c-tu n-t -hóa t file và gi i tu n t hóa i tư ng. Thư vi n l p .NET Framework cung c p các hi n th c formatter sau ây tu n t hóa i tư ng theo d ng nh phân hay SOAP: • System.Runtime.Serialization.Formatters.Binary.BinaryFormatter • System.Runtime.Serialization.Formatters.Soap.SoapFormatter L p BinaryFormatter và SoapFormatter có th ư c s d ng tu n t hóa m t i tư ng c a b t kỳ ki u nào ư c g n v i c tính System.SerializableAttribute. BinaryFormatter sinh ra m t stream d li u nh phân mô t i tư ng và tr ng thái c a nó, trong khi SoapFormatter sinh ra m t tài li u SOAP. C hai l p BinaryFormatter và SoapFormatter u hi n th c giao di n System.Runtime. Serialization.IFormatter, giao di n này nh nghĩa hai phương th c: Serialize và Deserialize. Serializenh n m t tham chi u System.Object và m t tham chi u System.IO.Stream • làm i s , tu n t hóa Object và ghi nó vào Stream. Deserializenh n m t tham chi u Stream làm is, c d li u c a i tư ng • ư c-tu n-t -hóa t Stream, và tr v m t tham chi u Object n i tư ng ư c-gi i- tu n-t -hóa. B n ph i ép tham chi u Object này v ki u thích h p. g i các phương th c Serialize và Deserialize c a l p BinaryFormatter, mã l nh c a b n ph i ư c c p ph n t SerializationFormatter c a l p System.Security.Permissions. SecurityPermission. g i các phương th c Serialize và Deserialize c a l p SoapFormatter, mã l nh c a b n ph i ư c c p quy n “tin tư ng tuy t i” (full trust) vì assembly System.Runtime. Serialization.Formatters.Soap.dll (l p SoapFormatter ư c khai báo bên trong assembly này)
  19. 71 Chương 2: Thao tác d li u không cho phép các mã l nh ch ư c-tin-c y-m t-ph n (partially trusted caller) s d ng nó. Tham kh o m c 13.1 có thêm thông tin v mã l nh ư c-tin-c y-m t-ph n. L p BinarySerializationExample dư i ây minh h a cách s d ng l p BinaryFormatter tu n t hóa m t System.Collections.ArrayList ch a danh sách tên ngư i vào m t file. Sau ó, ArrayList ư c gi i tu n t hóa t file và n i dung c a nó s ư c hi n th trong c a s Console. using System.IO; using System.Collections; using System.Runtime.Serialization.Formatters.Binary; public class BinarySerializationExample { public static void Main() { // T o và c u hình ArrayList tu n t hóa. ArrayList people = new ArrayList(); people.Add("Phuong"); people.Add("Phong"); people.Add("Nam"); // Tu n t hóa i tư ng ArrayList. FileStream str = File.Create("people.bin"); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(str, people); str.Close(); // Gi i tu n t hóa i tư ng ArrayList. str = File.OpenRead("people.bin"); bf = new BinaryFormatter(); people = (ArrayList)bf.Deserialize(str); str.Close(); // Hi n th n i dung c a i tư ng ArrayList // ã- ư c-gi i-tu n-t -hóa. foreach (string s in people) { System.Console.WriteLine(s); } } } B n có th s d ng l p SoapFormatter theo cách như ư c trình bày trong l p trên, ch c n thay m i th hi n c a l p BinaryFormatter b ng BinarySerializationExample th hi n c a l p SoapFormatter và thay i ch th using nh p không gian tên System.Runtime.Serialization.Formatters.Soap. Ngoài ra, b n c n thêm m t tham chi u n System.Runtime.Serialization.Formatters.Soap.dll khi biên d ch mã. File SoapSerializationExample.cs trong ĩa CD ính kèm s trình bày cách s d ng l p SoapFormatter. Hình 2.1 và 2.2 dư i ây minh h a hai k t qu khác nhau khi s d ng l p BinaryFormatter và SoapFormatter. Hình 2.1 trình bày n i dung c a file people.bin ư c t o ra khi s d ng BinaryFormatter, hình 2.2 trình bày n i dung c a file people.xml ư c t o ra khi s d ng SoapFormatter.
  20. 72 Chương 2: Thao tác d li u Hình 2.1 N i dung file people.bin Hình 2.2 N i dung file people.xml
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2