2009-02-08 27 views
6

Cách ghi đè hoặc mở rộng các lớp chính .net. ví dụCó thể mở rộng lớp Chuỗi trong .net

public class String 
{ 
    public boolean contains(string str,boolean IgnoreCase){...} 
    public string replace(string str,string str2,boolean IgnoreCase){...} 
} 

sau

string aa="this is a Sample"; 
if(aa.contains("sample",false)) 
{...} 

là nó có thể?

Trả lời

22

Lớp chuỗi được niêm phong để bạn không thể kế thừa từ đó. Phương pháp mở rộng là đặt cược tốt nhất của bạn. Họ có cùng số cảm thấy làm phương pháp thể hiện mà không mất chi phí thừa kế.

public static class Extensions { 
    public static bool contains(this string source, bool ignoreCase) {... } 
} 

void Example { 
    string str = "aoeeuAOEU"; 
    if (str.contains("a", true)) { ... } 
} 

Bạn sẽ cần phải sử dụng VS 2008 để sử dụng các phương pháp mở rộng.

+0

@JaredPar: Một lần chỉnh sửa, bạn không cần VS 2008 để sử dụng các phương pháp mở rộng. Bạn cần trình biên dịch C# cho C# 3.0 có trong .NET 3.5. VS 2008 chỉ là IDE và không cung cấp chức năng. – casperOne

+2

@casperOne, đúng. Tôi thường nói VS 2008 vì nó phổ biến hơn. Điều thú vị hơn nữa là bạn có thể biên dịch các ứng dụng 2.0 với các phương thức mở rộng nếu bạn cung cấp thuộc tính Extension của riêng bạn. http://blogs.msdn.com/jaredpar/archive/2007/11/16/extension-methods-without-3-5-framework.aspx – JaredPar

+3

@casperOne - để quay lại với bạn "hoặc mono 2.0"; -p –

2

Lớp chuỗi được niêm phong, vì vậy bạn không thể mở rộng nó. Nếu bạn muốn thêm các tính năng, bạn có thể sử dụng các phương pháp mở rộng hoặc quấn nó trong một lớp của riêng bạn và cung cấp bất kỳ tính năng bổ sung nào bạn cần.

0

Bạn cũng có thể sử dụng mẫu bộ điều hợp để thêm chức năng bổ sung. Bạn có thể làm toán tử quá tải để làm cho nó cảm thấy giống như chuỗi dựng sẵn. Tất nhiên điều này sẽ không được tự động cho sử dụng hiện tại của "chuỗi" nhưng không phải là giải pháp của bạn trực tiếp kế thừa từ nó, nếu nó có thể.

1

Nói chung, bạn nên thử xem có phương pháp nào khác sẽ trả lời nhu cầu của bạn theo cách tương tự hay không. Đối với ví dụ của bạn, Contains thực sự là phương thức trình bao bọc cho IndexOf, trả về true nếu giá trị trả về lớn hơn 0, nếu không false. Khi điều đó xảy ra, phương pháp IndexOf có một số tình trạng quá tải, một trong số đó là IndexOf(string, StringComparison): Int32, có thể được chỉ định để tôn trọng hoặc bỏ qua trường hợp.

Xem String.IndexOf Method (String, StringComparison) (System) để biết thêm thông tin, mặc dù ví dụ này hơi lạ.

Xem StringComparison Enumeration (System) để biết các tùy chọn khác nhau có sẵn khi sử dụng liệt kê StringComparison.

+0

đó là ý tưởng hay – ebattulga

Các vấn đề liên quan