2010-07-05 19 views
11

có nhiều cách để chuyển đổi đối tượng sang đối tượng khác bằng cách khác biệt giữa những gì và nếu không có sự khác biệt tại sao có nhiều cách để đạt được một điều? Đó không phải là thiệt hại đối với ngôn ngữ sao?Sự khác biệt giữa phương pháp đúc/chuyển đổi trong C#

giả sử obj đối tượng thành chuỗi.

obj.ToString() 
obj as string 
(string)obj 
Convert.ToString(obj) 
+1

Có thể làm mọi thứ bằng nhiều cách không phải là thiệt hại. Nó là một nguồn lực mạnh mẽ. Giống như trong các ngôn ngữ nói: Bạn có thể thể hiện bản thân theo nhiều cách khác nhau (có thể có những khác biệt nhỏ về sắc thái). –

Trả lời

17

Bạn đang làm những việc khác nhau ở đây:

  • obj.ToString() - đây là một cuộc gọi đến các phương pháp ToString() của đối tượng. Đối tượng trả về một chuỗi khi nó được lập trình.
  • obj dưới dạng chuỗi - đây là một nỗ lực để chuyển đổi đối tượng thành chuỗi, có thể hoặc không thể thất bại (nếu không thành công, kết quả là null), sẽ không có ngoại lệ nào được ném.
  • (string) obj - đây là một diễn viên rõ ràng của obj để loại string, bạn đang nói với trình biên dịch rằng obj một string. Nếu obj không phải là loại chuỗi, bạn sẽ nhận được ngoại lệ truyền.
  • Convert.ToString (obj) - Đây là lệnh gọi rõ ràng đối với lớp Chuyển đổi để trả về biểu diễn chuỗi là obj.

Có những nhiều cách khác nhau để có được một string từ một object vì mỗi người là khác nhau và có sự khác biệt tinh tế. Có, trong nhiều trường hợp, chuỗi trả về sẽ giống nhau, nhưng điều này không được đảm bảo.

+0

loại tiếp theo "tạo" .ToString() ngay cả khi điều này không tồn tại? – eugeneK

+0

@eugeneK - in .NET tất cả các đối tượng kế thừa từ 'đối tượng'. Vì 'ToString()' được định nghĩa trên nó, tất cả các đối tượng có một phương thức 'ToString()', có thể được ghi đè. Theo như tôi biết, 'Convert.ToString (obj)' đơn giản gọi nó, nhưng về cơ bản, những gì bạn đang nói là đúng - 'Convert' cố gắng" tạo "một chuỗi từ một" đối tượng ", tốt nhất có thể. – Oded

+1

@eugeneK, Convert.ToString sử dụng giao diện IConvertible của loại để xác định cách thực hiện chuyển đổi. Điều này có thể có một triển khai khác với .ToString(), mặc dù chúng thường giống nhau.Cũng có thể tìm kiếm một TypeConverter cho một lớp và chuyển đổi thành chuỗi (nếu trình biến đổi hỗ trợ nó), đó là cơ chế được nhà thiết kế sử dụng khi biểu diễn các cá thể dưới dạng các chuỗi trong lưới thuộc tính. –

2
obj as string 
(string)obj 

"là" nhà điều hành là an toàn. nếu nó không thể chuyển đổi nó sẽ trả về null, khi() điều hành tăng ngoại lệ

+0

thì tại sao() tồn tại? Các ngoại lệ được xử lý tốt hơn trước khi chúng xuất hiện trong chương trình "đúng". Chúng ta có thể hỏi liệu giá trị kết quả từ obj là string == null và xử lý "exception". Nhà điều hành – eugeneK

+0

@eugeneK "AS" chỉ hoạt động với các loại tham chiếu. bạn không thể làm như thế này int r = stmng as int; để yêu cầu loại được yêu cầu bạn có thể gọi điều này nếu (obj IS string) – Arseny

+0

@eugeneK, diễn viên rõ ràng (chứ không phải là 'as') bao gồm xác nhận rằng bạn cho rằng dàn diễn viên sẽ thành công. Khi bạn tin rằng đây là trường hợp, nó có ý nghĩa để ném một ngoại lệ nếu diễn viên thất bại. Về cơ bản bạn cast một cách rõ ràng khi bạn không thể xử lý có ý nghĩa một thất bại cast nếu nó đã xảy ra. –

2

Có một sự khác biệt:

  • ToString là một phương pháp dựa vào các đối tượng chính xác những gì mà đại diện chuỗi sẽ trông như thế nào.
  • Các as từ khóa là tài liệu tham khảo chuyển đổi: Note that the as operator only performs reference conversions and boxing conversions.
  • Sử dụng() để xác định loại là một explicit conversion trong khi như từ khóa là implicit.
  • Sử dụng lớp Convert thực sự chỉ giúp bạn phân tích cú pháp, Convert.ToString có thể chỉ kết thúc tốt đẹp .ToString() trên đối tượng.
+0

chuyển đổi tham chiếu và quyền anh trong ba từ là gì? – eugeneK

+0

@eugeneK, tôi không biết khoảng ba từ, nhưng hãy kiểm tra MSDN trên boxing/unboxing http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx –

1

Trước hết, quá trình truyền rất khác với việc chuyển đổi đối tượng thành chuỗi. Việc đúc không chuyển đổi một đối tượng thành bất kỳ thứ gì, nó chỉ giả định một kiểu khác, trong khi ToString thực sự tạo một chuỗi từ một đối tượng (điều này tất nhiên có thể là no-op nếu đối tượng đã là một chuỗi).

Có hai thao tác đúc vì lý do Arseny giải thích: Toán tử as sẽ trả về tham chiếu null trong khi toán tử () sẽ tăng ngoại lệ nếu không thực hiện được phép.

Có hai phương thức ToString, vì obj.ToString() tất nhiên chỉ hoạt động nếu obj thực sự là đối tượng chứ không phải là int.Đối với trường hợp sau này bạn phải sử dụng Convert.ToString(). Tương tự, khi objnull, thì obj.ToString() sẽ tăng ngoại lệ, trong khi Convert.ToString() có thể trả lại một số chuỗi hợp lý (ví dụ: "null").

1

[là] những sự khác biệt giữa những

Có 2 cách loại đúc và một loạt các lớp học và phương pháp trong thư viện. Typecasting được sử dụng cho các đối tượng (giá trị) đã được gần gũi về mặt kỹ thuật và liên quan chặt chẽ.

Chuyển đổi (các phương pháp ConvertSomeType.Parse()) thực sự chuyển đổi kiểu dữ liệu (Chuỗi thành Int32 không thể là diễn viên).

tại sao có quá nhiều cách để đạt được một điều?

Truyền và chuyển đổi là những hành động quan trọng, thường được sử dụng. Đó là lý do tại sao chúng tôi có một bộ công cụ tinh xảo, thừa nhận rằng có khá nhiều sự trùng lặp.

2

Thường có nhiều cách làm cơ bản giống nhau, nhưng với các biến thể nhỏ. Có sự khác biệt rõ rệt giữa tính năng truyền và chuyển đổi, ví dụ: bạn có thể chuyển đổi một số int thành string, nhưng bạn không thể bỏ một số int đến string.

Bạn có điểm hợp lệ trong việc điều này có gây hại cho ngôn ngữ không, nhưng chủ yếu là do có nhiều cách để thực hiện mọi thứ, nhưng vì chúng có thể được triển khai không nhất quán. Khi bạn thực hiện các lớp học, bạn phải cẩn thận để chúng hoạt động như mong đợi. Kiểm tra cho bình đẳng là một ví dụ, nơi bạn có thể sử dụng một phương pháp hay một nhà điều hành:

x == y 
x.Equals(y) 

Nếu bạn thực hiện một trong số họ trong lớp học của bạn nhưng không phải là khác, trình biên dịch sẽ giúp bạn với một cảnh báo rằng cả hai phải được triển khai cho lớp để hoạt động đúng.

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