Tải bản đầy đủ (.pdf) (11 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (190.73 KB, 11 trang )


Xử lý chuỗi
Qua chương 2, ta đã xem xét về chuỗi và thấy rằng từ khoá String trong C# thực sự tham
khảo lớp cơ sở system.String. System.string là lớp rất linh hoạt và mạnh , không phải chỉ
là lớp có liên quan đến chuỗi trong .NET. trong phần này ta sẽ xem lại những đặc tính
của System.String, sau đó sử dụng chuỗi để ứng dụng trong môt số lớp .NET - cụ thể là
lớp System.Text và namespace System.Text.RegularExpressions .
• Xây dựng chuỗi - nếu ta hay lặp lại việc thay đổi trên 1 chuỗi , ví dụ để định 1 độ
dài cho chuỗi trước khi trình bày nó hoặc truyền nó đến vài phương thức hoặc
phần mềm,lớp chuỗi có thể không đủ khả năng để làm.trong tình huống này, 1 lớp
khác , System.Text.StringBuilder thích hợp hơn, bởi vì nó được thiết kế để làm
trong các tình huống này.
• Các biểu thức định dạng - ta sẽ xem xét kĩ hơn những biểu thức định dạng sử
dụng Console.Writeline(). những biểu thức định dạng này sử dụng vài interface.
IFormatProvider và IFormattable,bằng việc sử dụng các interface này trong lớp
riêng , ta có thể định nghĩa những chuỗi định dạng riêng để console.Writeline() và
những lớp quen thuộc sẽ trình bày giá trị trong lớp của ta theo bất cứ cách nào mà
ta chỉ định.
• Biểu thức chính quy ( regular expressions )- .NET cũng đưa ra một số lớp phức
tạp mà đưọc dùng khi ta cần xác định hoặc trích ra chuỗi con thoả mãn 1 điều kiện
phức tạp từ 1 chuỗi dài.ví dụ như cần tìm tất cả các lần xuất hiện của 1 kí tự hay 1
tập kí tự được lặp lại.hoặc cần tìm tất cả các từ bắt đầu với 's' và chứa ít nhất 1 kí
tự
'n'.mặc dù ta có thể viết phương thức để làm điều này chỉ bằng việc dùng lớp
chuỗi ,nhựng nó rất cồng kềnh. thay vào đó , ta có thể dùng 1 vài lớp trong
System.Text.RegularExpressions mà đưọc thiết kế để thực thi các quy trình này.
System.String
Trước khi kiểm tra các lớp chuỗi khác, ta sẽ xem lại nhanh những phương thức trong lớp
chuỗi.
System.String là lớp được thiết kế để lưu trữ chuỗi, bao gồm 1 số lớ
n các thao tác trên


chuỗi.không chỉ thế mà còn bởi vì tầm quan trọng của kiểu dữ liệu này , C# có từ khoá
riêng cho nó và kết hợp với cú pháp để tạo nên cách dễ dàng trong thao tác chuỗi.
Ta có thể nối chuỗi :
string message1 = "Hello";
message1 += ", There";
string message2 = message1 + "!";
Trích 1 phần chuỗi dùng chỉ mục :
char char4 = message[4]; // trả về 'a'. lưu ý rằng kí tự bắt đầu tính từ chỉ mục 0
các phương thức khác ( sơ lược) :

Phương thức Mục đích
Compare so sánh nội dung của 2 chuỗi
CompareOrdinal
giống compare nhưng không kể đến ngôn ngữ bản địa hoặc văn hoá (as
compare but doesn't take culture into account)

Format
định dạng một chuỗi chứa 1 giá trị khác và chỉ định cách mỗi giá trị nên
được định dạng.

IndexOf vị trí xuất hiện đầu tiên của 1 chuỗi con hoặc kí tự trong chuỗi
IndexOfAny vị trí xuất hiện đầu tiên của bất kì 1 hoặc 1 tập kí tự trong chuỗi
LastIndexOf giống indexof , nhưng tìm lần xuất hiện cuối cùng
LastIndexOfAny giống indexofAny , nhưng tìm lần xuất hiện cuối cùng
PadLeft
canh phải chuỗi
điền chuỗi bằng cách thêm 1 kí tự được chỉ định lặp lại vào đầu chuỗi
PadRigth
canh trái chuỗi
điền chuỗi bằng cách thêm 1 kí tự được chỉ định lặp lại vào cuối chuỗi

Replace thay thế kí tự hay chuỗi con trong chuỗi với 1 kí tự hoặc chuỗi con khác
Split
chia chuỗi thành 2 mảng chuỗi con ,ngắt bởi sự xuất hiện của một kí tự
nào đó
Substring trả về chuỗi con bắt đầu ở một vị trí chỉ định trong chuỗi.
ToLower chuyển chuỗi thành chữ thuờng
ToUpper chuyển chuỗi thành chữ in
Trim bỏ khoảng trắng ở đầu và cuối chuỗi

Xây dựng chuỗi
Chuỗi là 1 lớp mạnh với nhiều phương thức hữu ích , tuy nhiên chuỗi gặp khó khăn trong
việc lặp lại sự thay đổi đến chuỗi ban đầu.nó thực sự là kiểu dữ liệu không biến đổi,
nghĩa là mỗi lần ta khởi động 1 đối tượng chuỗi, thì đối tượng chuỗi đó không bao giờ
được thay đổi.những phương thức hoặc toán tử
mà cập nhật nội dung của chuỗi thực sự là
tạo ra một chuỗi mới , sao chép chuỗi cũ vào nếu cần thiết. ví dụ
:
string greetingText = "Hello from all the guys at Wrox Press. ";
greetingText += "We do hope you enjoy this book as much as we enjoyed
writing it.";

Đầu tiên lớp system.String được tạo và 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. khi điều này xảy ra ,thời gian chạy .NET sẽ
định vị đủ bộ nhớ trong chuỗi để chứa đoạn kí tự này( 39 kí tự ).và tạo ra 1 biến
greetingText để chuyển đến 1 thể hiện chuỗi.
Ở dòng tiếp theo , khi ta thêm kí tự vào .ta sẽ tạo ra một chuỗi mới với kích thước đủ để
lưu trữ cả hai đoạn ( 103 kí tự ).đoạn gốc "Hello from all the people at Wrox Press. ", sẽ
được sao chép vào chuỗi mới với đoạn thêm "We do hope you enjoy this book as much
as we enjoyed writing it. " sau đó địa chỉ trong biến greetingText được cập nhật, vì vậy
biến sẽ trỏ đúng đến đối t

ượng chuỗi mới.chuỗi cũ không còn được tham chiếu - không
có biến nào truy vào nó- và vì vậy nó sẽ được bộ thu gom rác gỡ bỏ.
Giả sử ta muốn mã hoá chuỗi bằng cách thay đổi từng kí tự với 1 kí tự ASCII. điều này sẽ
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 này nhưng cách đơn giản nhất là
dùng phương thức String.replace() mà thay thế chuỗi con này bằng chuỗi con khác, dùng
Replace() ta viết đoạn mã mã hoá như
sau :
string greetingText = "Hello from all the guys at Wrox Press. ";
greetingText += "We do 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 bao nhiêu vùng nhớ làm điều này? Replace() làm việc theo cách thông minh, để
mở rộng nó sẽ không tạo ra một chuỗi mới trừ khi nó thực sự phải thay đổi chuỗi
cũ.chuỗi gốc có 23 kí tự chữ thường khác nhau và 3 kí tự in khác nhau,Replace() sẽ định
vị 1 chuỗi mới tổng cộng 26 lần,mỗi chuỗi mới lưu trữ 103 kí tự.nghĩa là kết quả quy
trình mã hoá sẽ là đối tượ

ng chuỗi có khả năng lưu trữ kết hợp tổng cộng 2678 kí tự bây
giờ đang nằm trong heap để được thu dọn.Rõ ràng nếu ta sử dụng chuỗi để làm điều này,
ứng dụng của ta sẽ chạy không tốt.
Để giải quyết Microsoft cung cấp lớp System.Text.StringBuilder . lớp
System.Text.StringBuilder không mạnh như lớp chuỗi tính theo thuật ngữ là số phương
thức nó có .tiến trình mà ta có thể làm trên Stringbuilder được giới hạ
n thành thay thế
hoặc mở rộng hoặc bỏ đoạn từ chuỗi .tuy nhiên nó làm việc theo cách hiệu quả hơn.
bất cứ nơi nào ta xây dựng chuỗi , chỉ đủ vùng nhớ được định vị để giữ
chuỗi,Stringbuidler sẽ định vị vùng nhớ nhiều hơn cần.ta có thể chỉ định vùng nhớ được
định vị , nếu không , thì số mặc định tuy thuộc vào kích cỡ của chuỗi mà StringBuilder
được khởi động cùng .nó có 2 thuộc tính chính:
Length - độ dài của chuỗi thực sự chứa
Capacity - độ daì chuỗi mà nó chỉ định đủ vùng nhớ để lưu trữ.
Bất kì cập nhật nào đến chuỗi sẽ được làm trong khối vùng nhớ này,như là viết thêm
chuỗi con hoặc thay thế các kí tự riêng trong chuỗi rất tốt.Việ
c gỡ bỏ hoặc chèn chuỗi
con vẫn không tốt, bởi vì những phần theo sau chuỗi phải bị di chuyển.chỉ nếu ta thực thi
vài thao tác mà tăng dung lượng chuỗi sẽ tạo ra vùng nhớ mới cần được định vị và toàn
bộ chuỗi được chứa có thể được di chuyển.vào lúc viết ,Microsoft không cho biết làm
cách nào để dung lượng thêm được thêm vào, nhưng từ kinh nghiệm cho thấy
StringBuilder xuất hiện với dung lượng gấ
p đôi của nó nếu nó thăm dò thấy dung lương
bị vượt quá và không có giá trị mới của dung lương được thiết đặt rõ ràng.
Ví dụ , nếu ta sử dụng đối tượng StringBuilder để tạo ra 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 do hope you enjoy this book as much as we enjoyed
writing it");


Trong mã này . ta thiết lập dung lương khởi tạo là 150 cho StringBuilder. nó luôn là ý
tưởng hay để thiết lập dung lượng mà bao phủ độ dài lớn nhất của chuỗi , để bảo đảm
String builder không cần tái định vị bởi vì dung lượng của nó lớn .vì vậy ta có thể thiết
lập 1 số int cho dung lượng, mặc dù nếu ta cố định vị vượt quá 2 tỷ ký tự hệ thống sẽ
cảnh báo.
khi mã trên thực thi , đầu tiên ta tạ
o ra 1 đối tượng StringBuilder khởi tạo như sau:

Khi gọi phương thức append() ,đoạn còn lại đuợc đặt trong khoảng trống, không cần định
vị thêm vùng nhớ.tuy nhiên khả năng thực sự của StringBuilder chỉ thấy rõ khi lặp lại
việc thay thế đoạn. ví dụ, nếu ta cố mã hoá đoạn văn bản theo cách trên ,ta có thể mã hoá
toàn bộ mà không cần định vị thêm bất kì vùng nhớ nào nữ
a :
StringBuilder greetingBuilder =
new StringBuilder("Hello from all the guys at Wrox Press. ", 150);
greetingBuilder.Append("We do 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ã này dùng phương thức StringBuilder.Replace() mà giống như String.Replace()
nhưng không có sao chép chuỗi trong lúc làm.tổng vùng nhớ được định vị để giữ chuỗi
trong đoạn mã trên là 150 cho người xây dựng, cũng như vùng nhớ chỉ định trong suốt
việc thao tác chuỗi thi hành bên trong trong câu lệnh cuối Console.Writeline()
thông thường , ta sử dụng StringBuilder để thi hành bất kì thao tác của chuỗi, và String để
lưu trữ hoặc trình bày kết quả cuối cùng.
Các thành viên của StringBuilder
Chúng ta đ
ã minh hoạ 1 hàm dựng của StringBuilder, mà lấy thông số khởi tạo là chuỗi
và dung lượng.cũng có một vài cái khác , trong số chúng, ta có thể cung cấp chỉ 1 chuỗi :
StringBuilder sb = new StringBuilder("Hello");
hoặc chỉ cung cấp dung luợng , chuỗi trống:
StringBuilder sb = new StringBuilder(20);

Ngoại trừ 2 thuộc tính trên ta còn có thuộc tính chỉ đọc MaxCapacity chỉ định giới hạn
mà 1 thể hiện của StringBuilder cho phép .mặc định , số này là int.MaxValue ( khoảng 2
tỷ).
// dung lượng khởi tạo là 100 nhưng lớn nhất là 500
// do đó StringBuilder không thể phát triển hơn 500 kí tự được.
// chúng sẽ tung biệt lệ nếu ta cố làm điều đó.

StringBuilder sb = new StringBuilder("Hello", 100, 500);
StringBuilder sb = new StringBuilder(100, 500);
Ta có thể thiết lập dung lượng ở bất cứ đâu .nếu dung lượng thiêt lập nhỏ hơn chuỗi hiện
hành hoặc lớn hơn độ dài lớn nhất thì biệt lệ sẽ được tung ra.
StringBuilder sb = new StringBuilder("Hello");
sb.Capacity = 100;


Phương thức chính StringBuilder bao gồm :
Append() : thêm 1 chuỗi vào chuỗi đương thời
AppendFormat() :thêm 1 chuỗi mà được trình bày từ các chỉ định định dạng
Insert() :chèn 1 chuỗi con vào chuỗi đương thời
Remove() :bỏ các kí tự từ chuỗi đương thời
Replace() :thay thế kí tự này bằng kí tự khác hoặc chuỗi con này bằng chuỗi con khác
trong chuỗi đương thời
ToString() :trả về chuỗi đương thời ép thành 1 đối tượng System.Object ( nạp chồn từ
System.Object)
Vào lúc viết , không thể ép kiểu ( tường minh hay không tưòng minh) từ StringBuilder
sang String. nếu ta muốn xuất nội dung của StringBuilder như là 1 String , cách duy nhất
để làm là dùng phương thức Tostring()
Định dạng Chuỗi
Nếu ta muốn những lớp mà ta viết thân thiện với người sử dụng , thì chúng cần để trình
bày chuỗi theo bất cứ cách nào mà người sử dụng muốn dùng.Thời gian chạy .NET định
nghĩa 1 cách chuẩn để làm : dùng 1 interface hoặc IFormatable.biểu diễn làm thế
nào để
thêm những đặc tính quan trọng đến lớp của ta và những cấu trúc là chủ đề của phần này.
ta thường chỉ định định dạng của biến được trình bày khi gọi Console.Writeline. do đó ta
sẽ lấy phương thức này làm ví dụ, mặc dù hầu hết những điều ta sắp học có thể ứng dụng
trong bất cứ tình huống nào 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ự nó bao gồm hầu hết văn bản được trình bày,nhưng bất cứ ở đâu có
biến được định dạng , chỉ mục của nó trong danh sách thông số trong dấu ngoặc.có thể là
thông tin khác bên trong dấu ngoặc về việc định dạng của mục đó :
số kí tự được giữ bởi sự trình bày của mục có thể xuất hiện, thông tin này sẽ có dấ
u phảy

đứng trước.một số âm chỉ định rằng mục đó đưọc canh trái,trong khi 1 số dương chỉ định
mục đó được canh phải. nếu mục đó giữ nhiều kí tự hơn được yêu cầu, nó vẫn xuất hiện
đầy đủ.
Một chỉ định định dạng cũng có thể xuất hiện.điều này sẽ được đặt trước bởi d
ấu hai
chấm và chỉ định cách ta muốn mục được định dạng. ví dụ ta muốn định dạng số như
kiểu tiền tệ hoặc trình bày theo ký hiệu khoa học ?
Đặc tả Áp dụng đến Ý nghĩa Ví dụ
C numeric types locale-specific
monetary value
$4834.50 (USA)£4834.50 (UK)
D integer types only general integer 4834
E numeric types scientific notation 4.834E+003
F numeric types fixed point decimal 4384.50
G numeric types general number 4384.5
N numeric types usual locale specific
format for numbers
4,384.50 (UK/USA)4 384,50
(continental Europe)
P numeric types Percentage notation 432,000.00%
X integer types only hexadecimal format 1120 (NB. If you want to
display 0x1120, you'd need to
write out the 0x separately)

Làm thế nào chuỗi được đị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() chỉ việc kiểm soát toàn bộ tập thông số bằng cách chuyển
đến phương thức static, String.Format()- cũng phương thức này được gọi nếu ta muốn
định dạng các giá trị trong chuỗi theo các mục đích khác , như là trình bày trong

textbox.Để làm rõ những gì mã nguồn thực sự thực thi phương thức này là gì ,ta sẽ xem
xét việc thi hành phương thức oveload với 3 thông số của phương thức Writeline() như
sau :
:
// giống như thực thi Console.Writeline()

public void WriteLine(string format, object arg0, object arg1)
{
Console.WriteLine(string.Format(format, arg0, arg1));
}

Overload 1 thông số của phương thức này, đơn giản viết nội dung của chuỗi được trình
bày,không làm bất cứ định dạng gì trên nó.
String.format() cần xây dựng chuỗi cuối bằng cách thay thế mỗi phần đặc tả định dạng
bằng việc trình bày chuỗi thích hợp của đối tượng tương ứng.tuy nhiên như đã biết ,
chính xác trong tình huống này ta cần thể hiện Stringbuilder hơn là thể hiện string. trong
ví dụ
ta đang xét , 1 thể hiện StringBuilder sẽ được tạo ra và khởi tạo với phần đầu là
chuỗi " The double is" . phương thức StringBuilder.AppendFormat() sẽ được 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 này sẽ được
thêm vào chuỗi đang được xây dựng, quy trình này sẽ tiếp tục với việc gọi nhiều lần
StringBuilder.Append() và StringBuilder.AppendFormat() cho đến khi toàn bộ chuỗi
được đị
nh dạng đã xong.
Bởi vì StringBuilder.AppendFormat() sẽ cần minh họa cách định dạng thực sự đối tượng.
điều đầu tiên sẽ là thăm dò đối tượng để xem liệu nó có thực thi 1 interface IFormatable (
trong namespace System ) hay chưa.ta có thể thử ép kiểu 1 đối tượng thành 1 interface và
xem coi ép kiểu được không. nếu kiểm tra thất bại , thì AppendFormat() đơn giản gọi
phương thức tostring() của đối tượng,( do phương thức này được tất cả các đối t
ượng

cùng thừa kế từ System.Object hoặc do nạp chồng).
IFormattable định nghĩa giống như một phương thức, mà cũng được goị ToString().tuy
nhiên phương thức này lấy 2 thông số, đối lập với phiên bản System.Object , mà không
lấy bất kì thông số nào. đây là định nghĩa cho IFormattable:
interface IFormattable
{
string ToString(string format, IFormatProvider formatProvider);
}

Thông số đầu tiên mà hàm overload của Tostring() này lấy là chuỗi mà đặc tả định dạng
được yêu cầu.nói cách khác nó chỉ định phần chuỗi xuất hiện trong { } so với chuỗi gốc
đượ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ố đầu tiên , {0,10:E}, hàm sẽ gọi biến double , d, và thông số đầu tiên
đưọc truyền đến nó sẽ là E. những gì StringBuilder.AppendFormat() sẽ truyền ở đây là
bất cứ đoạn văn bản nào xuất hiện sau dấu hai chấm trong phần đặc tả định dạng từ chuỗi
gốc.
Ta không quan tâm về thông số thứ 2 của Tostring().nó là 1 tham chiếu đến đối tượng mà
thực thi interface IFormatProvider.Interface này gửi thông tin mà Tostring() có thể cần
khi đị
nh dạng đối tưọng.
Quay trở lại ví dụ trên, mục đầu tiên ta muốn định dạng là double với phần đặc tả định
dạng là E.như đã đề cập , phương thức StringBuilder.AppendFormat() sẽ thiết lập double
thi hành IFormattable, và do đó sẽ gọi hàm overload Tostring() 2 thông số,truyền vào nó
chuỗi E cho thông số đầu tiên và null cho thông số thứ hai.bây giờ nó tuỳ thuộc vào sự thi
hành của phương thức này mà sẽ trả về 1 chuỗi trình bày kiể
u double theo định dạng.
Nếu cần StringBuilder.AppendFormat() sẽ lựa chọn điền vào chuỗi trả về với khoảng
trắng, để đủ 10 kí tự trong phần đặc tả định dạng của chuỗi trong trường hợp này.
Đối tượng kế tiếp được định dạng là kiểu int, mà không yêu cầu định dạng cụ thể.vì vậy

StringBuilder.AppendFormat() sẽ truyền vào tham chiếu null cho định dạng chuỗi
này.Toàn bộ quy trình có th
ể được tóm tắt như sau:

Ví dụ FormattableVector

Trong ví dụ này phần đặc tả định dạng mà ta sẽ hổ trợ là :
· N - được phiên dịch như là yêu cầu cung cấp 1 số được biết như là Norm của
Vector.là tổng bình phương của các thành phần của nó.
và luôn được trình bày giữa dấu || , ví dụ như || 34.5 ||
· VE- được phiên dịch như là yêu cầu trình bày mỗi thành phần trong đặc tả định
dạng.như đặc tả E đối với 1 số double ch
ỉ định (2.3E+01, 4.5E+02, 1.0E+00).
· IJK - được phiên dịch như là yêu cầu trình bày vector dưới dạng 23i + 450i + 1k.
việc trình bày mặc định sẽ có dạng Vector( 23,450,1.0)
Để cho đơn giản ta sẽ không thi hành bất kì tuỳ chọn để trình bày Vector theo kết hợp
giữa IJK và định dạng khoa học.tuy nhiên ta sẽ có thể kiểm tra đặc tả theo cách không
phân biệt chữ hoa và chữ thường , để cho phép ijk thay IJK. lưu ý rằng hoàn toàn tuỳ
thuộc vào chuỗi ta sử dụng để chỉ định đặc tả định dạng.
Đầu tiên ta sẽ khai báo Vector thi hành IFormatable:
struct Vector : IFormattable
{
public double x, y, z;
sao đó thêm vào phương thức overload tostring() 2 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();
}
}

Đó là tất cả những gì ta phải làm. lưu ý cần kiểm tra định dạng null trước khi gọi bất cứ
phương thức nào.trong ví dụ phần đặc tả VE , ta cần mỗi thành phần đưọc định dạng theo
cú pháp khoa học,vì thế ta dùng String.Format()để làm.tất cả các trường x,y,z là
double.Trong trường hợp định dạng IJK, có vài chuỗi con được thêm vào chuỗi , vì thế ta
dùng đối tượng StringBuilder để làm.
để hoàn chỉnh ta sẽ 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 3 :
public override string ToString()
{
return "( " + x + " , " + y + " , " + z + " )";
}


cuối cùng ta thêm vào phương thức Norm() mà tính bình phương ( Norm) của Vector :
public double Norm()
{
return x*x + y*y + z*z;
}

Bây giờ ta sẽ thử đoạn mã trên 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 quả trả về là :
FormattableVector
In IJK format,
v1 is 1 i + 32 j + 5 k
v2 is 845.4 i + 54.3 j + -7.8 k

In default format,
v1 is ( 1 , 32 , 5 )
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 là :
v1 is || 1050 ||
v2 is || 717710.49 ||

Code for Download:
FormattableVector


StringEncoder





×