2010-02-21 22 views
10

Tôi đã sử dụng ToString() khiêm tốn trong quá khứ và tôi thấy nó rất hữu ích trong nhiều trường hợp. Tuy nhiên, việc sử dụng phương pháp này của tôi sẽ khó biện minh để đưa phương pháp này vào không ai khác ngoài System.Object. Dự đoán hoang dã của tôi là, tại một số thời điểm trong quá trình thực hiện và các cuộc họp được tổ chức để đưa ra thiết kế ban đầu của khung công tác .NET, nó đã được quyết định là cần thiết - hoặc ít nhất là rất hữu ích - để bao gồm một phương pháp ToString() sẽ được thực hiện bởi mọi thứ trong khung công tác .NET.Lý do ban đầu cho ToString() trong Java và .NET là gì?

Có ai biết lý do chính xác là gì không? Tôi có thiếu một số tình huống trong đó ToString() chứng minh đủ hữu ích để trở thành một phần của System.Object? Lý do ban đầu cho ToString() là gì?

Cảm ơn rất nhiều!

PS - Một lần nữa: Tôi không nghi ngờ phương pháp hoặc ngụ ý rằng nó không hữu ích, tôi chỉ tò mò muốn biết điều gì làm cho nó hữu ích như được đặt trong System.Object.

Side note - Hãy tưởng tượng này:

AnyDotNetNativeClass someInitialObject = new AnyDotNetNativeClass([some constructor parameters]);

AnyDotNetNativeClass initialObjectFullCopy = AnyDotNetNativeClass.FromString(someInitialObject.ToString());

Này sẽ không được mát mẻ?

CHỈNH SỬA (1):

(A) - Dựa trên một số câu trả lời, có vẻ như các ngôn ngữ .NET được kế thừa từ Java. Vì vậy, tôi cũng đang thêm "Java" vào chủ đề và các thẻ. Nếu ai đó biết lý do tại sao điều này được thực hiện trong Java thì hãy làm sáng tỏ một chút!

(B) - Giả thiết tĩnh FromString vs Nối tiếp: chắc chắn, nhưng đó là một câu chuyện hoàn toàn khác, phải không?

+0

FromString = Serialize Deserialize? –

+0

Chắc chắn, nhưng không phải là trực tiếp, righ? –

+0

Câu hỏi hay, và chắc chắn 'System.Object.ToString()' là gây tranh cãi: http://csharptest.net/?p=346 –

Trả lời

14

Nó ban đầu được bổ sung vào đối tượng cho mục đích gỡ lỗi và khai thác gỗ. Bạn có thể suy ra điều này nếu bạn nhìn vào JavaDoc cho Object.toString (http://java.sun.com/javase/6/docs/api/java/lang/Object.html#toString()), khi nó xuất ra tên lớp, tiếp theo là @, tiếp theo là biểu diễn thập lục phân chưa dấu của mã băm của đối tượng. Nơi duy nhất tôi có thể thấy điều này rất hữu ích là trong nhật ký hoặc bảng điều khiển. Tuy nhiên, những người tạo Java cố ý rời khỏi phương thức này không phải là cuối cùng để các lớp con có thể (và nên) ghi đè lên nó để thay vào đó xuất ra nhiều thông tin lớp con cụ thể hơn. Họ có thể vừa triển khai JVM để truyền một đối tượng vào bất kỳ phương thức nào yêu cầu một chuỗi, nó sẽ tạo ra giá trị băm ở trên và chuyển nó vào phương thức, nhưng thay vào đó chúng là tốt và thực hiện nó như một phương thức mà bạn có thể thuận tiện ghi đè.

Và được triển khai ở cấp Đối tượng để bạn có thể giả định một cách an toàn đối tượng bất kỳ có thể được ghi vào nhật ký/bảng điều khiển. Đó là một giả định thuận tiện trong ngôn ngữ Java.

6

Nếu không thảo luận về giá trị của nó, tôi tin rằng điều này có nguồn gốc của nó trong ngôn ngữ cảm hứng cho C# - Java. Lý do nó được tạo ra (cho cả hai ngôn ngữ) là cung cấp một cách để có được một chuỗi đại diện của một thể hiện của bất kỳ đối tượng nào, bao gồm hỗ trợ cho các nền văn hóa khác nhau. Đơn giản như thế.

+0

Java có giống nhau không? Xin lỗi, tôi chưa bao giờ làm bất kỳ Java nào cả ... –

+0

Chắc chắn, nhưng nó được gọi là toString() - chữ thường đầu tiên. –

+3

Điều đó chỉ có nghĩa là cùng một câu hỏi có liên quan đến Java. – Rune

1

Tôi đoán nó chỉ được coi là hữu ích mà bất kỳ đối tượng có thể có một chuỗi đại diện, nếu chỉ vì mục đích gỡ lỗi ...

2

Tôi có thể nghĩ đến hai lý do kỹ thuật để xác định toString() trên java.lang.Object.

  • Các PrintStream.print(Object) API (ví dụ) phụ thuộc vào Object.toString();

  • Toán tử nối chuỗi + phụ thuộc vào Object.toString() trong trường hợp một trong các toán hạng là loại tham chiếu không phải chuỗi.

Là một thay thế, nó đã có thể để xác định một giao diện (nói) Printable mà cung cấp một phương pháp toString() -like và định nghĩa ở trên để yêu cầu một Printable. (Và điều đó sẽ tránh được sự bối rối nảy sinh khi một newbie cố gắng in một đối tượng không bị quá tải toString()).

Tuy nhiên, thật sự thuận tiện khi print (v.v) và + ghép nối chỉ hoạt động với mọi thứ. Và tôi chắc chắn đó là lý do tại sao Java được thiết kế theo cách đó.

EDIT - để đáp lại câu hỏi này followup từ OP:

tĩnh FromString giả vs serialization: chắc chắn, nhưng đó là một câu chuyện hoàn toàn khác, phải không?

Giả sử rằng tôi đang phân tích cú pháp của bạn một cách chính xác ...

Mục tiêu của Object serialization là cung cấp một đại diện phẳng mà có thể là đáng tin cậy và hiệu quả deserialized. Mục tiêu của toString() là cung cấp một biểu diễn văn bản dễ đọc. Trong thực tế, "dễ đọc" và "đáng tin cậy và hiệu quả deserializable" là mâu thuẫn.

+0

Có tiếng vọng ở đây không? ;) Kiểm tra bình luận của tôi về OP. Được thăng hạng. –

+0

Không có tiếng vọng. Tôi sẽ không gọi một giao diện giống như in "overkill". Nó chỉ là giải pháp sai, IMO. –

+0

"Mục tiêu của tuần tự hóa đối tượng ...". Chắc chắn rồi. Bên cạnh điểm mặc dù. –

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