Tài liệu C# và Các Lớp Đối Tượng part 2 pptx

11 453 0
Tài liệu C# và Các Lớp Đối Tượng part 2 pptx

Đ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

Xử lý chuỗi Qua chương 2, ta xem xét chuỗi thấy từ khoá String C# thực tham khảo lớp sở system.String System.string lớp linh hoạt mạnh , lớp có liên quan đến chuỗi NET phần ta xem lại đặc tính System.String, sau sử dụng chuỗi để ứng dụng môt số lớp NET - cụ thể lớp System.Text namespace System.Text.RegularExpressions • • • Xây dựng chuỗi - ta hay lặp lại việc thay đổi chuỗi , ví dụ để định độ dài cho chuỗi trước trình bày truyền đến vài phương thức phần mềm,lớp chuỗi khơng đủ khả để làm.trong tình này, lớp khác , System.Text.StringBuilder thích hợp hơn, thiết kế để làm tình Các biểu thức định dạng - ta xem xét kĩ biểu thức định dạng sử dụng Console.Writeline() biểu thức định dạng sử dụng vài interface IFormatProvider IFormattable,bằng việc sử dụng interface lớp riêng , ta định nghĩa chuỗi định dạng riêng để console.Writeline() lớp quen thuộc trình bày giá trị lớp ta theo cách mà ta định Biểu thức quy ( regular expressions )- NET đưa số lớp phức tạp mà đưọc dùng ta cần xác định trích chuỗi thoả mãn điều kiện phức tạp từ chuỗi dài.ví dụ cần tìm tất lần xuất kí tự hay tập kí tự lặp lại.hoặc cần tìm tất từ bắt đầu với 's' chứa kí tự 'n'.mặc dù ta viết phương thức để làm điều việc dùng lớp chuỗi ,nhựng cồng kềnh thay vào , ta dùng vài lớp System.Text.RegularExpressions mà đưọc thiết kế để thực thi quy trình System.String Trước kiểm tra lớp chuỗi khác, ta xem lại nhanh phương thức lớp chuỗi System.String lớp thiết kế để lưu trữ chuỗi, bao gồm số lớn thao tác chuỗi.khơng mà cịn tầm quan trọng kiểu liệu , C# có từ khố riêng cho kết hợp với cú pháp để tạo nên cách dễ dàng thao tác chuỗi Ta nối chuỗi : string message1 = "Hello"; message1 += ", There"; string message2 = message1 + "!"; Trích phần chuỗi dùng mục : char char4 = message[4]; // trả 'a' lưu ý kí tự bắt đầu tính từ mục phương thức khác ( sơ lược) : Phương thức Compare Mục đích so sánh nội dung chuỗi giống compare không kể đến ngôn ngữ địa văn hoá (as CompareOrdinal compare but doesn't take culture into account) Format IndexOf IndexOfAny LastIndexOf LastIndexOfAny PadLeft PadRigth Replace Split Substring ToLower ToUpper Trim định dạng chuỗi chứa giá trị khác định cách giá trị nên định dạng vị trí xuất chuỗi kí tự chuỗi vị trí xuất tập kí tự chuỗi giống indexof , tìm lần xuất cuối giống indexofAny , tìm lần xuất cuối canh phải chuỗi điền chuỗi cách thêm kí tự định lặp lại vào đầu chuỗi canh trái chuỗi điền chuỗi cách thêm kí tự định lặp lại vào cuối chuỗi thay kí tự hay chuỗi chuỗi với kí tự chuỗi khác chia chuỗi thành mảng chuỗi ,ngắt xuất kí tự trả chuỗi bắt đầu vị trí định chuỗi chuyển chuỗi thành chữ thuờng chuyển chuỗi thành chữ in bỏ khoảng trắng đầu cuối chuỗi Xây dựng chuỗi Chuỗi lớp mạnh với nhiều phương thức hữu ích , nhiên chuỗi gặp khó khăn việc lặp lại thay đổi đến chuỗi ban đầu.nó thực kiểu liệu không biến đổi, nghĩa lần ta khởi động đối tượng chuỗi, đối tượng chuỗi khơng thay đổi.những phương thức tốn tử mà cập nhật nội dung chuỗi thực tạo chuỗi , chép chuỗi cũ vào cần thiết ví dụ : string greetingText = "Hello from all the guys at Wrox Press "; greetingText += "We hope you enjoy this book as much as we enjoyed writing it."; Đầu tiên lớp system.String tạo khởi tạo giá trị "Hello from all the people at Wrox Press "chú ý khoảng trắng sau sau dấu chấm điều xảy ,thời gian chạy NET định vị đủ nhớ chuỗi để chứa đoạn kí tự này( 39 kí tự ).và tạo biến greetingText để chuyển đến thể chuỗi Ở dòng , ta thêm kí tự vào ta tạo chuỗi với kích thước đủ để lưu trữ hai đoạn ( 103 kí tự ).đoạn gốc "Hello from all the people at Wrox Press ", chép vào chuỗi với đoạn thêm "We hope you enjoy this book as much as we enjoyed writing it " sau địa biến greetingText cập nhật, biến trỏ đến đối tượng chuỗi mới.chuỗi cũ khơng cịn tham chiếu - khơng có biến truy vào nó- thu gom rác gỡ bỏ Giả sử ta muốn mã hố chuỗi cách thay đổi kí tự với kí tự ASCII điều trả vế chuỗi : "Ifmmp gspn bmm uif hvst bu Xspy Qsftt Xf ep ipqf zpv fokpz uijt cppl bt nvdi bt xf fokpzfe xsjujoh ju." có nhiều cách làm điều cách đơn giản dùng phương thức String.replace() mà thay chuỗi chuỗi khác, dùng Replace() ta viết đoạn mã mã hoá sau : string greetingText = "Hello from all the guys at Wrox Press "; greetingText += "We hope you enjoy this book as much as we enjoyed writing it."; for(int i = (int)'z'; i>=(int)'a' ; i ) { char old = (char)i; char new = (char)(i+1); greetingText = greetingText.Replace(old, new); } for(int i = (int)'Z'; i>=(int)'A' ; i ) { char old = (char)i; char new = (char)(i+1); greetingText = greetingText.Replace(old, new); } Console.WriteLine("Encoded:\n" + greetingText); Vậy cần vùng nhớ làm điều này? Replace() làm việc theo cách thơng minh, để mở rộng khơng tạo chuỗi trừ thực phải thay đổi chuỗi cũ.chuỗi gốc có 23 kí tự chữ thường khác kí tự in khác nhau,Replace() định vị chuỗi tổng cộng 26 lần,mỗi chuỗi lưu trữ 103 kí tự.nghĩa kết quy trình mã hố đối tượng chuỗi có khả lưu trữ kết hợp tổng cộng 2678 kí tự nằm heap để thu dọn.Rõ ràng ta sử dụng chuỗi để làm điều này, ứng dụng ta chạy không tốt Để giải Microsoft cung cấp lớp System.Text.StringBuilder lớp System.Text.StringBuilder khơng mạnh lớp chuỗi tính theo thuật ngữ số phương thức có tiến trình mà ta làm Stringbuilder giới hạn thành thay mở rộng bỏ đoạn từ chuỗi nhiên làm việc theo cách hiệu nơi ta xây dựng chuỗi , đủ vùng nhớ định vị để giữ chuỗi,Stringbuidler định vị vùng nhớ nhiều cần.ta định vùng nhớ định vị , khơng , số mặc định thuộc vào kích cỡ chuỗi mà StringBuilder khởi động có thuộc tính chính: Length - độ dài chuỗi thực chứa Capacity - độ d chuỗi mà định đủ vùng nhớ để lưu trữ Bất kì cập nhật đến chuỗi làm khối vùng nhớ này,như viết thêm chuỗi thay kí tự riêng chuỗi tốt.Việc gỡ bỏ chèn chuỗi khơng tốt, phần theo sau chuỗi phải bị di chuyển.chỉ ta thực thi vài thao tác mà tăng dung lượng chuỗi tạo vùng nhớ cần định vị toàn chuỗi chứa di chuyển.vào lúc viết ,Microsoft không cho biết làm cách để dung lượng thêm thêm vào, từ kinh nghiệm cho thấy StringBuilder xuất với dung lượng gấp đôi nó thăm dị thấy dung lương bị vượt q khơng có giá trị dung lương thiết đặt rõ ràng Ví dụ , ta sử dụng đối tượng StringBuilder để tạo chuỗi chào đón gốc, ta viết : StringBuilder greetingBuilder = new StringBuilder("Hello from all the guys at Wrox Press ", 150); greetingBuilder.Append("We hope you enjoy this book as much as we enjoyed writing it"); Trong mã ta thiết lập dung lương khởi tạo 150 cho StringBuilder ln ý tưởng hay để thiết lập dung lượng mà bao phủ độ dài lớn chuỗi , để bảo đảm String builder không cần tái định vị dung lượng lớn ta thiết lập số int cho dung lượng, ta cố định vị vượt tỷ ký tự hệ thống cảnh báo mã thực thi , ta tạo đối tượng StringBuilder khởi tạo sau: Khi gọi phương thức append() ,đoạn cịn lại đuợc đặt khoảng trống, khơng cần định vị thêm vùng nhớ.tuy nhiên khả thực StringBuilder thấy rõ lặp lại việc thay đoạn ví dụ, ta cố mã hố đoạn văn theo cách ,ta mã hố tồn mà khơng cần định vị thêm vùng nhớ : StringBuilder greetingBuilder = new StringBuilder("Hello from all the guys at Wrox Press ", 150); greetingBuilder.Append("We hope you enjoy this book as much as we enjoyed writing it"); for(int i = (int)'z'; i>=(int)'a' ; i ) { char old = (char)i; char new = (char)(i+1); greetingBuilder = greetingBuilder.Replace(old, new); } for(int i = (int)'Z'; i>=(int)'A' ; i ) { char old = (char)i; char new = (char)(i+1); greetingBuilder = greetingBuilder.Replace(old, new); } Console.WriteLine("Encoded:\n" + greetingBuilder.ToString()); Đoạn mã dùng phương thức StringBuilder.Replace() mà giống String.Replace() khơng có chép chuỗi lúc làm.tổng vùng nhớ định vị để giữ chuỗi đoạn mã 150 cho người xây dựng, vùng nhớ định suốt việc thao tác chuỗi thi hành bên trong câu lệnh cuối Console.Writeline() thông thường , ta sử dụng StringBuilder để thi hành thao tác chuỗi, String để lưu trữ trình bày kết cuối Các thành viên StringBuilder Chúng ta minh hoạ hàm dựng StringBuilder, mà lấy thông số khởi tạo chuỗi dung lượng.cũng có vài khác , số chúng, ta cung cấp chuỗi : StringBuilder sb = new StringBuilder("Hello"); cung cấp dung luợng , chuỗi trống: StringBuilder sb = new StringBuilder(20); Ngoại trừ thuộc tính ta cịn có thuộc tính đọc MaxCapacity định giới hạn mà thể StringBuilder cho phép mặc định , số int.MaxValue ( khoảng tỷ) // dung lượng khởi tạo 100 lớn 500 // StringBuilder khơng thể phát triển 500 kí tự // chúng tung biệt lệ ta cố làm điều StringBuilder sb = new StringBuilder("Hello", 100, 500); StringBuilder sb = new StringBuilder(100, 500); Ta thiết lập dung lượng đâu dung lượng thiêt lập nhỏ chuỗi hành lớn độ dài lớn biệt lệ tung StringBuilder sb = new StringBuilder("Hello"); sb.Capacity = 100; Phương thức StringBuilder bao gồm : Append() : thêm chuỗi vào chuỗi đương thời AppendFormat() :thêm chuỗi mà trình bày từ định định dạng Insert() :chèn chuỗi vào chuỗi đương thời Remove() :bỏ kí tự từ chuỗi đương thời Replace() :thay kí tự kí tự khác chuỗi chuỗi khác chuỗi đương thời ToString() :trả chuỗi đương thời ép thành đối tượng System.Object ( nạp chồn từ System.Object) Vào lúc viết , ép kiểu ( tường minh hay khơng tưịng minh) từ StringBuilder sang String ta muốn xuất nội dung StringBuilder String , cách để làm dùng phương thức Tostring() Định dạng Chuỗi Nếu ta muốn lớp mà ta viết thân thiện với người sử dụng , chúng cần để trình bày chuỗi theo cách mà người sử dụng muốn dùng.Thời gian chạy NET định nghĩa cách chuẩn để làm : dùng interface IFormatable.biểu diễn làm để thêm đặc tính quan trọng đến lớp ta cấu trúc chủ đề phần ta thường định định dạng biến trình bày gọi Console.Writeline ta lấy phương thức làm ví dụ, hầu hết điều ta học ứng dụng tình mà ta muốn định dạng chuỗi Ví dụ: double d = 13.45; int i = 45; Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); Chuỗi định dạng tự bao gồm hầu hết văn trình bày,nhưng đâu có biến định dạng , mục danh sách thơng số dấu ngoặc.có thể thơng tin khác bên dấu ngoặc việc định dạng mục : số kí tự giữ trình bày mục xuất hiện, thơng tin có dấu phảy đứng trước.một số âm định mục đưọc canh trái,trong số dương định mục canh phải mục giữ nhiều kí tự u cầu, xuất đầy đủ Một định định dạng xuất hiện.điều đặt trước dấu hai chấm định cách ta muốn mục định dạng ví dụ ta muốn định dạng số kiểu tiền tệ trình bày theo ký hiệu khoa học ? Đặc tả C D E F G N P X Áp dụng đến numeric types Ý nghĩa locale-specific monetary value integer types only general integer numeric types scientific notation numeric types fixed point decimal numeric types general number numeric types usual locale specific format for numbers numeric types Percentage notation integer types only hexadecimal format Ví dụ $4834.50 (USA)£4834.50 (UK) 4834 4.834E+003 4384.50 4384.5 4,384.50 (UK/USA)4 384,50 (continental Europe) 432,000.00% 1120 (NB If you want to display 0x1120, you'd need to write out the 0x separately) Làm chuỗi định dạng Xem ví dụ sau: Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); Thực vậy, Console.Writeline() việc kiểm sốt tồn tập thông số cách chuyển đến phương thức static, String.Format()- phương thức gọi ta muốn định dạng giá trị chuỗi theo mục đích khác , trình bày textbox.Để làm rõ mã nguồn thực thực thi phương thức ,ta xem xét việc thi hành phương thức oveload với thông số phương thức Writeline() sau : : // giống thực thi Console.Writeline() public void WriteLine(string format, object arg0, object arg1) { Console.WriteLine(string.Format(format, arg0, arg1)); } Overload thông số phương thức này, đơn giản viết nội dung chuỗi trình bày,khơng làm định dạng String.format() cần xây dựng chuỗi cuối cách thay phần đặc tả định dạng việc trình bày chuỗi thích hợp đối tượng tương ứng.tuy nhiên biết , xác tình ta cần thể Stringbuilder thể string ví dụ ta xét , thể StringBuilder tạo khởi tạo với phần đầu chuỗi " The double is" phương thức StringBuilder.AppendFormat() gọi, truyền phần đặc tả định dạng dầu tiên , {0,10:E} ,và đối tượng kết hợp kiểu double thêm vào chuỗi xây dựng, quy trình tiếp tục với việc gọi nhiều lần StringBuilder.Append() StringBuilder.AppendFormat() toàn chuỗi định dạng xong Bởi StringBuilder.AppendFormat() cần minh họa cách định dạng thực đối tượng điều thăm dò đối tượng để xem liệu có thực thi interface IFormatable ( namespace System ) hay chưa.ta thử ép kiểu đối tượng thành interface xem coi ép kiểu khơng kiểm tra thất bại , AppendFormat() đơn giản gọi phương thức tostring() đối tượng,( phương thức tất đối tượng thừa kế từ System.Object nạp chồng) IFormattable định nghĩa giống phương thức, mà goị ToString().tuy nhiên phương thức lấy thông số, đối lập với phiên System.Object , mà không lấy thơng số định nghĩa cho IFormattable: interface IFormattable { string ToString(string format, IFormatProvider formatProvider); } Thông số mà hàm overload Tostring() lấy chuỗi mà đặc tả định dạng yêu cầu.nói cách khác định phần chuỗi xuất { } so với chuỗi gốc truyền đến Console.WriteLine() hay String.Format() ví dụ : Console.WriteLine("The double is {0,10:E} and the int contains {1}", d, i); Khi tính thơng số , {0,10:E}, hàm gọi biến double , d, thông số đưọc truyền đến E StringBuilder.AppendFormat() truyền đoạn văn xuất sau dấu hai chấm phần đặc tả định dạng từ chuỗi gốc Ta không quan tâm thông số thứ Tostring().nó tham chiếu đến đối tượng mà thực thi interface IFormatProvider.Interface gửi thông tin mà Tostring() cần định dạng đối tưọng Quay trở lại ví dụ trên, mục ta muốn định dạng double với phần đặc tả định dạng E.như đề cập , phương thức StringBuilder.AppendFormat() thiết lập double thi hành IFormattable, gọi hàm overload Tostring() thơng số,truyền vào chuỗi E cho thông số null cho thơng số thứ hai.bây tuỳ thuộc vào thi hành phương thức mà trả chuỗi trình bày kiểu double theo định dạng Nếu cần StringBuilder.AppendFormat() lựa chọn điền vào chuỗi trả với khoảng trắng, để đủ 10 kí tự phần đặc tả định dạng chuỗi trường hợp Đối tượng định dạng kiểu int, mà khơng u cầu định dạng cụ thể.vì StringBuilder.AppendFormat() truyền vào tham chiếu null cho định dạng chuỗi này.Tồn quy trình tóm tắt sau: Ví dụ FormattableVector Trong ví dụ phần đặc tả định dạng mà ta hổ trợ : · N - phiên dịch yêu cầu cung cấp số biết Norm Vector.là tổng bình phương thành phần ln trình bày dấu || , ví dụ || 34.5 || · VE- phiên dịch yêu cầu trình bày thành phần đặc tả định dạng.như đặc tả E số double định (2.3E+01, 4.5E+02, 1.0E+00) · IJK - phiên dịch yêu cầu trình bày vector dạng 23i + 450i + 1k việc trình bày mặc định có dạng Vector( 23,450,1.0) Để cho đơn giản ta khơng thi hành tuỳ chọn để trình bày Vector theo kết hợp IJK định dạng khoa học.tuy nhiên ta kiểm tra đặc tả theo cách không phân biệt chữ hoa chữ thường , phép ijk thay IJK lưu ý hoàn toàn tuỳ thuộc vào chuỗi ta sử dụng để định đặc tả định dạng Đầu tiên ta khai báo Vector thi hành IFormatable: struct Vector : IFormattable { public double x, y, z; thêm vào phương thức overload tostring() thơng số : public string ToString(string format, IFormatProvider formatProvider) { if (format == null) return ToString(); string formatUpper = format.ToUpper(); switch (formatUpper) { case "N": return "|| " + Norm().ToString() + " ||"; case "VE": return String.Format("( {0:E}, {1:E}, {2:E} )", x, y, z); case "IJK": StringBuilder sb = new StringBuilder(x.ToString(), 30); sb.Append(" i + "); sb.Append(y.ToString()); sb.Append(" j + "); sb.Append(z.ToString()); sb.Append(" k"); return sb.ToString(); default: return ToString(); } } Đó tất ta phải làm lưu ý cần kiểm tra định dạng null trước gọi phương thức nào.trong ví dụ phần đặc tả VE , ta cần thành phần đưọc định dạng theo cú pháp khoa học,vì ta dùng String.Format()để làm.tất trường x,y,z double.Trong trường hợp định dạng IJK, có vài chuỗi thêm vào chuỗi , ta dùng đối tượng StringBuilder để làm để hoàn chỉnh ta xây dựng lại phương thức overload Tostring() không thông số mà ta phát triển chương : public override string ToString() { return "( " + x + " , " + y + " , " + z + " )"; } cuối ta thêm vào phương thức Norm() mà tính bình phương ( Norm) Vector : public double Norm() { return x*x + y*y + z*z; } Bây ta thử đoạn mã theo vài cách : static void Main() { Vector v1 = new Vector(1,32,5); Vector v2 = new Vector(845.4, 54.3, -7.8); Console.WriteLine("\nIn IJK format,\nv1 is {0,30:IJK}\nv2 is {1,30:IJK}", v1, v2); Console.WriteLine("\nIn default format,\nv1 is {0,30}\nv2 is {1,30}", v1, v2); Console.WriteLine("\nIn VE format\nv1 is {0,30:VE}\nv2 is {1,30:VE}", v1, v2); Console.WriteLine("\nNorms are:\nv1 is {0,20:N}\nv2 is {1,20:N}", v1, v2); } Kết trả : FormattableVector In IJK format, v1 is i + 32 j + k v2 is 845.4 i + 54.3 j + -7.8 k In default format, v1 is ( , 32 , ) v2 is ( 845.4 , 54.3 , -7.8 ) In VE format v1 is ( 1.000000E+000, 3.200000E+001, 5.000000E+000 ) v2 is ( 8.454000E+002, 5.430000E+001, -7.800000E+000 ) Norm : v1 is || 1050 || v2 is || 717710.49 || Code for Download: FormattableVector StringEncoder ... {0,30}\nv2 is {1,30}", v1, v2); Console.WriteLine("\nIn VE format\nv1 is {0,30:VE}\nv2 is {1,30:VE}", v1, v2); Console.WriteLine("\nNorms are:\nv1 is {0 ,20 :N}\nv2 is {1 ,20 :N}", v1, v2); } Kết trả : FormattableVector... is i + 32 j + k v2 is 845.4 i + 54.3 j + -7.8 k In default format, v1 is ( , 32 , ) v2 is ( 845.4 , 54.3 , -7.8 ) In VE format v1 is ( 1.000000E+000, 3 .20 0000E+001, 5.000000E+000 ) v2 is ( 8.454000E+0 02, ... Vector(1, 32, 5); Vector v2 = new Vector(845.4, 54.3, -7.8); Console.WriteLine("\nIn IJK format,\nv1 is {0,30:IJK}\nv2 is {1,30:IJK}", v1, v2); Console.WriteLine("\nIn default format,\nv1 is {0,30}\nv2

Ngày đăng: 26/01/2014, 14: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