2009-02-10 39 views
5

Giúp tôi giải quyết một cuộc tranh luận ở đây.C# - Đây có phải là chuỗi được khai báo được coi là một const không?

Đây có phải là:

SqlCommand cmd = new SqlCommand("sql cmd", conn); 

đối xử giống hệt nhau như thế này:

const string s = "sql cmd"; 
SqlCommand cmd = new SqlCommand(s, conn); 

Ie. nó có tạo sự khác biệt không nếu tôi nói rõ ràng rằng chuỗi s là một const.

Và, nếu nó không được xử lý theo cùng một cách, tại sao không?

+0

Tại sao bạn tạo một cộng đồng wiki này? – GEOCHET

+0

Có lỗi - Tôi không biết CW là gì. –

Trả lời

6

Trong đoạn mã sau, không phải là chuỗi là const - đó là biến số là const. Điều này không hoàn toàn giống với const trong C++. (Các chuỗi là luôn là không thay đổi trong .NET.)

Và vâng, hai đoạn mã cũng thực hiện tương tự. Điểm khác biệt duy nhất là ở dạng đầu tiên bạn cũng sẽ có một mục siêu dữ liệu cho s và nếu biến được khai báo ở cấp loại (thay vì là biến cục bộ) thì các phương thức khác cũng có thể sử dụng nó. Tất nhiên, do chuỗi thực tập nếu bạn sử dụng "sql cmd" ở nơi khác, bạn sẽ vẫn chỉ có một chuỗi đối tượng trong bộ nhớ ... nhưng nếu bạn nhìn vào loại có phản ánh, bạn sẽ thấy const là một trường trong siêu dữ liệu với đoạn thứ hai nếu nó được khai báo là một trường không đổi và nếu đó chỉ là một biến cục bộ, nó sẽ nằm trong tệp PDB nếu bạn tạo một tệp.

1

hàm tạo của SqlCommand sẽ không "thấy" bất kỳ sự khác biệt nào và do đó sẽ hoạt động theo cùng một cách.

1

Có, chúng giống hệt nhau.

0

Tôi không chắc chắn 100% về điều này, nhưng tôi đặt cược là như nhau.

const sẽ chỉ đảm bảo bạn không đánh giá lại biến, nhưng đó là điều có thể thực hiện tại thời gian biên dịch.

Morover, string là inmutable, vì vậy tôi không nghĩ rằng nó sẽ làm cho bất kỳ sự khác biệt tuyên bố biến hay không.

Tuy nhiên, chứng minh xác định sẽ được nghiên cứu mã IL được tạo trong cả hai trường hợp.

+0

Điều đó nghe có vẻ giống như bạn đang mô tả 'readonly' -' const' nhiều hơn (giá trị được sao chép ** trực tiếp ** bởi người gọi - nó không phải là "Ldfld"/"Ldsfld". –

+0

Xin lỗi nhưng tôi không 't hiểu bạn hoàn toàn.Ý của bạn là gì khi bạn nói "giá trị được sao chép ** trực tiếp ** bởi người gọi"? Từ MSDN: trường const là hằng số biên dịch http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx – rgargente

2

Giá trị của const luôn được ghi trực tiếp vào người gọi, do đó, có chúng giống hệt nhau.

Ngoài ra, trình biên dịch thực hiện chuỗi được tìm thấy trong mã nguồn - một const là hữu ích nếu bạn đang sử dụng cùng một chuỗi nhiều lần (hoàn toàn từ một góc bảo trì - kết quả là cùng một trong hai cách).

1

Có, vui lòng sử dụng Reflector để xem cụm, chuỗi const sẽ được thay thế bằng các chuỗi ký tự trên biên dịch. Tôi cũng có một số blog post về việc này để đảm bảo an toàn cho bạn khi sử dụng Reflector :)

+0

Tất cả chuỗi ký tự sẽ được thực hiện bởi CLR hiện tại. Nó không liên quan gì đến const, chỉ ảnh hưởng đến biến không phải là cá thể chuỗi (nhưng các chuỗi không thay đổi trong .NET). –

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