Для большинства целей «строка» - это (используется / рассматривается как / считается / считается) значимая атомная единица, , как и число .
Спросить, почему отдельные символы строки не являются изменяемыми, это все равно, что спросить, почему отдельные биты целого числа не являются изменяемыми.
Ты должен знать почему. Просто подумай об этом.
Мне неприятно это говорить, но, к сожалению, мы обсуждаем это, потому что наш язык отстой, и мы пытаемся использовать одно слово, string , для описания комплекса , контекстно расположенная концепция или класс объекта.
Мы выполняем вычисления и сравнения с «строками», аналогично тому, как мы делаем с числами. Если бы строки (или целые числа) были изменяемыми, нам пришлось бы написать специальный код, чтобы зафиксировать их значения в неизменяемых локальных формах для надежного выполнения любого вида вычислений. Поэтому лучше думать о строке как о числовом идентификаторе, но вместо длины в 16, 32 или 64 бита она может быть длиной в сотни бит.
Когда кто-то говорит «струна», мы все думаем о разных вещах. Те, кто думает об этом просто как о наборе персонажей, не имея особой цели, конечно же, будут потрясены тем, что кто-то только что решил , что он не сможет манипулировать этими персонажами. Но класс "string" - это не просто массив символов. Это STRING
, а не char[]
. Существуют некоторые основные предположения о концепции, которую мы называем «строкой», и ее обычно можно описать как значимую атомарную единицу кодированных данных, например число. Когда люди говорят о «манипулировании строками», возможно, они действительно говорят о манипулировании символами для создания строк , и StringBuilder отлично подходит для этого. Подумайте немного о том, что на самом деле означает слово «строка».
Подумайте на мгновение, что было бы, если бы строки были изменяемыми. Следующая функция API может быть обманута для возврата информации для другого пользователя, если строка имени пользователя mutable преднамеренно или непреднамеренно изменена другим потоком, когда эта функция использует ее:
string GetPersonalInfo( string username, string password )
{
string stored_password = DBQuery.GetPasswordFor( username );
if (password == stored_password)
{
//another thread modifies the mutable 'username' string
return DBQuery.GetPersonalInfoFor( username );
}
}
Безопасность - это не только «контроль доступа», но и «безопасность» и «обеспечение правильности». Если метод не может быть легко написан и зависит от надежного выполнения простого вычисления или сравнения, тогда его небезопасно вызывать, но было бы безопасно подвергать сомнению сам язык программирования.