Có phải tất cả đều như nhau? Trong hoàn cảnh nào tôi nên chọn mỗi người hơn?
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
EDIT: Đề xuất từ NotMyself ...
- TryCast (var, String)
Có phải tất cả đều như nhau? Trong hoàn cảnh nào tôi nên chọn mỗi người hơn?
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
EDIT: Đề xuất từ NotMyself ...
Câu trả lời:
Những thứ này hơi khác nhau, và thường có cách sử dụng chấp nhận được.
var.
ToString
()
sẽ cung cấp cho bạn biểu diễn chuỗi của một đối tượng, bất kể đó là kiểu gì. Sử dụng cái này nếu var
chưa phải là một chuỗi.CStr
(var)
là toán tử đúc chuỗi VB. Tôi không phải là một người VB, vì vậy tôi sẽ đề nghị tránh nó, nhưng nó sẽ không thực sự làm tổn thương gì. Tôi nghĩ rằng về cơ bản là giống như CType
.CType
(var, String)
sẽ chuyển đổi loại đã cho thành một chuỗi, sử dụng bất kỳ toán tử chuyển đổi được cung cấp nào.DirectCast
(var, String)
được sử dụng để up-cast một đối tượng thành một chuỗi. Nếu bạn biết rằng một biến đối tượng trên thực tế là một chuỗi, hãy sử dụng biến này. Điều này giống như (string)var
trong C #.TryCast
(như được đề cập bởi @ NotMyself ) là như thế DirectCast
, nhưng nó sẽ trả về Nothing
nếu biến không thể được chuyển đổi thành một chuỗi, thay vì ném một ngoại lệ. Điều này giống như var as string
trong C #. Các TryCast
trang trên MSDN có một sự so sánh tốt, quá.TryCast
chỉ hoạt động cho các loại giá trị, vì nó cần phải là loại có thể có Nothing
giá trị
CStr(var)
sẽ bóp nghẹt và đưa ra một ngoại lệ nếu var là DBNull.Value, nhưng thay thế Convert.ToString(var)
sẽ trả về một chuỗi rỗng.
Dim myList AS ArrayList=new ArrayList
Khi bạn viết (From e In myList select CType(e.Name,String)).ToArray()
nó không hoạt động. Tôi đến để viết ... select CType(e.Name.ToString,String)).ToArray()
và tôi lấy lại nụ cười của mình.
Cstr()
được biên dịch nội tuyến cho hiệu suất tốt hơn.
CType
cho phép phân chia giữa các loại nếu toán tử chuyển đổi được xác định
ToString()
Giữa loại cơ sở và chuỗi ném một ngoại lệ nếu không thể chuyển đổi.
TryParse()
Từ Chuỗi đến cơ sở typeif
có thể trả về sai
DirectCast
được sử dụng nếu các loại có liên quan thông qua kế thừa hoặc chia sẻ một giao diện chung, sẽ đưa ra một ngoại lệ nếu không thể sử dụng cast, trycast
sẽ không trả về gì trong trường hợp này
MSDN dường như chỉ ra rằng các phôi Cxxx cho các loại cụ thể có thể cải thiện hiệu suất trong VB .NET vì chúng được chuyển đổi thành mã nội tuyến. Vì một số lý do, nó cũng cho thấy DirectCast trái ngược với CType trong một số trường hợp nhất định (tài liệu nêu rõ khi có mối quan hệ thừa kế; tôi tin rằng điều này có nghĩa là sự tỉnh táo của diễn viên được kiểm tra tại thời điểm biên dịch và tối ưu hóa có thể được áp dụng trong khi CType luôn sử dụng Thời gian chạy VB.)
Khi tôi viết mã VB .NET, những gì tôi sử dụng phụ thuộc vào những gì tôi đang làm. Nếu đó là mã nguyên mẫu tôi sẽ vứt đi, tôi sử dụng bất cứ thứ gì tôi xảy ra để gõ. Nếu đó là mã tôi nghiêm túc, tôi sẽ thử sử dụng dàn diễn viên Cxxx. Nếu không tồn tại, tôi sử dụng DirectCast nếu tôi có niềm tin hợp lý rằng có mối quan hệ thừa kế. Nếu đó là một tình huống mà tôi không biết liệu diễn viên có thành công hay không (ví dụ: đầu vào của người dùng -> số nguyên), thì tôi sử dụng TryCast để làm điều gì đó thân thiện hơn là ném ngoại lệ cho người dùng.
Một điều tôi không thể lay chuyển là tôi có xu hướng sử dụng ToString thay vì CStr nhưng được cho là Cstr nhanh hơn.
Tôi thích cú pháp sau:
Dim number As Integer = 1
Dim str As String = String.TryCast(number)
If str IsNot Nothing Then
Hah bạn có thể nói tôi thường viết mã bằng C #. số 8)
Lý do tôi thích TryCast là bạn không phải loay hoay với chi phí truyền ngoại lệ. Diễn viên của bạn thành công hoặc biến của bạn được khởi tạo thành null và bạn xử lý theo đó.
.ToString()
. Một loại giá trị, chẳng hạn như Integer, không thể là Không có gì. Vì vậy, trong trường hợp này, CStr (số) hoặc số.ToString () là an toàn. Trong trường hợp chung (không chỉ các loại giá trị), CStr (bất cứ thứ gì) đều an toàn, bởi vì nó có thể xử lý Không có gì - kết quả sẽ là Không có gì, trong biến Chuỗi. TryCast rất hữu ích - chỉ không có ở đây.
Người dùng Konrad Rudolph ủng hộ DirectCast () trong câu hỏi về Stack Overflow "Các tính năng ẩn của VB.NET" .
String
, nên OP không thể thảo luận về tình huống DirectCast phù hợp.
String
và ToString
, khiếu nại của tôi sẽ không được áp dụng. Bạn không nên ủng hộ DirectCast, cho đến khi bạn thu hẹp chủ đề khỏi CHUYỂN ĐỔI chung.
Theo bài kiểm tra chứng nhận, bạn nên sử dụng Convert.ToXXX () bất cứ khi nào có thể cho các chuyển đổi đơn giản vì nó tối ưu hóa hiệu suất tốt hơn so với chuyển đổi CXXX.
Có một lần, tôi nhớ đã thấy trạng thái thư viện MSDN sử dụng CStr () vì nó nhanh hơn. Tôi không biết nếu điều này là đúng mặc dù.