2008-11-14 29 views

Trả lời

11

Yes. Nó có. Tôi chỉ thử nghiệm VS 2008 nhưng tôi mạnh mẽ nghi ngờ các phiên bản trước đó đã làm là tốt.

VB.NET

Public Class Class1 


    Dim s As String = "test " + "this " + "function" 

    Public Function test() As String 
     Return s 
    End Function 

End Class 

I.L. - Lưu ý chuỗi "kiểm tra chức năng này"

{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: call instance void [mscorlib]System.Object::.ctor() 
    L_0006: nop 
    L_0007: ldarg.0 
    L_0008: ldstr "test this function" 
    L_000d: stfld string ClassLibrary1.Class1::s 
    L_0012: nop 
    L_0013: ret 
} 
4

Trong khi tôi đang tìm kiếm, here's the download page for the spec.

Mục 11.2 có vẻ như sẽ là là bit đúng - về cơ bản tương đương với 7,18 trong thông số C# 3.0 - nhưng nó không chứa cùng một đảm bảo. Tôi nghi ngờ trình biên dịch vẫn làm điều đó, nhưng tôi không thể thấy bất kỳ sự bảo đảm nào. Tôi sẽ có một cái nhìn khác mặc dù.

Phần 11.2 làm nhà nước rằng "Một biểu hiện thường xuyên là một biểu hiện có giá trị có thể được đánh giá đầy đủ tại thời gian biên dịch" (nhấn mạnh của tôi) nhưng tôi không thể thấy rằng nó thực sự đảm bảo rằng nó sẽ hoàn toàn đánh giá nó tại thời gian biên dịch. Thành thật mà nói, nó sẽ là lẻ để làm cho một thể loại của biểu thức dựa trên điều kiện này nhưng không thực sự sử dụng nó. Một thử nghiệm nhanh cho thấy trình biên dịch VB hiện tại thực sự làm việc nối tại thời gian biên dịch, nhưng thực sự có nên là một sự đảm bảo trong thông số nếu đó là ý định.

Mục 7.3 có được gần gũi hơn một chút:

Khi toán hạng của một biểu thức là tất cả các hằng số kiểu nguyên thủy, nó là có thể cho trình biên dịch để đánh giá sự biểu hiện tại thời gian biên dịch. biểu thức này được gọi là biểu thức không đổi.

Bây giờ Chuỗi không phải là một loại nguyên thủy trong điều khoản của CLR (Type.IsPrimitive sẽ trả về false) nhưng nó về spec VB.

Nó vẫn không nói rằng nó sẽ đánh giá nó mặc dù ...

+0

bây giờ là cuộc đua để tìm nó trong thông số kỹ thuật. :-) – Larsenal

1

Trình biên dịch sẽ tối ưu hóa nối chuỗi khi thích hợp. Tuy nhiên, bạn nên xem xét sử dụng lớp StringBuilder nếu bạn không biết có bao nhiêu concatenations có thể có.

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

Từ bài viết ở trên:

Việc thực hiện một hoạt động nối cho một String hoặc đối tượng StringBuilder phụ thuộc vào cách thường là một phân bổ bộ nhớ xảy ra. A Hoạt động nối chuỗi luôn luôn cấp phát bộ nhớ, trong khi thao tác ghép nối StringBuilder chỉ phân bổ bộ nhớ nếu Bộ đệm đối tượng StringBuilder quá nhỏ để chứa dữ liệu mới. Do đó, lớp Chuỗi là thích hợp hơn cho một phép nối nếu số lượng đối tượng Chuỗi cố định được ghép nối. Trong trường hợp đó , các phép nối riêng lẻ hoạt động thậm chí có thể được kết hợp thành một thao tác đơn lẻ của trình biên dịch. A Đối tượng StringBuilder thích hợp hơn cho thao tác ghép nối nếu số tùy ý của các chuỗi là được ghép nối; ví dụ: nếu vòng lặp nối một số ngẫu nhiên là chuỗi đầu vào của người dùng.

5

CÓ, NÓ LÀM VIỆC! KHÔNG ĐƯỢC ĐỂ KIỂM TRA.

Kể từ NET biên dịch tất cả các ngôn ngữ được quản lý (VB, C#, C++) để IL (Intermediate Language) hướng dẫn và String loại là một phần của CLS (Common Language Specification) tất cả .NET phiên bản Framework: 2.0, 3.0, 3.5, 4.0 tối ưu hóa kết nối từng phần của quá trình biên dịch String literals.

Ví dụ mã VB.NET dưới đây:

Dim s As String = "A" & "B" & "C" 

tạo ra hướng dẫn IL sau:

L_0008: ldstr "ABC" 

Điều này chứng tỏ rõ ràng rằng trình biên dịch là tối ưu hóa String nối chữ (thử nghiệm trong: Ildasm.exe)

Tuy nhiên, nếu mã trên được viết trong các tuyên bố riêng biệt:

Dim s As String = "A" 
s &= "B" 
s &= "C" 

không tối ưu hóa được thực hiện và String nối được thực thi tại thời gian chạy (chi phí hoạt động). Tương tự áp dụng cho một dòng lệnh với dữ liệu được giải quyết tại thời gian chạy (biến, thuộc tính, phương thức).

Sử dụng dấu gạch dưới _ để kết nối báo cáo trên vào một câu lệnh để thực thi tối ưu hóa:

Dim s As String = "A" _ 
& "B" _ 
& "C" _ 

và trong trường hợp bạn cần dòng mới giữa thẻ sử dụng vbCrLf (thời gian biên dịch) liên tục để đảm bảo tối ưu hóa vì sử dụng Environment.NewLine (thời gian chạy) không cung cấp tối ưu hóa.

Hy vọng điều này sẽ giúp bạn có được lợi thế về hiệu suất!

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