2009-04-09 29 views

Trả lời

67

Không có sự khác biệt nếu cả hai toán hạng là chuỗi. Tuy nhiên, nếu một toán hạng là một chuỗi, và một là một số, thì bạn gặp phải vấn đề, hãy xem mã bên dưới.

"abc" + "def" = "abcdef" 
"abc" & "def" = "abcdef" 
"111" + "222" = "111222" 
"111" & "222" = "111222" 
"111" & 222 = "111222" 
"111" + 222 = 333 
"abc" + 222 = conversion error 

Vì vậy, tôi khuyên bạn nên luôn luôn sử dụng & khi bạn có ý nghĩa để tiếp nhau, bởi vì bạn có thể cố gắng để nối một số nguyên, float, số thập phân cho một chuỗi, mà sẽ gây ra một ngoại lệ, hoặc ít nhất, không làm những gì bạn có thể muốn nó làm.

+11

Hoặc luôn luôn thực thi Tùy chọn Nghiêm ngặt, trong trường hợp đó bạn không bao giờ phải lo lắng về điều đó. Tùy chọn Strict On cũng có nhiều ưu điểm khác: http://stackoverflow.com/questions/222370/option-strict-on-and-net-for-vb6-programmers – mattmc3

+3

Có một vấn đề với '&' cho chuỗi nối. Từ [tài liệu] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "Toán tử & luôn mở rộng các toán hạng của nó thành Chuỗi, bất kể cài đặt của Tùy chọn Nghiêm ngặt". Vì vậy, ví dụ '" Hello "& 2.5' sẽ âm thầm chuyển đổi 2.5 thành chuỗi bằng cách sử dụng các thiết lập vùng (bạn có thể nhận được' "2.5" 'hoặc' "2,5" '). Tốt nếu đó là những gì bạn muốn. Tôi sẽ nhiều, nhiều hơn là buộc phải xác định rõ ràng. – MarkJ

+0

@MarkJ Ồ vâng, công cụ địa phương có thể thực sự giúp bạn nếu bạn không xem. Đặc biệt là trên các máy chủ web. Nếu bạn có một loạt các máy chủ web, bạn nên chắc chắn rằng tất cả chúng đều được cấu hình cho cùng một thiết lập vùng, cho phép bạn nhận được các vấn đề định dạng khó khăn hơn với các số và ngày tháng. – Kibbee

0

Không khi tham gia chuỗi:

Dim string1 As String = "A" + "B" 
    Dim string2 As String = "A" & "B" 

    If string1.Equals(string2) And string2.Equals(string1) Then 
     Debugger.Break() 
    End If 
12

Nhà điều hành & luôn đảm bảo rằng cả hai toán hạng là chuỗi, trong khi các nhà điều hành + phát hiện quá tải mà phù hợp với toán hạng.

Khái niệm 1 & 2 cung cấp cho các giá trị "12", trong khi biểu thức 1 + 2 đưa ra giá trị 3.

Nếu cả hai toán hạng là chuỗi, không có sự khác biệt trong kết quả.

+0

+ toán tử chỉ thực hiện chuyển đổi ngầm nếu 'Tùy chọn Strict' là' Tắt'. Nhưng toán tử & sẽ thực hiện chuyển đổi ngầm thành chuỗi bất kể cài đặt 'Tùy chọn Strict'. [Tài liệu] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "Toán tử & luôn mở rộng các toán hạng của nó thành Chuỗi, bất kể cài đặt của Tùy chọn Nghiêm ngặt". Vì vậy, ví dụ '" Hello "& 2.5' sẽ âm thầm chuyển đổi 2.5 thành chuỗi bằng cách sử dụng các thiết lập vùng (bạn có thể nhận được' "2.5" 'hoặc' "2,5" '). Tốt nếu đó là những gì bạn muốn. – MarkJ

2

Không có sự khác biệt trong hầu hết các trường hợp. Tuy nhiên, việc thực hành tốt nhất là:

"+" chỉ nên dành cho bổ sung số nguyên, bởi vì nếu bạn không sử dụng Option Strict On sau đó bạn có thể đã thực sự sai lầm tình huống như:

Input + 12 có thể cung cấp cho bạn 20 thay vì 812. Điều này có thể đặc biệt xấu trong một ứng dụng ASP.NET, nơi đầu vào đến từ POST/GET.

Chỉ cần đặt: Để nối chuỗi, luôn sử dụng "&" thay vì "+".

Rõ ràng, sử dụng StringBuilder nơi nó phù hợp :)

3

Toán tử + có thể là phần bổ sung hoặc nối. & chỉ là ghép nối. Nếu các biểu thức là cả hai chuỗi thì kết quả sẽ giống nhau.

Tôi sử dụng & khi làm việc với chuỗi và + khi làm việc với các số, vì vậy không bao giờ nhầm lẫn về ý định của tôi. Nếu bạn sử dụng sai + và một biểu thức là một chuỗi và một là một số, bạn sẽ gặp rủi ro về các kết quả không mong muốn.

1

Nếu cả hai loại được nhập tĩnh vào System.String, thì không có sự khác biệt nào giữa mã. Cả hai sẽ giải quyết xuống thành viên String.Concat (đây là những gì + làm cho chuỗi).

Tuy nhiên, nếu các đối tượng không được nhập mạnh vào chuỗi, thì ràng buộc muộn của Visual Basic sẽ bắt đầu và đi theo hai tuyến đường rất khác nhau. Phiên bản + sẽ cố gắng thực hiện một hoạt động thêm hoạt động nghĩa là cố gắng thêm đối tượng. Điều này sẽ làm mọi cách để chuyển đổi cả hai giá trị thành một số và sau đó thêm chúng.

Nhà điều hành & sẽ cố gắng ghép nối. Thời gian chạy Visual Basic sẽ đi qua tất cả các cách thức chuyển đổi để chuyển đổi cả hai giá trị thành chuỗi. Sau đó, kết quả sẽ là String.Concat.

+0

Cũng đáng nói đến là toán tử '&' ** bỏ qua Tùy chọn Nghiêm ngặt **. Từ [tài liệu] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "Toán tử & toán tử luôn mở rộng các toán hạng của nó thành Chuỗi, bất kể cài đặt của Tùy chọn Nghiêm ngặt". Vì vậy, ví dụ '" Hello "& 2.5' sẽ âm thầm chuyển đổi 2.5 thành chuỗi bằng cách sử dụng các thiết lập vùng (bạn có thể nhận được' "2.5" 'hoặc' "2,5" '). Tốt nếu đó là những gì bạn muốn. Tương phản với '+' là nghiêm ngặt khi 'Tùy chọn Strict On' – MarkJ

7

Không có.

Như bạn có thể xem bên dưới. Hai dòng mã biên dịch một cách chính xác vào mã IL cùng:

Module Module1 

Sub Main() 
    Dim s1 As String = "s1" 
    Dim s2 As String = "s2" 
    s2 += s1 
    s1 &= s2 
End Sub 

End Module 

Biên dịch đến (lưu ý System.String::Concat):

.method public static void Main() cil managed 
{ 
.entrypoint 
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00) 
// Code size  31 (0x1f) 
.maxstack 2 
.locals init ([0] string s1, 
     [1] string s2) 
IL_0000: nop 
IL_0001: ldstr  "s1" 
IL_0006: stloc.0 
IL_0007: ldstr  "s2" 
IL_000c: stloc.1 
IL_000d: ldloc.1 
IL_000e: ldloc.0 
IL_000f: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_0014: stloc.1 
IL_0015: ldloc.0 
IL_0016: ldloc.1 
IL_0017: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_001c: stloc.0 
IL_001d: nop 
IL_001e: ret 
} // end of method Module1::Main 
+0

Cảm ơn Aliostad, mà tổng hợp nó hoàn hảo. Tôi tò mò nhất (và có lẽ nên vạch ra nó tốt hơn một chút trong câu hỏi của tôi) về cách nó được xử lý. String + String (miễn là cả hai chuỗi) giống như String & String (bất kể tập hợp các quy tắc phức tạp với toán tử +). – rickp

+0

Không có probs. Nó luôn luôn là tốt để có một cái nhìn vào mã IL sử dụng ILDASM. Ban đầu nó không quen thuộc nhưng dần dần bạn quen với nó. – Aliostad

1

Trực tiếp từ MSDN Tài liệu: Concatenation Operators in Visual Basic

khác biệt giữa hai Nhà điều hành ghép nối

Toán tử + (Visual Basic) có pri mục đích mary của việc thêm hai số . Tuy nhiên, nó cũng có thể nối các toán hạng số với các toán hạng chuỗi . Toán tử + có một bộ quy tắc phức tạp xác định có thêm, nối, báo hiệu lỗi trình biên dịch hay ném ngoại lệ thời gian chạy InvalidCastException.

Toán tử & được chỉ định nghĩa cho các toán hạng chuỗi và nó luôn mở rộng các toán hạng của nó thành chuỗi, bất kể cài đặt Tùy chọn nghiêm ngặt. Toán tử & được đề xuất cho chuỗi nối vì nó được xác định dành riêng cho chuỗi và làm giảm cơ hội của bạn khi tạo chuyển đổi không mong muốn.

Tin tưởng MSDN! :-)

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