Разница между string и StringBuilder в c#



Я хотел бы знать разницу между string и StringBuilder а также нужны некоторые примеры для понимания.

874   13  

13 ответов:

A string экземпляр является неизменным. Вы не можете изменить его после того, как он был создан. Любая операция, которая появляется для изменения строки вместо этого возвращает новый экземпляр:

string foo = "Foo";
// returns a new string instance instead of changing the old one
string bar = foo.Replace('o', 'a');
string baz = foo + "bar"; // ditto here

неизменяемые объекты имеют некоторые хорошие свойства, такие как они могут использоваться в потоках, не опасаясь проблем синхронизации или что вы можете просто раздавать свои частные резервные поля напрямую, не опасаясь, что кто-то меняет объекты, которые они не должны меняться (см. массивы или изменяемые списки, которые часто нужно скопировать, прежде чем возвращать их, если это нежелательно). Но при небрежном использовании они могут создать серьезные проблемы с производительностью (как и почти все – если вам нужен пример из языка, который гордится скоростью выполнения, то посмотрите на функции управления строками C).

когда вам нужно mutable строка, например, та, которую вы строите по частям или где вы меняете много вещей, тогда вам понадобится StringBuilder который является буфером символы, которые можете быть изменен. Это имеет, по большей части, последствия для производительности. Если вы хотите изменяемую строку и вместо этого сделать это с нормальным string экземпляр, то вы будете в конечном итоге с созданием и уничтожением объектов без надобности, в то время как StringBuilder сам экземпляр изменится, отрицая необходимость многих новых объектов.

простой пример: следующее заставит многих программистов съежиться от боли:

string s = string.Empty;
for (i = 0; i < 1000; i++) {
  s += i.ToString() + " ";
}

в конечном итоге вы создадите Здесь 2001 строк, 2000 из которых выброшены. Тот же пример с использованием StringBuilder:

StringBuilder sb = new StringBuilder();
for (i = 0; i < 1000; i++) {
  sb.Append(i);
  sb.Append(' ');
}

это должно значительно уменьшить нагрузку на распределитель памяти: -)

однако следует отметить, что компилятор C# достаточно умен, когда речь заходит о строках. Например, следующая строка

string foo = "abc" + "def" + "efg" + "hij";

будет присоединен компилятором, оставляя только одну строку во время выполнения. Аналогично, такие строки, как

string foo = a + b + c + d + e + f;

будет переписано на

string foo = string.Concat(a, b, c, d, e, f);

так что вам не придется платить за пять бессмысленных конкатенаций, которые были бы наивным способом справиться с этим. Это не спасет вас в циклах, как указано выше (если компилятор не развернет цикл, но я думаю, что только JIT может это сделать, и лучше не делать ставку на это).

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

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

String Vs StringBuilder

  • строка
  1. в системном пространстве имен
  2. неизменяемый (только для чтения) экземпляр
  3. производительность снижается, когда происходит непрерывное изменение значения
  4. потокобезопасным
  • StringBuilder(изменяемая строка)
    1. под системой.Текстовое пространство имен
    2. Мутабельный инстанции
    3. показывает лучшую производительность, так как новые изменения вносятся в существующий экземпляр

    описательная статья по этой теме с большим количеством примеров использования ObjectIDGenerator,следуя этой ссылке

    Связанный С Stackeoverflow Вопрос:изменчивость строки, когда строка не меняется в C#?

    String Экземпляр String является неизменяемым, то есть мы не можем изменить его после его создания. Если мы выполним какую-либо операцию над строкой, она вернет новый экземпляр(создает новый экземпляр в памяти) вместо изменения существующего значения экземпляра.

    StringBuilder StringBuilder является изменяемым, то есть если мы выполним какую-либо операцию над StringBuilder, он обновит существующее значение экземпляра и не создаст новое пример.

    http://www.dotnetlearners.com/blogs/view/180/Difference-between-String-and-StringBuilder.aspx

    StringBuilder поможет вам, когда вам нужно построить строки в несколько шагов.

    вместо этого:

    String x = "";
    x += "first ";
    x += "second ";
    x += "third ";
    

    ты

    StringBuilder sb = new StringBuilder("");
    sb.Append("first ");
    sb.Append("second ");
    sb.Append("third");
    String x = sb.ToString();
    

    конечный эффект тот же, но StringBuilder будет использовать меньше памяти и работать быстрее. Вместо того, чтобы создавать новую строку, которая является конкатенацией двух, она будет создавать куски отдельно, и только в конце она объединит их.

    с документация по классу StringBuilder:

    объект String является неизменяемым. Каждый раз, когда вы используете один из методов в системе.Класс String, вы создаете новый объект string в памяти, который требует нового выделения пространства для этого нового объекта. В ситуациях, когда необходимо выполнить повторные изменения строки, накладные расходы, связанные с созданием нового объекта String, могут быть дорогостоящими. система.Текст.Можно использовать класс StringBuilder когда вы хотите изменить строку без создания нового объекта. Например, использование класса StringBuilder может повысить производительность при объединении нескольких строк в цикле.

    большая разница:

    строка является неизменяемой. Это означает, что вы не можете изменить строку, то результатом модификации является новая строка. Это не эффективно, если вы планируете добавить в строку

    StringBuilder является изменяемым. Он может быть изменен любым образом и не требует создания нового экземпляра. Когда работа выполнена, ToString () может быть вызван, чтобы получить строку.

    строки могут участвовать в интернировании, это означает, что строки с одинаковым содержимым могут иметь те же адреса. StringBuilder не может быть интернирован.

    String-это единственный класс, который может иметь ссылочный литерал.

    строки неизменяемы, т. е. если вы измените его значение, старое значение будет отброшено, а новое значение будет создано в куче, тогда как в String builder мы можем изменить существующее значение без создания нового значения. Таким образом, производительность wise String Builder полезна, поскольку мы напрасно не занимаем больше места в памяти.

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

    экземпляр StringBuilder используется для добавления строк к тому же экземпляру, создавая строку при вызове метода ToString на нем.

    из-за накладных расходов на создание экземпляра объекта StringBuilder он сказал корпорацией Microsoft, что это полезно использовать, когда у вас более 5-10 сцепление.

    пример кода, я предлагаю вам взглянуть здесь:

    http://msdn.microsoft.com/en-us/library/system.string.aspx http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

    http://msdn.microsoft.com/en-us/library/2839d5h5 (VS. 71). aspx

    ГРЗ, Крис.

    Строка (System.String) - это тип, определенный внутри платформы .NET framework. Класс String не является изменяемым. Это означает, что каждый раз, когда вы делаете действие в системе.Экземпляр строки, компилятор .NET создает новый экземпляр строки. Эта операция скрыта от разработчика.

    Система.Текст.StringBuilder-это класс, представляющий изменяемую строку. Этот класс предоставляет некоторые полезные методы, которые позволяют пользователю управлять строкой, обернутой StringBuilder. Заметить это все манипуляции выполняются на одном экземпляре StringBuilder.

    Microsoft поощряет использование StringBuilder причина является более эффективным с точки зрения использования памяти.

    также сложность конкатенаций строки составляет O(N2), а для StringBuffer-O (N). Таким образом, может возникнуть проблема с производительностью, когда мы используем конкатенации в циклах как много новых объектов, создаваемых каждый раз.

    вы можете использовать метод клонирования, если вы хотите перебирать строки вместе со строителем строк.. Его возвращает объект, так что вы можете преобразовать в строку с помощью метода toString...:)

    Comments

      Ничего не найдено.