Giáo trình hướng dẫn cách truy cập vào các mảng đa chiều trên diện rộng có các kích thước khác nhau phần 8 docx

40 350 0
Giáo trình hướng dẫn cách truy cập vào các mảng đa chiều trên diện rộng có các kích thước khác nhau phần 8 docx

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ngơn Ngữ Lập Trình C# // Tham số thứ ba true bỏ qua kiểm tra ký tự thường – hoa result = string Compare(s1, s2, true); Console.WriteLine(“Khong phan biet chu thuong va hoa\n”); Console.WriteLine(“S1: {0} , S2: {1}, ket qua : {2}\n”, s1, s2, result); // phương thức nối chuỗi string s4 = string.Concat(s1, s2); Console.WriteLine(“Chuoi S4 noi tu chuoi S1 va S2: {0}”, s4); // sử dụng nạp chồng toán tử + string s5 = s1 + s2; Console.WriteLine(“Chuoi S5 duoc noi tu chuoi S1 va S2: {0}”, s5); // Sử dụng phương thức copy chuỗi string s6 = string.Copy(s5); Console.WriteLine(“S6 duoc chep tu S5: {0}”, s6); // Sử dụng nạp chồng toán tử = string s7 = s6; Console.WriteLine(“S7 = S6: {0}”, s7); // Sử dụng ba cách so sánh hai chuỗi // Cách sử dụng chuỗi để so sánh với chuỗi lại Console.WriteLine(“S6.Equals(S7) ?: {0}”, s6.Equals(s7)); // Cách dùng hàm lớp string so sánh hai chuỗi Console.WriteLine(“Equals(S6, s7) ?: {0}”, string.Equals(s6, s7)); // Cách dùng toán tử so sánh Console.WriteLine(“S6 == S7 ?: {0}”, s6 == s7); // Sử dụng hai thuộc tính hay dùng mục chiều dài chuỗi Console.WriteLine(“\nChuoi S7 co chieu dai la : {0}”, s7.Length); Console.WriteLine(“Ky tu thu cua chuoi S7 la : {0}”, s7[2] ); // Kiểm tra xem chuỗi có kết thúc với nhóm ký // tự xác định hay không Console.WriteLine(“S3: {0}\n ket thuc voi chu CNTT ? : {1}\n”, s3, s3.EndsWith(“CNTT”)); Console.WriteLine(“S3: {0}\n ket thuc voi chu Nam ? : {1}\n”, s3, s3.EndsWith(“Nam”)); // Trả mục chuỗi Console.WriteLine(“\nTim vi tri xuat hien dau tien cua chu CNTT ”); Console.WriteLine(“trong chuoi S3 {0}\n”, s3.IndexOf(“CNTT”)); // Chèn từ nhân lực vào trước CNTT chuỗi S3 string s8 = s3.Insert(18, “nhan luc ”); Console.WriteLine(“ S8 : {0}\n”, s8); 281 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# // Ngồi ta kết hợp sau string s9 = s3.Insert( s3.IndexOf( “CNTT” ) , “nhan luc ”); Console.WriteLine(“ S9 : {0}\n”, s9); } // end Main } // end class } // end namespace  Kết quả: So sanh hai chuoi S1: abcd S2: ABCD ket qua: -1 Khong phan biet chu thuong va hoa S1: abcd , S2: ABCD, ket qua : Chuoi S4 noi tu chuoi S1 va S2: abcdABCD Chuoi S5 duoc noi tu chuoi S1 + S2: abcdABCD S6 duoc chep tu S5: abcdABCD S7 = S6: abcdABCD S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6 == S7 ?: True Chuoi S7 co chieu dai la : Ky tu thu cua chuoi S7 la : c S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu CNTT ? : False S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu Minh ? : True Tim vi tri xuat hien dau tien cua chu CNTT chuoi S3 18 S8 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam S9 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam Như xem đoạn chương trình minh họa trên, chương trình bắt đầu với ba khai báo chuỗi: string s1 = “abcd”; string s2 = “ABCD”; 282 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# string s3 = @“Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam”; Hai chuỗi đầu s1 s2 khai báo chuỗi ký tự bình thường, cịn chuỗi thứ ba khai báo chuỗi nguyên văn (verbatim string) cách sử dụng ký hiệu @ trước chuỗi Chương trình bắt đầu việc so sánh hai chuỗi s1 s2 Phương thức Compare() phương thức tĩnh lớp string, phương thức nạp chồng Phiên phương thức nạp chồng lấy hai chuỗi so sánh chúng với nhau: // So sánh hai chuỗi với có phân biệt chữ thường chữ hoa result = string.Compare( s1 ,s2); Console.WriteLine(“So sanh hai chuoi s1: {0} s2: {1} ket qua: {2} \n”, s1 ,s2 ,result); Ở việc so sánh có phân biệt chữ thường chữ hoa, phương thức trả giá trị khác phụ thuộc vào kết so sánh:  Một số âm chuỗi nhỏ chuỗi thứ hai  Giá trị hai chuỗi  Một số dương chuỗi thứ lớn chuỗi thứ hai Trong trường hợp so sánh đưa kết chuỗi s1 nhỏ chuỗi s2 Trong Unicode ASCII thứ tự ký tự thường nhỏ thứ tự ký tự hoa: So sanh hai chuoi S1: abcd S2: ABCD ket qua: -1 Cách so sánh thứ hai dùng phiên nạp chồng Compare() lấy ba tham số Tham số Boolean định bỏ qua hay không bỏ qua việc so sánh phân biệt chữ thường chữ hoa Tham số bỏ qua Nếu giá trị tham số true việc so sánh bỏ qua phân biệt chữ thường chữ hoa Việc so sánh sau không quan tâm đến kiểu loại chữ: // Tham số thứ ba true bỏ qua kiểm tra ký tự thường – hoa result = string Compare(s1, s2, true); Console.WriteLine(“Khong phan biet chu thuong va hoa\n”); Console.WriteLine(“S1: {0} , S2: {1}, ket qua : {2}\n”, s1, s2, result); Lúc việc so sánh hồn tồn giống kết trả giá trị 0: Khong phan biet chu thuong va hoa S1: abcd , S2: ABCD, ket qua : Ví dụ minh họa 10.1 tiếp tục với việc nối chuỗi lại với Ở sử dụng hai cách để nối liền hai chuỗi Chúng ta sử dụng phương thức Concat() phương thức public static string: string s4 = string.Concat(s1, s2); Hay cách khác đơn giản việc sử dụng toán tử nối hai chuỗi (+): string s5 = s1 + s2; Trong hai trường hợp kết nối hai chuỗi hồn tồn thành công sau: 283 Xử Lý Chuỗi Ngôn Ngữ Lập Trình C# Chuoi S4 noi tu chuoi S1 va S2: abcdABCD Chuoi S5 duoc noi tu chuoi S1 + S2: abcdABCD Tương tự vậy, việc tạo chuỗi thiết lập hai cách Đầu tiên sử dụng phương thức static Copy() sau: string s6 = string.Copy(s5); Hoặc thuận tiện sử dụng phương thức nạp chồng tốn tử (=) thơng qua việc chép ngầm định: string s7 = s6; Kết hai cách tạo hoàn toàn nhau: S6 duoc chep tu S5: abcdABCD S7 = S6: abcdABCD Lớp String NET cung cấp ba cách để kiểm tra hai chuỗi Đầu tiên sử dụng phương thức nạp chồng Equals() để kiểm tra trực tiếp S6 có S7 hay không: Console.WriteLine(“S6.Equals(S7) ?: {0}”, S6.Equals(S7)); Kỹ thuật so sánh thứ hai truyền hai chuỗi vào phương thức Equals() string: Console.WriteLine(“Equals(S6, s7) ?: {0}”, string.Equals(S6, S7)); Và phương pháp cuối sử dụng nạp chồng toán tử so sánh (=) String: Console.WriteLine(“S6 == S7 ?: {0}”, s6 == s7); Trong ba trường hợp kết trả giá trị Boolean, ta có kết sau: S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6 == S7 ?: True Việc so sánh hai chuỗi việc tự nhiên thường sử dụng Tuy nhiên, số ngơn ngữ, VB.NET, khơng hỗ trợ nạp chồng tốn tử Do để chắn nên sử dụng phương thức Equals() tốt Các đoạn chương trình ví dụ 10.1 sử dụng tốn tử mục ([]) để tìm ký tự xác định chuỗi Và dùng thuộc tính Length để lấy chiều dài toàn chuỗi: Console.WriteLine(“\nChuoi S7 co chieu dai la : {0}”, s7.Length); Console.WriteLine(“Ky tu thu cua chuoi S7 la : {0}”, s7[2] ); Kết là: Chuoi S7 co chieu dai la : Ky tu thu cua chuoi S7 la : c Phương thức EndsWith() hỏi xem chuỗi có chứa chuỗi vị trí cuối hay khơng Do vậy, hỏi chuỗi S3 có kết thúc chuỗi “CNTT” hay chuỗi “Nam”: // Kiểm tra xem chuỗi có kết thúc với nhóm ký tự xác định hay khơng 284 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# Console.WriteLine(“S3: {0}\n ket thuc voi chu CNTT ? : {1}\n”, s3, s3.EndsWith(“CNTT”)); Console.WriteLine(“S3: {0}\n ket thuc voi chu Nam ? : {1}\n”, s3, s3.EndsWith(“Nam”)); Kết trả lần kiểm tra sai chuỗi S3 không kết thúc chữ “CNTT”, lần kiểm tra thứ hai đúng: S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu CNTT ? : False S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu Minh ? : True Phương thức IndexOf() vị trí bên chuỗi (nếu có) Và phương thức Insert() chèn chuỗi vào chép chuỗi ban đầu Đoạn lệnh ví dụ minh họa thực việc xác định vị trí xuất chuỗi “CNTT” chuỗi S3: Console.WriteLine(“\nTim vi tri xuat hien dau tien cua chu CNTT ”); Console.WriteLine(“trong chuoi S3 {0}\n”, s3.IndexOf(“CNTT”)); Và kết tìm 18: Tim vi tri xuat hien dau tien cua chu CNTT chuoi S3 18 Chúng ta chèn vào chuỗi từ “nhan luc” theo sau chuỗi khoảng trắng vào chuỗi ban đầu Khi thực phương thức trả chuỗi chèn vào chuỗi gán lại vào chuỗi S8: string s8 = s3.Insert(18, “nhan luc ”); Console.WriteLine(“ S8 : {0}\n”, s8); Kết đưa là: S8 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam Cuối cùng, kết hợp số phép toán để thực việc chèn sau: string s9 = s3.Insert( s3.IndexOf( “CNTT” ) , “nhan luc ”); Console.WriteLine(“ S9 : {0}\n”, s9); Kết cuối tương tự cách chèn bên trên: S9 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam Tìm chuỗi 285 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# Trong kiểu liệu String có cung cấp phương thức Substring() để trích chuỗi từ chuỗi ban đầu Cả hai phiên dùng mục để xác định vị trí bắt đầu trích Và hai phiên dùng mục thứ hai làm vị trí kết thúc chuỗi Trong ví dụ 10.2 minh họa việc sử dụng phương thức Substring() chuỗi  Ví dụ 10.2 : Sử dụng phương thức Substring() namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() { // Khai báo chuỗi để sử dụng string s1 = “Mot hai ba bon”; int ix; // lấy số khoảng trắng cuối ix = s1.LastIndexOf(“ ”); // lấy từ cuối string s2 = s1.Substring( ix+1); // thiết lập lại chuỗi s1 từ vị trí đến vị trí ix // s1 có giá trị mot hai ba s1 = s1.Substring(0, ix); // tìm số khoảng trắng cuối (sau hai) ix = s1.LastIndexOf(“ ”); // thiết lập s3 chuỗi vị trí ix // s3 = “ba” string s3 = s1.Substring(ix+1); // thiết lập lại s1 vị trí đến cuối vị trí ix // s1 = “mot hai” s1 = s1.Substring(0, ix); // ix đến khoảng trắng “mot” va “hai” ix = s1.LastIndexOf(“ ”); // tạo s4 chuỗi sau vị trí ix, // có giá trị “hai” string s4 = s1.Substring( ix+1); // thiết lập lại giá trị s1 286 Xử Lý Chuỗi Ngôn Ngữ Lập Trình C# s1 = s1.Substring(0, ix); // lấy số khoảng trắng cuối cùng, lúc ix –1 ix = s1.LastIndexOf(“ ”); // tạo chuỗi s5 số khoảng trắng, khơng có khoảng // trắng ix –1 nên chuỗi string s5 = s1.Substring(ix +1); Console.WriteLine(“s2 : {0}\n s3 : {1}”, s2, s3); Console.WriteLine(“s4 : {0}\n s5 : {1}\n”, s4, s5); Console.WriteLine(“s1: {0}\n”, s1); }// end Main }// end class }// end namespace  Kết quả: s2 : bon s3 : ba s4 : hai s5 : mot s1 : mot Ví dụ minh họa 10.2 khơng phải giải pháp tốt để giải vấn đề trích lấy ký tự chuỗi Nhưng cách gần tốt minh họa hữu dụng cho kỹ thuật Chia chuỗi Một giải pháp giải hiệu để minh họa cho ví dụ 10.2 sử dụng phương thức Split() lớp string Chức phân tích chuỗi thành chuỗi Để sử dụng Split(), truyền vào mảng ký tự phân cách, ký tự dùng để chia từ chuỗi Và phương thức trả mảng chuỗi  Ví dụ 10.3 : Sử dụng phương thức Split() namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() 287 Xử Lý Chuỗi Ngôn Ngữ Lập Trình C# { // tạo chuỗi để làm việc string s1 = “Mot, hai, ba Trung Tam Dao Tao CNTT”; // tạo ký tự khoảng trắng dấu phẩy const char Space = ‘ ‘; const char Comma = ‘,’; // tạo mảng phân cách char[] delimiters = new char[] { Space, Comma }; string output = “”; int ctr = 1; // thực việc chia chuỗi dùng vòng lặp // đưa kết vào mảng chuỗi foreach ( string subString in s1.Split(delimiters) ) { output += ctr++; output += “: ”; output += subString; output += “\n”; }// end foreach Console.WriteLine( output ); }// end Main }// end class } // end namespace  Kết quả: 1: Mot 2: 3: hai 4: 5: ba 6: Trung 7: Tam 8: Dao 9: Tao 288 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# 10: CNTT Đoạn chương trình bắt đầu việc tạo chuỗi để minh họa việc phân tích: string s1 = “Mot, hai, ba Trung Tam Dao Tao CNTT”; Hai ký tự khoảng trắng dấu phẩy dùng làm ký tự phân cách Sau phương thức Split() gọi chuỗi này, truyền kết vào vòng lặp: foreach ( string subString in s1.Split(delimiters) ) Chuỗi output chứa chuỗi kết khởi tạo chuỗi rỗng Ở tạo chuỗi output bốn bước Đầu tiên nối giá trị biến đếm ctr, thêm dấu hai chấm, đưa chuỗi chia từ chuỗi ban đầu, cuối thêm ký tự qua dòng Và bốn bước lặp đến chuỗi khơng cịn chia Có vấn đề cần nói kiểu liệu string không thiết kế cho việc thêm vào chuỗi định dạng sẵn để tạo chuỗi vòng lặp trên, nên phải thêm vào ký tự Một lớp StringBuilder tạo để phục vụ cho nhu cầu thao tác chuỗi tốt Thao tác chuỗi dùng StringBuilder Lớp StringBuilder sử dụng để tạo bổ sung chuỗi Hay nói lớp phần đóng gói khởi dựng cho String Một số thành viên quan trọng StringBuilder tóm tắt bảng 10.2 sau: Phương thức Capacity() Chars() Length() MaxCapacity() Append() AppendFormat() EnsureCapacity() Insert() Replace() System.StringBuilder Ý nghĩa Truy cập hay gán số ký tự mà StringBuilder nắm giữ Chỉ mục Thiết lập hay truy cập chiều dài chuỗi Truy cập dung lượng lớn StringBuilder Nối kiểu đối tượng vào cuối StringBuilder Thay định dạng xác định giá trị định dạng đối tượng Đảm bảo StringBuilder thời có khả tối thiểu lớn giá trị xác định Chèn đối tượng vào vị trí xác định Thay tất thể ký tự xác định với ký tự Bảng 10.2 Phương thức lớp StringBuilder 289 Xử Lý Chuỗi Ngơn Ngữ Lập Trình C# Khơng giống String, StringBuilder dễ thay đổi Khi bổ sung đối tượng StringBuilder làm thay đổi giá trị thật chuỗi, khơng phải Ví dụ minh họa 10.4 thay đối tượng String đối tượng StringBuilder  Ví dụ minh họa 10.4 : Sử dụng chuỗi StringBuilder namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() { // khởi tạo chuỗi để sử dụng string s1 = “Mot, hai, ba Trung Tam Dao Tao CNTT”; // tạo ký tự khoảng trắng dấu phẩy const char Space = ‘ ‘; const char Comma = ‘,’; // tạo mảng phân cách char[] delimiters = new char[] { Space, Comma }; // sử dụng StringBuilder để tạo chuỗi output StringBuilder output = new StringBuilder(); int ctr = 1; // chia chuỗi dùng vòng lặp để đưa kết vào // mảng chuỗi foreach ( string subString in s1.Split(delimiters) ) { // AppendFormat nối chuỗi định dạng output.AppendFormat(“{0}: {1}\n”, ctr++, subString); }// end foreach Console.WriteLine( output ); } } } 290 Xử Lý Chuỗi Ngôn Ngữ Lập Trình C# sử dụng để xác định phương thức tĩnh instance phương thức mà trước chương trình thực Giả sử minh họa sau, muốn tạo lớp chứa đơn giản gọi Pair lớp lưu giữ xếp hai đối tượng truyền vào cho chúng Tạm thời lúc biết loại đối tượng mà Pair lưu giữ Nhưng cách tạo phương thức bên đối tượng thực việc xếp ủy quyền, ủy quyền thực việc thứ tự cho thân đối tượng Những đối tượng khác xếp khác Ví dụ, Pair chứa đối tượng đếm xếp theo thứ tự số, Pair nút lệnh button theo thứ tự alphabe tên chúng Mong muốn người tạo lớp Pair đối tượng bên Pair phải có trách nhiệm cho biết thứ tự chúng thứ tự thứ hai Để làm điều này, phải đảm bảo đối tượng bên Pair phải cung cấp phương thức cho biết cách xếp đối tượng Chúng ta định nghĩa phương thức yêu cầu việc tạo ủy quyền, ủy quyền định nghĩa ký pháp kiểu trả phương thức đối tượng (như button) để cung cấp cho phép Pair xác định đối tượng đến trước đối tượng thứ hai Lớp Pair định nghĩa ủy quyền, WhichIsFirst Phương thức Sort lấy tham số thể WhichIsFirst Khi đối tượng Pair cần biết thứ tự đối tượng bên u cầu ủy quyền truyền vào hai đối tượng chứa tham số Trách nhiệm việc xác định thứ tự hai đối tượng trao cho phương thức đóng gói ủy quyền Để kiểm tra thực chế ủy quyền, tạo hai lớp, lớp Cat lớp Student Hai lớp có điểm chung với nhau, ngoại trừ hai thực thi phương thức đóng gói WhichIsFirst Do hai đối tượng lưu giữ bên đối tượng Pair Trong chương trình thử nghiệm tạo hai đối tượng Student hai đối tượng Cat lưu chúng vào đối tượng Pair Sau tạo đối tượng ủy quyền để đóng gói phương thức chúng, phương thức phải phù hợp với ký pháp kiểu trả ủy quyền Sau yêu cầu đối tượng Pair xếp đối tượng Student Cat, ta làm bước sau: Bắt đầu việc tạo phương thức khởi dựng Pair lấy hai đối tượng đưa chúng vào mảng riêng: public class Pair { // đưa vào đối tượng theo thứ tự public Pair( object firstObjectr, object secondObject) { thePair[0] = firstObject; 306 Cơ Chế Ủy Quyền - Sự Kiện Ngôn Ngữ Lập Trình C# thePair[1] = secondObject; } // biến lưu giữ hai đối tượng private object[] thePair = new object[2]; } Tiếp theo phủ phương thức ToString() để chứa giá trị hai đối tượng mà Pair nắm giữ: public override string ToString() { // xuất thứ tự đối tượng thứ trước đối tượng thứ hai return thePair[0].ToString() +”,” + thePair[1].ToString(); } Bây có hai đối tượng bên Pair xuất giá trị chúng hình Tiếp tục thực việc xếp in kết xếp Hiện khơng xác định loại đối tượng mà có, ủy quyền định thứ tự xếp cho thân đối tượng mà Pair lưu giữ bên Do vậy, yêu cầu đối tượng lưu giữ bên Pair thực việc kiểm tra xem đối tượng trước Phương thức lấy hai tham số đối tượng trả giá trị kiểu liệt kê: theFirstComeFirst đối tượng đến trước theSecondComeFirst giá trị thứ hai đến trước Những phương thức yêu cầu đóng gói ủy quyền WhichIsFirst định nghĩa bên lớp Pair: public delegate comparison WhichIsFirst( object obj1, object obj2); Giá trị trả kiểu comparison kiểu liệt kê: public enum comparison { theFirstComesFirst = 1, theSecondComesFirst = } Bất phương thức tĩnh lấy hai tham số đối tượng object trả kiểu comparison đóng gói ủy quyền vào lúc thực thi Lúc định nghĩa phương thức Sort cho lớp Pair: public void Sort( WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theSecondComeFirst) { 307 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } Phương thức lấy tham số: ủy quyền có kiểu WhichIsFirst với tên theDelegateFunc Phương thức Sort giao phó trách nhiệm định thứ tự đến trước sau hai đối tượng bên Pair đến phương thức đóng gói ủy quyền Bên thân Sort, phương thức ủy quyền gọi trả giá trị, giá trị hai giá trị liệt kê comparison Nếu giá trị trả theSecondComesFirst, đối tượng bên Pair hốn đổi vị trí, trường hợp ngược lại khơng làm Hãy tưởng tượng xếp Student theo tên Chúng ta viết phương thức trả theFirstComesFirst tên sinh viên đến trước theSecondComesFirst tên sinh viên thứ hai đến trước Nếu đưa vào “Amy, Beth” phương thức trả kết theFirstComesFirst Và ngược lại truyền “Beth, Amy” kết trả theSecondComesFirst Khi nhận kết theSecondComesFirst, phương thức Sort đảo hai đối tượng mảng, thiết lập Amy vị trí đầu cịn Beth vị trí thứ hai Tiếp theo thêm phương thức ReverseSort, phương thức đặt mục mảng theo thứ tự đảo ngược lại: public void ReverseSort( WhichIsFirst theDeleagteFunc) { if ( theDelegateFunc( thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } Việc thực tương tự phương thức Sort Tuy nhiên, phương thức thực việc hoán đổi phương thức ủy quyền xác định đối tượng trước tới trước Do vậy, kết thực phương thức đối tượng thứ hai đến trước Lúc truyền vào “Amy, Beth”, phương thức ủy quyền trả theFirstComesFirst, phương thức ReverseSort hoán đổi vị trí hai đối tượng này, thiết lập Beth đến trước Điều cho phép sử dụng phương thức ủy quyền tương tự Sort, mà không cần yêu cầu đối tượng hỗ trợ phương thức trả giá trị ngược 308 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# Lúc điều cần thiết tạo vài đối tượng để xếp Ta tạo hai lớp đối tượng đơn giản sau: lớp đối tượng Student lớp đối tượng Cat Gán cho đối tượng Student tên vào lúc tạo: public class Student { public Student (string name) { this.name = name; } } Lớp đối tượng Student yêu cầu hai phương thức, phương thức phủ ToString (), phương thức khác đóng gói phương thức ủy quyền Lớp Student phải phủ phương thức ToString() phương thức ToString() lớp Pair sử dụng cách xác Việc thực thi khơng có phức tạp mà đơn trả tên sinh viên: public override string ToString() { return name; } phải thực thi phương thức hỗ trợ cho Pair.Sort() ủy quyền xác định thứ tự hai đối tượng xem đối tượng đến trước: Student public static comparison WhichStudentComesFirst(Object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return ( String.Compare( s1.name, s2.name) c2.weight ? theSecondComesFirst : theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu giữ trọng lượng private int weight; } Cũng tương tự lớp Student lớp Cat phủ phương thức ToString() thực thi phương thức tĩnh với cú pháp tương ứng với phương thức ủy quyền Và lưu ý phương thức ủy quyền Student Cat không tên với Chúng ta không cần thiết phải làm tên gán đến phương thức ủy quyền lúc thực thi Ví dụ minh họa 11.1 sau trình bày cách phương thức ủy quyền gọi  Ví dụ 11.1: Làm việc với ủy quyền namespace Programming_CSharp { using System; // khai báo kiểu liệt kê public enum comparison { theFirstComesFirst =1, 310 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# theSecondComesFirst = } // lớp Pair đơn giản lưu giữ đối tượng public class Pair { // khai báo ủy quyền public delegate comparison WhichIsFirst( object obj1, object obj2); // truyền hai đối tượng vào khởi dựng public Pair( object firstObject, object secondObject) { thePair[0] = firstObject; thePair[1] = secondObject; } // phương thức xếp thứ tự hai đối tượng // theo tiêu chuẩn đối tượng public void Sort( WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theSecondComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // phương thức xếp hai đối tượng theo // thứ tự nghịch đảo lại tiêu chuẩn xếp public void ReverseSort( WhichIsFirst theDelegateFunc) { if (theDelegateFunc( thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // yêu cầu hai đối tượng đưa giá trị 311 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# public override string ToString() { return thePair[0].ToString() + “, ”+ thePair[1].ToString(); } // mảng lưu đối tượng private object[] thePair = new object[2]; } //lớp đối tượng Cat public class Cat { public Cat(int weight) { this.weight = weight; } // theo thứ tự trọng lượng public static comparison WhichCatComesFirst(Object o1, Object o2) { Cat c1 = (Cat) o1; Cat c2 = (Cat) o2; return c1.weight > c2.weight ? comparison.theSecondComesFirst : comparison.theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu trọng lượng private int weight; } // khai báo lớp Student public class Student { public Student( string name) { this.name = name; } // theo thứ tự chữ 312 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# public static comparison WhichStudentComesFirst( Object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return (String.Compare( s1.name, s2.name) =0) { throw new Exception(“Too many members in array”); } arrayOfEffects[numEffectsRegistered ++] = theEffect; } Ngồi cịn cần phương thức thật gọi ủy quyền này: public void ProcessImage() { for (int i = 0; i < numEffectsRegistered; i++) { arrayOfEffects[i](); } } Cuối cùng, khai báo ủy quyền tĩnh, để client gọi, chặn chúng lại để xử lý phương thức: public DoEffect BlurEffect = new DoEffect(Blur); public DoEffect SharpenEffect = new DoEffect(Sharpen); 318 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# public DoEffect FilterEffect = new DoEffect(Filter); public DoEffect RotateEffect = new DoEffect(Rotate); Việc chọn thao tác diễn trình tương tác thành phần giao diện người sử dụng Trong ví dụ mô cách chọn hiệu ứng, thêm chúng vào mảng, ProcessImage  Ví dụ minh họa 11.2: Sử dụng mảng ủy quyền namespace Programming_CSharp { using System; // khai báo lớp ảnh public class Image { public Image() { Console.WriteLine(“An image created”); } } // lớp xử lý ảnh public class ImageProcessor { // khai báo ủy quyền public delegate void DoEffect(); // tạo ủy quyền tĩnh public DoEffect BlurEffect = new DoEffect(Blur); public DoEffect SharpenEffect = new DoEffect(Sharpen); public DoEffect FilterEffect = new DoEffect(Filter); public DoEffect RotateEffect = new DoEffect(Rotate); // khởi dựng khởi tạo ảnh mảng public ImageProcessor(Image image) { this.image = image; arrayOfEffects = new DoEffect[10]; } // thêm hiệu ứng vào mảng public void AddToEffects( DoEffect theEffect) { if (numEffectsRegistered >=0) 319 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# { throw new Exception(“Too many members in array”); } arrayOfEffects[numEffectsRegistered ++] = theEffect; } // phương thức xử lý ảnh public static void Blur() { 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”); } // gọi ủy quyền để thực hiệu ứng public void ProcessImage() { for (int i = 0; i < numEffectsRegistered; i++) { arrayOfEffects[i](); } } // biến thành viên private DoEffect[] arrayOfEffects; private Image image; private int numEffectsRegistered = 0; } // lớp Test để kiểm chứng chương trình public class Test { 320 Cơ Chế Ủy Quyền - Sự Kiện ... System.StringBuilder Ý nghĩa Truy cập hay gán số ký tự mà StringBuilder nắm giữ Chỉ mục Thiết lập hay truy cập chiều dài chuỗi Truy cập dung lượng lớn StringBuilder Nối kiểu đối tượng vào cuối StringBuilder... hình lập trình giao diện người dùng đồ họa (GUI: Graphical User Interface) đòi hỏi cách tiếp cận khác, biết lập trình điều khiển kiện (event-driven programming) Chương trình đại đưa giao diện tương... phương thức trả chuỗi chèn vào chuỗi gán lại vào chuỗi S8: string s8 = s3.Insert( 18, “nhan luc ”); Console.WriteLine(“ S8 : {0}\n”, s8); Kết đưa là: S8 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho

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

Từ khóa liên quan

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

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

Tài liệu liên quan