Hãy thực hiện đoạn mã sau:
string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);
Bây giờ chúng ta hãy đặt một breakpoint ở dòng cuối cùng và mở cửa sổ bộ nhớ:
Viết s3
trong cửa sổ bộ nhớ, chúng ta có thể thấy các đường 2 (s3
và s4
) ing được phân bổ cái khác với 4 byte kích thước lúc đầu.
Ngoài ra, bạn có thể thấy rằng bộ nhớ khác được phân bổ như mã thông báo loại lớp strings
và các dữ liệu lớp khác string
.
Các string
class chính nó chứa một thành viên private int m_stringLength;
chứa chiều dài của string
, điều này cũng làm cho string.Concat()
thực hiện siêu nhanh (bằng cách phân bổ toàn bộ chiều dài ngay từ đầu):
int totalLength = str0.Length + str1.Length + str2.Length;
String result = FastAllocateString(totalLength);
FillStringChecked(result, 0, str0);
FillStringChecked(result, str0.Length, str1);
FillStringChecked(result, str0.Length + str1.Length, str2);
Những gì tôi tìm thấy một chút lạ là việc triển khai IEnumerable<char>.Count()
cho string
được thực hiện bằng cách thực hiện mặc định có nghĩa là lặp lại từng mục một không giống như ICollection<T>
s như List<T>
trong đó IEnumerable<char>.Count()
được thực hiện bằng cách lấy thuộc tính ICollection<T>.Count
.
Nguồn
2015-10-04 18:22:19
Giả định C của bạn sai. Trình biên dịch C biết ** chính xác ** mỗi chuỗi là bao lâu. Để thấy điều này, hãy gọi 'sizeof' trên chuỗi (không phải trên _pointer đến_ chuỗi!). – MSalters
Thông thường, tôi sẽ đóng tài khoản này làm bản dupe nhưng các bản sao bị lỗi. http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr
@MSalters Bạn là những khái niệm khó hiểu. Mảng và chuỗi các thực thể khác nhau và chúng có các hoạt động khác nhau liên kết với chúng. Chúng có liên quan, nhưng chúng là những trừu tượng khác nhau và chúng không nên trộn lẫn. –