2012-01-18 45 views
5

Phương thức Contains(...) cho chuỗi phân biệt chữ hoa chữ thường. Tôi muốn ghi đè lên nó để làm cho case-insensitive với đoạn mã sau (được đánh cắp từ here) nó:Cách ghi đè Chứa()?

public static bool Contains(this string source, string toCheck, StringComparison comp) 
{ 
    return source.IndexOf(toCheck, comp) >= 0; 
} 

Tuy nhiên, tôi không biết nơi mã nên được dán. Nó có nên được đặt trong cùng một không gian tên của chương trình lớp không? Liệu nó cần một lớp học chuyên dụng?

+1

Bạn không thể kế thừa từ lớp string vì nó niêm phong. – Jeb

+3

@JohnParr Có, nhưng tiêu đề của câu hỏi và văn bản là sai lạc. Anh ấy thực sự đang sử dụng một phương pháp mở rộng - mà OP dường như không thực sự biết và cũng không hiểu (chưa). –

Trả lời

8

Nếu những gì bạn dự định tạo ra extension method cho lớp string, thì bạn cần đặt nó vào một số lớp. Để sử dụng nó, chỉ cần đảm bảo rằng bạn có câu lệnh using chỉ định tham chiếu đến vùng tên chứa lớp đó.

Ví dụ:

namespace SomeNamespace 
{ 
    public static class StringExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

// ... In some other class ... 
using SomeNamespace; 

// ... 
bool contains = "hello".Contains("ll", StringComparison.OrdinalIgnoreCase); 
1

Bạn sẽ cần phải đặt phương thức tiện ích mở rộng này ở nơi nào đó có ý nghĩa đối với bạn, ví dụ: lớp tiện ích, lớp này phải tĩnh. Bạn thực sự không thể ghi đè bất cứ điều gì từ chuỗi, đó là lý do tại sao bạn đang sử dụng phương pháp mở rộng.

Ví dụ:

public static class StringExtension 
{ 
    public static bool Contains(this string source, string toCheck, StringComparison comp) 
    { 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 
} 
+0

Rất tiếc, lớp có chứa cũng phải tĩnh như sau :-) – diggingforfire

1

tôi sẽ đề nghị đặt nó trong một số loại lớp tiện ích mà bạn thực hiện, trong đó có phương pháp helper đẹp như thế này. Nếu bạn đã thêm nó vào, ví dụ, một lớp học StringUtils bạn chỉ có thể gọi StringUtils.Contains() để sử dụng nó.

+1

Không chính xác, phương pháp mà anh ấy đăng là phương pháp mở rộng. Vì vậy, ông sẽ không cần CtringUtils.Contains ông chỉ có thể trực tiếp gọi chứa trên chuỗi của mình. – dowhilefor

+0

@dowhilefor Tôi chủ yếu là một nhà phát triển Java, vì vậy bạn sẽ phải tha thứ cho tôi;) – jprofitt

2

Khi bạn đang tạo ra một phương pháp mở rộng, bạn có thể đặt nó vào bất kỳ không gian tên và bất kỳ lớp tĩnh:

namespace MyProject.MyNamespace 
{ 
    public static class MyExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

Đây hoàn toàn là một điều tổ chức. Bạn sẽ cần thêm các câu lệnh using MyProject.MyNamespace; cần thiết khi bạn sử dụng mã khóa học.

1

Đây là một Extension Method. Bạn chỉ có thể tạo một lớp có tên là MyStringExtension. Nhưng tên không thực sự có liên quan. Miễn là tệp mã có không gian tên được xác định, nơi lớp MyStringExtension của bạn được xác định, tất cả các chuỗi của bạn sẽ có phương thức đó.

1

Phương pháp này được gọi là Extension method

Bạn có thể có nó trong không gian tên tùy chỉnh của bạn trong vòng lớp tĩnh và sử dụng nó bằng cách sử dụng không gian tên tùy chỉnh của bạn.

1

Thay vì ghi đè (bạn không thể thực hiện) hoặc tạo phương thức tiện ích mở rộng, tôi khuyên bạn nên sử dụng quá tải sau đây Contains và viết tùy chỉnh IEqualityComparer thay thế.

public static bool Contains<TSource>(
    this IEnumerable<TSource> source, 
    TSource value, 
    IEqualityComparer<TSource> comparer); 
+0

Bạn có thể muốn thay đổi "ghi đè phương pháp mở rộng" (cũng không thực sự là phương thức tĩnh) thành "tạo tiện ích mở rộng phương pháp". Mọi người, bao gồm cả bản thân mình, là một chút nitpicky ;-) –

+0

Thực hiện và thực hiện, thưa ông :) –

+1

Đó là "sir" có thể là ngày của tôi. :-) –

1

Đó là một extension method, vì vậy nó sẽ có mặt trên bất kỳ đối tượng chuỗi có quyền truy cập đến phương pháp mở rộng của bạn.

Bạn có thể định nghĩa nó như thế này

namespace Example.ExtensionMethods 
{ 
    public static class StringExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

Và sử dụng như thế này

using Example.ExtensionMethods; 

string s = "foobar"; 
int i = s.Contains("oob", StringComparison.InvariantCultureIgnoreCase);