Sự khác biệt giữa +
và &
để tham gia chuỗi trong VB.NET là gì?Sự khác biệt giữa + và & để tham gia chuỗi trong VB.NET
Trả lời
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.
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
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ả.
+ 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
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 :)
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.
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
.
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
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
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
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
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! :-)
- 1. Sự khác biệt giữa việc tham gia trái và tham gia bên ngoài bên trái
- 2. Sự khác biệt giữa Tham gia bên trong & Tham gia đầy đủ
- 3. Sự khác biệt giữa = và: =
- 4. sự khác biệt giữa char * và chuỗi
- 5. Sự khác biệt giữa "sử dụng" và "trên" trong bảng tham gia trong MysQL là gì?
- 6. Sự khác biệt giữa khóa được đồng bộ hóa và tham gia lại?
- 7. Sự khác biệt giữa ". +" Và ". +?"
- 8. sự khác biệt giữa 'và "trong JavaScript?
- 9. Sự khác biệt giữa Ngã ba/Tham gia và Bản đồ/Giảm
- 10. Sự khác biệt giữa '.' và "." trong java
- 11. Sự khác biệt giữa rows.add và importRow
- 12. Tham gia chuỗi trước, giữa và sau
- 13. Sự khác biệt giữa! và !! trong yaml?
- 14. Sự khác biệt giữa @string và @ + string?
- 15. Sự khác nhau giữa thuộc tính và hàm được tham số trong vb.net là gì?
- 16. Sự khác biệt giữa gấp và giảm?
- 17. Sự khác biệt giữa. và #
- 18. Sự khác biệt giữa $ (...) và `...`
- 19. Whats sự khác biệt giữa làm trong khi và trong khi trong VB.NET?
- 20. Sự khác biệt giữa "**/* /" và "** /"?
- 21. Sự khác biệt giữa $ * và $ @
- 22. Sự khác biệt giữa $ VARIABLE và $ {VARIABLE}
- 23. Sự khác nhau giữa "và" và "ở đâu" trong tham gia
- 24. Sự khác nhau giữa tham gia vòng lặp lồng nhau và tham gia băm trong SQL Server 2008
- 25. Sự khác biệt giữa const. con trỏ và tham chiếu?
- 26. Sự khác biệt giữa tham chiếu chuyển tiếp và *?
- 27. Sự khác biệt giữa $ @ và $! trong perl
- 28. Sự khác biệt giữa Monitor.Pulse và Monitor.PulseAll
- 29. sự khác biệt giữa ARC và MRC
- 30. Sự khác biệt giữa. và: trong Lua
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
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
@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