Làm cách nào để mở rộng các kiểu tích hợp trong C #, như Chuỗi?


89

Xin chào tất cả mọi người ... Tôi cần Trima String. Nhưng tôi muốn xóa tất cả các khoảng trống lặp lại trong chính Chuỗi, không chỉ ở cuối hoặc ở đầu của nó. Tôi có thể làm điều đó với một phương pháp như:

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

Cái mà tôi nhận được từ đây . Nhưng tôi muốn đoạn mã này được gọi trong String.Trim()chính nó, vì vậy tôi nghĩ rằng tôi cần phải mở rộng hoặc quá tải hoặc ghi đè Trimphương thức ... Có cách nào để làm điều đó không?

Cảm ơn trước.

Câu trả lời:


163

Vì bạn không thể gia hạn string.Trim(). Bạn có thể tạo một phương pháp Tiện ích mở rộng như được mô tả ở đây để cắt và giảm khoảng trắng.

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

Bạn có thể sử dụng nó như vậy

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

Mang đến cho bạn

text = "I'm wearing the cheese. It isn't wearing me!";

Tệp có cần một tên đặc biệt không? Hay bạn lưu cái này ở đâu? Nó có thể được đưa vào một lớp Util hoặc một cái gì đó tương tự không?
thử nghiệm

1
@testing Bạn có thể đặt chúng ở bất kỳ đâu miễn là chúng được tham chiếu vào dự án của bạn. Nếu bạn đặt chúng trong một không gian tên cụ thể, chỉ cần đưa chúng vào bằng câu lệnh 'using' như bất kỳ lớp nào khác.
Hai lần vào

tại sao bạn không trả lại regex ngay từ hàm TrimAndReduce? nó sẽ làm cho câu trả lời của bạn dễ đọc hơn nhiều. Trừ khi bạn sử dụng câu trả lời của mình nhiều đến mức bạn cần phải gọi câu trả lời đó ở nơi khác LOL
Liên minh huyền thoại

23

Có khả thi không? Có, nhưng chỉ với một phương thức mở rộng

Lớp System.Stringđược niêm phong nên bạn không thể sử dụng ghi đè hoặc kế thừa.

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
Nói rõ hơn, không, không thể sửa đổi các hành động được String.Trimthực hiện.
Michael Petrotta

10

Có một có và một không cho câu hỏi của bạn.

Có, bạn có thể mở rộng các loại hiện có bằng cách sử dụng các phương pháp mở rộng. Các phương pháp mở rộng, một cách tự nhiên, chỉ có thể truy cập giao diện công khai của loại.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

Không, bạn không thể gọi phương thức này Trim(). Các phương thức mở rộng không tham gia quá tải. Tôi nghĩ rằng một trình biên dịch thậm chí sẽ cung cấp cho bạn một thông báo lỗi nêu chi tiết điều này.

Các phương thức mở rộng chỉ hiển thị nếu không gian tên chứa kiểu xác định phương thức đang sử dụng.



2

Bên cạnh việc sử dụng các phương thức mở rộng - có thể là một ứng cử viên tốt ở đây - cũng có thể "bọc" một đối tượng (ví dụ: "cấu tạo đối tượng"). Miễn là biểu mẫu được bọc không chứa nhiều thông tin hơn thứ đang được bọc thì mục được bọc có thể được chuyển một cách rõ ràng qua các chuyển đổi ngầm định hoặc rõ ràng mà không mất thông tin: chỉ là thay đổi loại / giao diện.

Chúc bạn viết mã vui vẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.