Các giải pháp lập trình CSharp- P8 pot

10 367 0
Các giải pháp lập trình CSharp- P8 pot

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

Thông tin tài liệu

71 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). [abc] 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 , b , hoặc C . [^abc] 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] sẽ không so trùng với A , b , or C nhưng so trùng với B , F ,… [a-z] 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 , 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 . {n} Xác định có đúng n ký tự hoặc biểu thức con đứng trước nó, ví dụ A{2} chỉ so trùng với AA . {n,} 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,} so trùng với AA , AAA , AAAA ,… nhưng không so trùng với A . {n, m} 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 , 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 Số Chỉ chứa các chữ số thập phân; ví dụ 5 , hoặc 5683874674 . ^\d+$ PIN Chứa 4 chữ số thập phân, ví dụ 1234 . ^\d{4}$ Mật khẩu đơn giản Chứa từ 6 đến 8 ký tự; ví dụ ghtd6f hoặc b8c7hogh . ^\w{6,8}$ Số thẻ tín dụng 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, ví dụ 4921835221552042 hoặc 4921- 8352-2155-2042 . ^\d{4}-?\d{4}-?\d{4}- ? \d{4}$ 72 Chương 2: Thao tác dữ liệu Địa chỉ e-mail [\w-]+ nghĩa là chứa một hoặc nhiều ký tự word hoặc dấu gạch ngang, ví dụ some-body@adatum.com ^[\w-]+@([\w- ] +\.)+[\w-]+$ HTTP hoặc HTTPS URL Dữ liệu là một URL dựa-trên-HTTP hay dựa-trên-HTTPS, ví dụ http://www.microsoft.com ^https?://([\w- ] +\.)+[\w-]+(/[\w- ./ ? %=]*)?$ 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); } 6. 6. S d ng bi u th c chính quy đã đ c biên d chử ụ ể ứ ượ ị S d ng bi u th c chính quy đã đ c biên d chử ụ ể ứ ượ ị   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. 73 Chương 2: Thao tác dữ liệu   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. RegexOptions để biên dịch biểu thức chính quy thành Microsoft Intermediate 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 đủ lớn để 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. 74 Chương 2: Thao tác dữ liệu 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. 4. Gọi 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); 75 Chương 2: Thao tác dữ liệu } } 7. 7. T o ngày và gi t chu iạ ờ ừ ỗ T o ngày và gi t chu iạ ờ ừ ỗ   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 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ỉ 76 Chương 2: Thao tác dữ liệu đị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); 8. 8. C ng, tr , so sánh ngày giộ ừ ờ C ng, tr , so sánh ngày giộ ừ ờ   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). 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 Gán ( = ) Vì TimeSpan là một cấu trúc nên phép gán trả về một bản sao, không phải một tham chiếu. Vì DateTime là một cấu trúc nên phép gán trả về một bản sao, không phải một tham chiếu. 77 Chương 2: Thao tác dữ liệu Cộng ( + ) Cộng hai đối tượng TimeSpan . Cộng một TimeSpan vào một DateTime . Trừ ( - ) Trừ hai đối tượng TimeSpan . Trừ một DateTime cho một DateTime hoặc một TimeSpan . Bằng ( == ) So sánh hai đối tượng TimeSpan và trả về true nếu bằng nhau. So sánh hai đối tượng DateTime và trả về true nếu bằng nhau. Không bằng ( != ) So sánh hai đối tượng TimeSpan và trả về true nếu không bằng nhau. So sánh hai đối tượng DateTime và trả về true nếu không bằng nhau. Lớn hơn ( > ) Xác định một đối tượng TimeSpan có lớn hơn một đối tượng TimeSpan khác hay không. Xác định một đối tượng DateTime có lớn hơn một đối tượng DateTime khác hay không. Lớn hoặc bằng ( >= ) Xác định một đối tượng TimeSpan có lớn hơn hoặc bằng một đối tượng TimeSpan khác hay không. Xác định một đối tượng DateTime có lớn hơn hoặc bằng một đối tượng DateTime khác hay không. Nhỏ hơn ( < ) Xác định một đối tượng TimeSpan có nhỏ hơn một đối tượng TimeSpan khác hay không. Xác định một đối tượng DateTime có nhỏ hơn một đối tượng DateTime khác hay không. Nhỏ hoặc bằng ( <= ) Xác định một đối tượng TimeSpan có nhỏ hơn hoặc bằng một đối tượng TimeSpan khác hay không. Xác định một đối tượng DateTime có nhỏ hơn hoặc bằng một đối tượng DateTime khác hay không. Âm ( - ) Trả về một giá trị đảo dấu của một TimeSpan . Không hỗ trợ. Dương ( + ) Trả về chính TimeSpan . Không hỗ trợ. 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; 78 Chương 2: Thao tác dữ liệu // 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; 9. 9. S p x p m t m ng ho c m t ArrayListắ ế ộ ả ặ ộ S p x p m t m ng ho c m t ArrayListắ ế ộ ả ặ ộ   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 Array.Sort để sắp xếp mảng. 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);} 79 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 ). 10. 10. Chép m t t p h p vào m t m ngộ ậ ợ ộ ả Chép m t t p h p vào m t m ngộ ậ ợ ộ ả   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 đầu từ đó 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: 80 Chương 2: Thao tác dữ liệu // 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. string[] array3 = (string[])list.ToArray(System.Type.GetType("System.String")); 11. 11. T o m t t p h p ki u m nhạ ộ ậ ợ ể ạ T o m t t p h p ki u m nhạ ộ ậ ợ ể ạ   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.   Tạo một lớp dẫn xuất từ lớp System.Collections.CollectionBase hay 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) { . 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. 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). [abc] So trùng với một trong các ký tự trong. 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:

Ngày đăng: 08/07/2014, 17:20

Từ khóa liên quan

Mục lục

  • LỜI NÓI ĐẦU

  • CẤU TRÚC CỦA SÁCH

  • QUY ƯỚC

  • YÊU CẦU VỀ HỆ THỐNG

  • CÁCH SỬ DỤNG ĐĨA CD

  • MỤC LỤC

  • Chương 1:PHÁT TRIỂN ỨNG DỤNG

    • 1. Tạo ứng dụng Console

    • 2. Tạo ứng dụng dựa-trên-Windows

    • 3. Tạo và sử dụng module

    • 4. Tạo và sử dụng thư viện

    • 5. Truy xuất các đối số dòng lệnh

    • 6. Chọn biên dịch một khối mã vào file thực thi

    • 8. Tạo và quản lý cặp khóa tên mạnh

    • 9. Tạo tên mạnh cho assembly

    • 10. Xác minh một assembly tên mạnh không bị sửa đổi

    • 11. Hoãn việc ký assembly

    • 12. Ký assembly với chữ ký số Authenticode

    • 13. Tạo và thiết lập tin tưởng một SPC thử nghiệm

    • 14. Quản lý Global Assembly Cache

    • 15. Ngăn người khác dịch ngược mã nguồn của bạn

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

  • Đang cập nhật ...

Tài liệu liên quan