Điều này hơi khó trả lời. Câu trả lời upvoted có một vấn đề, StringBuilder không có bất kỳ phương thức ảo nào. Vì vậy, không có gì bạn có thể làm để ngắt lớp học hoặc làm bất cứ điều gì "thêm" không an toàn.
Tôi cho rằng lý do có thể là CLR có kiến thức đặc biệt của lớp học. Đó là một chút nhàm chán đối với StringBuilder, so với các loại .NET khác mà nó thân mật với, marshaller pinvoke biết lớp đó trông như thế nào. Bạn sử dụng nó khi bạn cần truyền một tham chiếu chuỗi tới mã không được quản lý, cho phép nó viết nội dung chuỗi. Cần thiết vì đó không phải là hợp pháp đối với String, nó là bất biến. Các marshaller pinvoke biết làm thế nào để thiết lập các thành viên nội bộ của StringBuilder một cách chính xác sau khi cuộc gọi pinvoke. Nhưng sẽ không biết làm thế nào để làm điều đó cho lớp học có nguồn gốc của bạn. Rủi ro cắt lát đó không chính xác đáng được lợi ích khi không niêm phong nó. Đặc biệt vì nó không có các phương thức ảo nên bạn không thể ghi đè lên hành vi của nó.
Một phương pháp mở rộng khác là giải pháp rất hợp lý.
Nguồn
2013-08-02 20:37:58
Tại sao bạn cần xử lý sự kiện "TextChanged" của StringBuilder'? Bạn là người thêm văn bản vào đó. Tôi giả định rằng các cân nhắc về hiệu suất vượt quá khả năng mở rộng cho nó. –
@Tim Điều gì sẽ xảy ra nếu nó là một 'StringWriter' hoặc một số hàm gốc như' SendMessage'? Ngoài ra, các sự kiện thường đẹp hơn để làm việc hơn là phải viết mã như 'void WriteToBuilder (StringBuilder sb, chuỗi văn bản)'. – KappaG3
["Thiết kế và tài liệu thừa kế hoặc người khác cấm nó"] (http://martinfowler.com/bliki/DesignedInheritance.html) – dasblinkenlight