2011-01-12 36 views
21

Có sự khác biệt nào giữa các toán tử & và + trong khi ghép nối chuỗi không? nếu có, thì sự khác biệt là gì? Và nếu không, thì tại sao dưới đây tạo ra ngoại lệ?Các chuỗi ký tự bằng & & + trong VB.Net

Ví dụ:

Dim s, s1, t As String 
    Dim i As Integer 

    s1 = "Hello" 
    i = 1 

    s = s1 & i 
    t = s1 + i //Exception here 

    If s = t Then 
     MessageBox.Show("Equal...") 
    End If 
+0

lỗi gì bạn nhận được? – SLaks

+0

'InvalidCastException' –

+0

Tôi không biết' + 'thậm chí là một toán tử nối trong VB. Đó là một trong những điều tôi ghét về JavaScript là '+' là cho concat và bổ sung. – Brad

Trả lời

28

& và + đều khai thác nối nhưng khi bạn chỉ định một số nguyên trong khi sử dụng +, vb.net cố gắng đúc "Hello" vào số nguyên để làm một sự bổ sung. Nếu bạn thay đổi "Hello" bằng "123", bạn sẽ nhận được kết quả 124.

4

Bạn đã có thể có Option Strict bật (đó là một điều tốt), và trình biên dịch được thông báo rằng bạn không thể thêm một chuỗi và một int. Hãy thử điều này:

t = s1 & i.ToString()

+1

Chris, lỗi nằm trong dòng mã khác. –

+1

Đó là cùng một vấn đề, cách khác vòng ... nó đang cố gắng để đúc các s1 đến một int và không. Để khắc phục điều đó, hãy sử dụng dòng đầu tiên chứ không phải dòng thứ hai. –

+1

Đáng buồn là tôi nghĩ rằng điều này là sai. Tùy chọn nghiêm ngặt phải được tắt nếu không điều này sẽ không biên dịch, không bao giờ nhớ ngoại lệ thời gian chạy. Lời khuyên của tôi sẽ là bật tùy chọn Strict On và sau đó sửa lỗi trình biên dịch bằng các lệnh rõ ràng. – MarkJ

2

Khi câu hỏi của bạn xác nhận, chúng khác nhau: & CHỈ nối chuỗi, + bị quá tải với cả bổ sung thông thường và nối.

Trong ví dụ của bạn:

  • vì một trong những toán hạng để + là một số nguyên VB cố gắng để chuyển đổi chuỗi thành một số nguyên, và như chuỗi của bạn không phải là số nó ném; và

  • & chỉ hoạt động với chuỗi sao cho số nguyên được chuyển thành chuỗi.

-1

Từ một chuỗi ký tự trước đây (sp?), Bạn thực sự nên xem xét sử dụng String.Format thay vì ghép nối.

Dim s1 As String 
    Dim i As Integer 
    s1 = "Hello" 
    i = 1 
    String.Format("{0} {1}", s1, i) 

Giúp mọi thứ trở nên dễ đọc và dễ bảo trì hơn và tôi tin rằng mã của bạn trông chuyên nghiệp hơn. Xem: code better – use string.format. Mặc dù không phải ai cũng đồng ý When is it better to use String.Format vs string concatenation?

+2

Nối chuỗi đơn dòng thường * nhanh hơn * so với gọi 'String.Format'. Bất kỳ lời khuyên nào để luôn luôn sử dụng một trong những khác là sai, và điều này không là ngoại lệ. Tận dụng tối ưu hóa trình biên dịch. Ý tưởng làm một cái gì đó để "làm cho mã của bạn trông chuyên nghiệp hơn" là ngu ngốc. Đó là loại điều mà biện minh bằng cách sử dụng C++ khi nhiệm vụ của bạn được thực hiện dễ dàng hơn nhiều với một ngôn ngữ kịch bản động vì oh, mà chỉ cần nhìn quá "không chuyên nghiệp". Phần mềm chuyên nghiệp là thứ mà * hoạt động * ... tốt. Giao diện không liên quan. Các câu trả lời trong câu hỏi bạn đã liên kết xuất hiện để xác nhận điều này. –

19
  • & chỉ được sử dụng để ghép nối chuỗi.
  • + bị quá tải để thực hiện cả chuỗi nối và thêm số học.

Mục đích kép của + dẫn đến nhầm lẫn, chính xác như trong câu hỏi của bạn. Đặc biệt là khi Option StrictOff, bởi vì trình biên dịch sẽ thêm các phôi tiềm ẩn vào chuỗi và số nguyên của bạn để cố gắng hiểu mã của bạn.

khuyến nghị của tôi

  • Bạn chắc chắn nên bật Option Strict On, sau đó trình biên dịch sẽ buộc bạn phải thêm dàn diễn viên rõ ràng nơi mà nó nghĩ rằng họ là cần thiết.
  • Bạn nên tránh sử dụng + để nối vì sự mơ hồ với phép cộng số học.

Cả các đề xuất này cũng có trong cuốn sách của Microsoft Press Practical Guidelines And Best Practises for VB and C# (phần 1.16, 21,2)

-1

My 2 cents:

Nếu bạn đang concatenating một số lượng đáng kể các chuỗi, bạn nên sử dụng các Thay vào đó, StringBuilder. IMO sạch hơn và đáng kể hơn nhanh hơn.

+0

Một 'StringBuilder' là * không * sẽ trợ giúp trong trường hợp này. Khi bạn đang giao dịch với ít hơn (khoảng) 4 phụ thêm, chi phí của 'StringBuilder' nói chung là không có giá trị nó. Người hỏi không phụ thêm chuỗi trong một vòng lặp, do đó, không có điểm. Trước khi đưa ra đề xuất, hãy hiểu những điều bạn đang đề xuất thực sự * làm * và cách chúng hoạt động. Bỏ thói quen lập trình hàng hóa. –

+1

"Nếu bạn đang ghép một số lượng lớn các chuỗi" – Alex7575

+1

@ Hãy mang nó dễ dàng, bạn thân. Không ai bị thương ở đây. – Will

0

Bạn có thể viết '&' để thêm chuỗi và số nguyên:

processDetails=objProcess.ProcessId & ":" & objProcess.name 
message = msgbox(processDetails,16,"Details") 

đầu ra sẽ là:

5577:wscript.exe 
Các vấn đề liên quan