Tôi nên sử dụng VB.NET như thế nào?


151

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âu trả lời:


156

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 varchư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)vartrong C #.
  • TryCast(như được đề cập bởi @ NotMyself ) là như thế DirectCast, nhưng nó sẽ trả về Nothingnế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 stringtrong C #. Các TryCasttrang trên MSDN có một sự so sánh tốt, quá.

15
Không bao giờ có lý do để sử dụng CType (var, String) thay vì CStr (var), họ thực hiện chính xác điều tương tự.
Jonathan Allen

2
@Maslow TryCastchỉ hoạt động cho các loại giá trị, vì nó cần phải là loại có thể có Nothinggiá trị
bdukes

1
@Martinho hoàn toàn đúng. Điều đó sẽ nói "chỉ hoạt động cho loại tham chiếu "
bdukes

3
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.
MCattle

Dim myList AS ArrayList=new ArrayListKhi 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.
Bellash

13

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ở typeifcó 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, trycastsẽ không trả về gì trong trường hợp này


8

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.


8

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 đó.


2
Tôi nghĩ bạn đã sai. Không nên sử dụng TryCast chút nào. trong trường hợp như của bạn, nên sử dụng number.ToString () hoặc CStr (number).
Shimmy Weitzhandler

4
@Shimmy: lý do đằng sau việc không sử dụng TryCast là gì? Không phải là DirectCast tốt hơn để tránh một ngoại lệ trong các tình huống nhất định sao?
Dienekes

3
@Dienekes và NotMyself. TryCast chỉ dành cho các loại THAM KHẢO. Ở đây, chúng ta có một số nguyên, là một loại GIÁ TRỊ. Trình biên dịch sẽ từ chối TryCast. Ngoài ra, mục tiêu là một Chuỗi. Bất kỳ thực thể .Net nào ngoại trừ Không có gì hỗ trợ .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.
ToolmakerSteve

4

-1 vì DirectCast rõ ràng KHÔNG thích hợp ở đây, ngoại trừ trong tình huống rất hạn chế, điều mà bạn không muốn đề cập đến. DirectCast là tốt khi bạn biết bạn có hai LOẠI TÀI LIỆU THAM KHẢO LIÊN QUAN, và muốn một sự phân vai hiệu quả giữa chúng. Vì câu hỏi là về việc có được a String, nên OP không thể thảo luận về tình huống DirectCast phù hợp.
ToolmakerSteve

... Nếu câu hỏi không được đề cập StringToString, 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.
ToolmakerSteve

1

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.


1
FYI, theo Paul Vick tại Microsoft, các nhà khai thác Cxxx nhanh hơn các chức năng Convert.Toxxx, ít nhất là vào năm 2004, vì Cxxx biên dịch trực tiếp với IL, thay vì gọi một hàm. Mặc dù lý do của anh ta có vẻ đáng ngờ, nhưng có khả năng JIT tối ưu hóa các cuộc gọi chức năng. panopticoncentral.net/2004/05/31/the-native-net-lingu
ToolmakerSteve

0

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ù.


2
DirectCast nhanh hơn CStr, nhưng bạn chỉ có thể sử dụng nó khi truyền đối tượng chuỗi thành biến chuỗi. Nó sẽ thất bại nếu bạn cố gắng chuyển đổi bất kỳ đối tượng nào khác thành một chuỗi.
Jonathan Allen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.