Базовая реализация System.String - PullRequest
5 голосов
/ 09 августа 2011

Я недавно пытался сделать следующее в c #

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

И это не сработает, потому что, очевидно, str [i] является только get, а не множеством, поэтому мне было интересно, что за базовая реализация string заставит str [i] быть только get.

Разве это не просто управляемая оболочка для символа *? Так почему же я не могу установить str [i]?

Ответы [ 3 ]

8 голосов
/ 09 августа 2011

Вы не можете установить символы строки, потому что класс .NET String равен неизменяем - это означает, что его содержимое не может быть изменено после его создания. Это позволяет безопасно и многократно использовать один и тот же экземпляр строки, при этом один объект не будет беспокоиться о том, что другой объект помешает его строкам.

Если вам нужен изменяемый класс, который позволяет вам манипулировать строкой символов, рассмотрите возможность использования StringBuilder.

Если вы хотите сравнить с C, тип String похож на const char *, за исключением того, что вы не можете просто выбросить константу. StringBuilder больше похож на char * (с автоматическим изменением размера выделения) и с методом (ToString()) для создания нового, независимого String экземпляра из его содержимого.

5 голосов
/ 09 августа 2011

Ответы других, касающиеся неизменяемости, конечно же, правильны и являются «фактической» причиной проблемы, с которой вы столкнулись.

Поскольку вы специально задали вопрос об основополагающей реализации (и, может быть, просто из любопытства),и в качестве ссылки на других, которые могут наткнуться на этот вопрос, вот еще некоторая информация на эту тему из Эрика Липперта :

". В .NET CLR заложены строкив памяти почти так же, как BSTR были реализованы в OLE Automation: как буфер памяти с выравниванием по словам, состоящий из четырехбайтового целого числа, задающего длину строки, за которым следуют символы строки в двухбайтовых кускахДанные UTF-16, за которыми следуют два нулевых байта. "

Обратите внимание на" довольно большую часть "здесь, однако сами BSTR также объясняются в блоге Эрика .

Имейте в виду, что все это должно рассматриваться как деталь реализации.И хотя это не должно волновать большинство из нас, оно может помочь при устранении проблем взаимодействия или в общем понимании.

2 голосов
/ 09 августа 2011

Как ответил cdhowie, это не то же самое, что концепция строки в c / c ++

Если вы хотите использовать вышеизложенное, в качестве предложения вы можете попытаться имитировать реализацию через контейнер, такой какниже

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