2011-08-09 28 views
5

Gần đây tôi đã cố gắng để làm như sau trong C#System.String cơ bản thực hiện

string str = "u r awesome"; 
str[0]="i"; 

Và nó sẽ không làm việc bởi vì rõ ràng là str [i] chỉ là một có được không phải là một bộ, vì vậy tôi đã tự hỏi những gì việc thực hiện cơ bản của chuỗi là sẽ buộc str [i] chỉ là một get.

Nó không chỉ là một trình bao bọc được quản lý cho một char *? Vậy tại sao tôi không thể đặt str [i]?

Trả lời

3

Các câu trả lời mà những người khác đã đưa ra liên quan đến tính không thay đổi đều đúng và là nguyên nhân "thực sự" của sự cố bạn gặp phải.

Vì bạn đặc biệt yêu cầu về việc thực hiện cơ bản (và nếu chỉ vì tò mò), và như là một tài liệu tham khảo cho những người khác mà có thể vấp ngã khi câu hỏi này, đây là một số thông tin về chủ đề đó từ Eric Lippert:

"Trong .NET CLR, các chuỗi được đặt trong bộ nhớ khá giống nhau cách BSTR được triển khai trong Tự động hóa OLE: như bộ đệm bộ nhớ từ liên quan bao gồm số nguyên bốn byte cho độ dài chuỗi , theo sau là các ký tự của chuỗi trong các đoạn hai byte của dữ liệu UTF-16, theo sau là hai byte không. "

Lưu ý phần "khá nhiều" ở đây, tuy nhiên bản thân BSTR cũng được giải thích trong Eric's blog.

Hãy nhớ rằng tất cả điều này phải được xem là chi tiết triển khai. Và mặc dù nó không thực sự quan tâm đến hầu hết chúng ta, nó có thể giúp mặc dù trong quá trình gỡ lỗi các vấn đề interop hoặc trong sự hiểu biết chung.

+0

Đây thực sự là câu trả lời tôi đang tìm kiếm, đặc biệt về cách chuỗi được triển khai, cảm ơn! – etk1220

8

Bạn không thể đặt ký tự của chuỗi vì lớp .NET Stringkhông thay đổi - điều đó có nghĩa là nội dung của nó không thể thay đổi sau khi được tạo. Điều này cho phép cùng một cá thể chuỗi được sử dụng nhiều lần một cách an toàn, mà không có một đối tượng nào đáng lo ngại rằng một đối tượng khác sẽ dẫm lên các chuỗi của nó.

Nếu bạn cần một lớp có thể thay đổi cho phép bạn thao tác chuỗi ký tự, hãy cân nhắc sử dụng StringBuilder để thay thế.

Nếu bạn muốn so sánh với C, loại String giống như const char * ngoại trừ việc bạn không thể bỏ đi chòm sao. StringBuilder giống như một số char * (với thay đổi kích thước phân bổ tự động) và với một phương thức (ToString()) để tạo một cá thể String độc lập mới từ nội dung của nó.

+0

Liên quan: Chi tiết về nội dung StringBuilder http://stackoverflow.com/q/3564906/38206 –

2

Giống như trả lời bằng cách cdhowie, nó không giống với khái niệm chuỗi trong c/C++

Nếu bạn muốn đến ở trên, như một gợi ý bạn có thể thử để bắt chước thực hiện thông qua các container như dưới đây

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

Sẽ tốt hơn nếu sử dụng 'StringBuilder' cho mục đích cụ thể này, vì mục đích cụ thể của nó là cho phép tạo chuỗi. – cdhowie

+1

hoàn toàn đồng ý. đề xuất mã thực sự chỉ là cố gắng để chỉ ra cách etk trên một triển khai thay thế nếu anh ta thực sự muốn thao tác các phần tử theo chỉ mục. –

+3

'StringBuilder' có [một người lập chỉ mục] (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx) cho phép chính xác điều đó. :) – cdhowie

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