Nó luôn phù hợp nhưng hãy cân nhắc kỹ lưỡng ý định đằng sau những gì bạn đang hiển thị
Một câu hỏi tốt hơn sẽ là hỏi:
Tại sao một người sẽ ghi đè ToString ()?
ToString () là cửa sổ chuyển sang trạng thái của một đối tượng. Nhấn mạnh vào trạng thái như một yêu cầu. Các ngôn ngữ OOP mạnh như Java / C # lạm dụng mô hình OOP bằng cách đóng gói mọi thứ trong một lớp. Hãy tưởng tượng bạn đang viết mã bằng một ngôn ngữ không tuân theo mô hình OOP mạnh mẽ; cân nhắc xem bạn sẽ sử dụng một lớp hay một hàm. Nếu bạn sử dụng nó như một hàm (tức là động từ, hành động) và trạng thái bên trong chỉ được duy trì tạm thời giữa đầu vào / đầu ra, thì ToString () sẽ không thêm giá trị.
Giống như những người khác đã đề cập, điều quan trọng là phải xem xét những gì bạn xuất ra với ToString () vì nó có thể được sử dụng bởi trình gỡ lỗi hoặc các hệ thống khác.
Tôi thích hình dung phương thức ToString như là tham số --help của một đối tượng. Nó phải ngắn gọn, dễ đọc, rõ ràng và dễ hiển thị. Nó sẽ hiển thị những gì đối tượng không phải là những gì nó làm . Với tất cả những điều đó, chúng ta hãy xem xét ...
Trường hợp sử dụng - Phân tích cú pháp một gói TCP:
Không phải là một bản chụp mạng chỉ cấp ứng dụng mà là một thứ gì đó hấp dẫn hơn như một bản chụp pcap.
Bạn chỉ muốn quá tải ToString () cho lớp TCP để bạn có thể in dữ liệu ra bảng điều khiển. Nó sẽ bao gồm những gì? Bạn có thể phát điên và phân tích cú pháp tất cả các chi tiết TCP (tức là TCP rất phức tạp) ...
Bao gồm:
- Cổng nguồn
- Cảng đích
- Số thứ tự
- Số xác nhận
- Phần bù dữ liệu
- Cờ
- Chênh lệch cửa sổ
- Checksum
- Con trỏ khẩn cấp
- Tùy chọn (Tôi thậm chí sẽ không đến đó)
Nhưng bạn có muốn nhận tất cả rác đó nếu bạn đang gọi TCP.ToString () trên 100 gói không? Tất nhiên là không, đó sẽ là tình trạng quá tải thông tin. Sự lựa chọn dễ dàng và rõ ràng cũng là sự hợp lý nhất ...
Cho thấy những gì mọi người mong đợi để xem:
Tôi thích một đầu ra hợp lý để con người dễ dàng phân tích cú pháp trừ YMMV .
TCP:[destination:000, source:000]
Không có gì phức tạp, đầu ra không phải để máy móc phân tích cú pháp (tức là trừ khi mọi người đang lạm dụng mã của bạn), mục đích dự kiến là để con người có thể đọc được.
Nhưng còn phần còn lại của thông tin hấp dẫn mà tôi đã nói trước đây, điều đó cũng không hữu ích sao? Tôi sẽ làm điều đó nhưng trước tiên ...
ToString () một trong những phương thức có giá trị và ít được sử dụng nhất mọi thời đại
Vì hai lý do:
- Mọi người không hiểu ToString () dùng để làm gì
- Lớp 'Đối tượng' cơ sở thiếu một phương thức chuỗi khác, quan trọng không kém.
Lý do 1 - Không lạm dụng tính hữu ích của ToString ():
Rất nhiều người sử dụng ToString () để kéo một biểu diễn chuỗi đơn giản của một đối tượng. Hướng dẫn sử dụng C # thậm chí còn nêu rõ:
ToString là phương pháp định dạng chính trong .NET Framework. Nó chuyển đổi một đối tượng thành biểu diễn chuỗi của nó để nó phù hợp để hiển thị.
Hiển thị, không phải xử lý thêm. Điều đó không có nghĩa là, hãy lấy biểu diễn chuỗi đẹp của tôi về gói TCP ở trên và kéo cổng nguồn bằng cách sử dụng regex :: cringe ::.
Cách đúng đắn để thực hiện công việc là gọi ToString () trực tiếp trên thuộc tính SourcePort (BTW là một ushort nên ToString () đã có sẵn).
Nếu bạn cần một thứ gì đó mạnh mẽ hơn để đóng gói trạng thái của một đối tượng phức tạp để phân tích cú pháp máy, bạn nên sử dụng chiến lược tuần tự hóa có cấu trúc.
May mắn thay, các chiến lược như vậy rất phổ biến:
- ISerializable (C #)
- Dưa chua (Python)
- JSON (Javascript hoặc bất kỳ ngôn ngữ nào triển khai nó)
- XÀ BÔNG TẮM
- Vân vân...
Lưu ý: Trừ khi bạn đang sử dụng PHP vì herp-derp, có một chức năng cho điều đó :: snicker ::
Lý do 2 - ToString () là không đủ:
Tôi vẫn chưa thấy một ngôn ngữ thực hiện điều này ở cốt lõi nhưng tôi đã thấy và sử dụng các biến thể của cách tiếp cận này trong tự nhiên.
Một số trong số đó bao gồm:
- ToVerboseString ()
- ToString (verbose = true)
Về cơ bản, mớ hỗn độn lông lá của trạng thái Gói TCP nên được mô tả để con người có thể đọc được. Để tránh 'con ngựa bất kham' khi nói về TCP, tôi sẽ 'chỉ tay' vào trường hợp số 1 mà tôi nghĩ ToString () và ToVerboseString () chưa được sử dụng hết ...
Trường hợp sử dụng - Mảng:
Nếu bạn chủ yếu sử dụng một ngôn ngữ, bạn có thể cảm thấy thoải mái với cách tiếp cận của ngôn ngữ đó. Đối với những người như tôi, những người chuyển đổi giữa các ngôn ngữ khác nhau, số lượng các cách tiếp cận khác nhau có thể gây khó chịu.
Tức là, số lần điều này khiến tôi khó chịu lớn hơn tổng tất cả các ngón tay của mọi vị thần Hindu cộng lại.
Có rất nhiều trường hợp ngôn ngữ sử dụng chung hacks và một vài mà có được nó ngay . Một số yêu cầu phát minh lại bánh xe, một số làm một bãi cạn, một số khác làm một bãi sâu, không cái nào hoạt động theo cách tôi muốn ...
Những gì tôi yêu cầu là một cách tiếp cận rất đơn giản:
print(array.ToString());
Kết quả đầu ra: 'Array [x]' hoặc 'Array [x] [y]'
Trong đó x là số mục trong thứ nguyên đầu tiên và y là số lượng mục trong thứ nguyên thứ hai hoặc một số giá trị cho biết thứ nguyên thứ 2 có hình răng cưa (có thể có phạm vi tối thiểu / tối đa?).
Và:
print(array.ToVerboseString());
Xuất ra toàn bộ cô ấy bằng bản in đẹp vì tôi đánh giá cao những thứ đẹp đẽ.
Hy vọng rằng, điều này làm sáng tỏ một chủ đề đã khiến tôi khó chịu trong một thời gian dài. Ít nhất thì tôi cũng rắc một chút mồi nhử để các PHPers không tán thành câu trả lời này.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
hoặc tương tự.