2009-11-05 33 views
6

Trình biên dịch có tối ưu hóa các chuỗi được định dạng đẹp hay mã đó chạy chậm hơn các chuỗi không được chia theo một cách dễ đọc?Định dạng sql khá trong mã .NET, hiệu năng?

ví dụ

string sql = 
    "select * " + 
    "from person " + 
    "where id = :id"; 

hoặc

string sql = "select * from person where id = :id"; 

Đây chỉ là một ví dụ nhỏ. Bạn biết làm thế nào phức tạp sql có thể nhận được.

+3

Trình biên dịch chắc chắn sẽ tối ưu hóa chuỗi khi bạn biên dịch chương trình sao cho nó sẽ bằng nhau trong mã được thi hành. – Lazarus

+2

Tại sao bạn gửi câu trả lời dưới dạng nhận xét? –

+0

Có thể trùng lặp: http://stackoverflow.com/questions/627643/sql-formatting-tool –

Trả lời

13

Chỉ cần sử dụng: -

string sql = 
    @"select * 
    from person 
    where id = :id"; 

Đây là từ quan điểm trình biên dịch của quan điểm giống với giải pháp dòng đơn. Mặc dù tôi sẽ không ngạc nhiên khi thấy các chuỗi ký tự được tối ưu hóa bởi trình biên dịch. Tuy nhiên, dấu hiệu chung với phương pháp ghép nối là quên bao gồm khoảng trắng ở cuối chuỗi.

+1

Mẹo hay về việc sử dụng "@". Tôi đã sử dụng dấu và cho nhiều "chuỗi khác" khác, nhưng không bao giờ biết rằng nó làm việc cho các công cụ đa dòng! – kaze

+1

Hãy lưu ý rằng với cú pháp "@" như được hiển thị, bạn sẽ kết thúc bằng một chuỗi khác với trong chuỗi gốc: Trả về dòng, các dòng dữ liệu và khoảng trắng thừa sẽ được bao gồm. Vì vậy, chuỗi của bạn sẽ là "chọn * \ r \ n từ người \ r \ n trong đó id =: id". Trong trường hợp này không quan trọng lắm, nhưng trong một số trường hợp, sự khác biệt là quan trọng. –

+0

StackOverflow đã xóa khoảng trống thừa khỏi nhận xét trước của tôi. Sẽ có năm dấu cách sau mỗi "\ r \ n". –

7

Bạn có thể sử dụng

string s = @"SELECT * 
FROM person 
WHERE id = :id"; 
+0

+1 để cho phép chuỗi "dính" ở bên trái thay vì thụt dòng tiếp theo. – Kleinux

6

hằng chuỗi được gấp tại thời gian biên dịch nên hai đoạn mã trên là cơ bản giống hệt nhau.

Cho dù đó là một ý tưởng tốt để có chuỗi nội tuyến SQL là một vấn đề hoàn toàn khác ...

+0

True, trong trường hợp của tôi, mặc dù tôi thường không có choise nhưng để sử dụng SQL nội tuyến, vì vậy tôi chỉ muốn làm tốt nhất của tình hình. – kaze

+0

+1 cho "gấp" – Dan

6

Ah - một trong những verities vĩnh cửu của C#. Mà là tốt hơn, mã mà nối chuỗi bằng cách sử dụng + hoặc mã không? Trong trường hợp của bạn, câu trả lời phụ thuộc vào phiên bản .NET bạn đang sử dụng .NET1 chỉ có thể tối ưu hóa chuỗi + trong một câu lệnh duy nhất cho đến nay. Quá nhiều + trong một chuỗi duy nhất dẫn đến hiệu suất kém hơn vì trình biên dịch phải dùng đến việc tạo các cá thể chuỗi mới để đối phó với các phần chuỗi bổ sung. Từ .NET 2, kiến ​​trúc thay đổi một chút, và nhiều câu lệnh được nối liền mạch hoàn toàn bởi trình biên dịch.

+2

Cảm ơn bạn đã downvote - bất cứ ai đã làm nó. Xin giải thích tại sao bạn nghĩ câu trả lời này là sai nên mọi người có thể học hỏi từ nó. –

10

Bạn có thể kiểm tra điều này với một chương trình đơn giản:

Console.WriteLine("a" + "b"); 

Sử dụng reflector, bạn có thể dễ dàng tháo rời nhị phân kết quả. Ở chế độ Phát hành, IL này tạo ra là:

L_0000: ldstr "ab" 
L_0005: call void [mscorlib]System.Console::WriteLine(string) 

Vì vậy, .NET tối ưu hóa "chuỗi định dạng đẹp".

+0

Câu trả lời hay :) –

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