Różnica między string i StringBuilder w c#

Chciałbym poznać różnicę między string i StringBuilder, a także potrzebuję przykładów do zrozumienia.

Author: S.L. Barth, 2010-06-18

13 answers

Instancja string jest niezmienna. Nie można go zmienić po jego utworzeniu. Każda operacja, która wydaje się zmieniać ciąg znaków, zwraca nową instancję:

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

Obiekty niezmienne mają kilka ładnych właściwości, na przykład mogą być używane w wątkach bez obaw o problemy z synchronizacją lub po prostu możesz przekazać swoje prywatne pola zapasowe bezpośrednio bez obawy, że ktoś zmieni obiekty, których nie powinien zmieniać (patrz tablice lub listy mutowalne, które często muszą być zmieniane). być skopiowane przed ich zwróceniem, jeśli nie jest to pożądane). Ale gdy są używane niedbale, mogą powodować poważne problemy z wydajnością (jak prawie wszystko – jeśli potrzebujesz przykładu z języka, który szczyci się szybkością wykonania, spójrz na funkcje manipulacji łańcuchami w C).

Gdy potrzebujesz mutowalnego ciągu znaków, takiego jak ten, który tworzysz, lub w którym zmieniasz wiele rzeczy, będziesz potrzebować StringBuilder, który jest buforem znaków, które mogą być zmieniony. Ma to w przeważającej części wpływ na wydajność. Jeśli chcesz mieć zmienny ciąg znaków i zamiast tego zrobić to z normalną instancją string, skończysz niepotrzebnie tworząc i niszcząc wiele obiektów, podczas gdy sama instancja StringBuilder ulegnie zmianie, negując potrzebę tworzenia wielu nowych obiektów.

Prosty przykład: poniższy przykład sprawi, że wielu programistów będzie się marszczyć z bólu:

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

W końcu stworzysz tu 2001 ciągów, z których 2000 zostanie wyrzuconych. To samo przykład użycia StringBuilder:

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

Powinno to znacznie zmniejszyć nacisk na alokator pamięci: -)

Należy jednak zauważyć, że kompilator C# jest dość inteligentny, jeśli chodzi o ciągi. Na przykład, następujący wiersz

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

Zostanie dołączony przez kompilator, pozostawiając tylko jeden ciąg znaków w czasie wykonywania. Podobnie linie takie jak

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

Zostanie przepisane na

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

Więc nie musisz płacić za pięć bezsensownych konkatenacji, które to byłby naiwny sposób radzenia sobie z tym. To nie zapisuje cię w pętlach jak wyżej (chyba, że kompilator rozwinie pętlę, ale myślę, że tylko JIT może to zrobić i lepiej nie stawiaj na to).

 89
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 12:06:49

String jest niezmienny, co oznacza, że gdy tworzysz ciąg znaków, nigdy nie możesz go zmienić, raczej utworzy nowy ciąg znaków do przechowywania nowej wartości, może to być nieefektywne, jeśli musisz często zmieniać wartość zmiennej łańcuchowej.

Stringbuilder może być używany do symulacji zmiennego ciągu, więc jest dobry, gdy trzeba często zmieniać ciąg.

 6
Author: Hans Olsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-18 12:14:02

String Vs StringBuilder

  • String
  1. w przestrzeni nazw systemu
  2. instancja Immutable(readonly)
  3. wydajność ulega degradacji przy ciągłej zmianie wartości
  4. thread safe
  • StringBuilder (ciąg zmienny)
    1. w systemie.Przestrzeń nazw tekstu
    2. mutable instance
    3. pokazuje lepszą wydajność, ponieważ nowe zmiany są wprowadzane do istniejącej instancji

    Opisowy artykuł o ten temat z wieloma przykładami wykorzystującymi ObjectIDGenerator , follow this link

    Powiązane pytanie Stackeoverflow: zmienność ciągu gdy ciąg nie zmienia się w C#?

     6
    Author: Shamseer K,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2018-08-12 03:34:12

    String Instancja String jest niezmienna, czyli nie możemy jej zmienić po jej utworzeniu. Jeśli wykonamy jakąkolwiek operację na łańcuchu, zwróci ona nową instancję (utworzy nową instancję w pamięci) zamiast zmodyfikować istniejącą wartość instancji.

    StringBuilder StringBuilder jest zmienny, to znaczy, że jeśli wykonamy jakąkolwiek operację na Stringbuilderze, zaktualizuje ona istniejącą wartość instancji i nie utworzy nowej przykład.

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

     3
    Author: Ram,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2015-11-06 14:02:56

    StringBuilder pomoże Ci, gdy musisz zbudować ciągi w wielu krokach.

    Zamiast tego:

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

    Robisz

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

    Efekt końcowy jest taki sam, ale StringBuilder będzie zużywał mniej pamięci i działał szybciej. Zamiast tworzyć nowy ciąg, który jest połączeniem tych dwóch, utworzy on kawałki oddzielnie i dopiero na końcu połączy je.

     2
    Author: Palantir,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 12:13:41

    Z dokumentacji klasy StringBuilder :

    Obiekt String jest niezmienny. Za każdym razem, gdy używasz jednej z metod w systemie.Klasa String, tworzy się nowy obiekt string w pamięci, który wymaga nowego przydziału miejsca dla tego nowego obiektu. W sytuacjach, gdy trzeba wykonać powtarzające się modyfikacje ciągu znaków, narzut związany z tworzeniem nowego obiektu String może być kosztowny. System.Tekst.Klasa StringBuilder może być używana, gdy chcesz Modyfikuj łańcuch znaków bez tworzenia nowego obiektu. Na przykład, użycie klasy StringBuilder może zwiększyć wydajność podczas łączenia wielu łańcuchów w pętlę.

     2
    Author: Bill the Lizard,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 12:14:08

    Główna różnica:

    String jest niezmienny. Oznacza to, że nie można w ogóle modyfikować ciągu, wynikiem Modyfikacji Jest nowy ciąg. To nie jest skuteczne, jeśli planujesz dołączyć do string

    StringBuilder jest zmienny. Może być modyfikowany w dowolny sposób i nie wymaga tworzenia nowej instancji. Po zakończeniu pracy można wywołać metodę ToString (), aby uzyskać ciąg znaków.

    Ciągi mogą uczestniczyć w internowaniu, to znaczy, że ciągi o tej samej zawartości mogą mieć te same adresy. StringBuilder nie może zostać internowany.

    String jest jedyną klasą, która może mieć literał odniesienia.

     1
    Author: Andrey,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 12:16:35

    Ciągi są niezmienne tzn. jeśli zmienisz jego wartość, Stara wartość zostanie odrzucona i nowa wartość zostanie utworzona na stercie, podczas gdy w string builderze możemy zmodyfikować istniejącą wartość bez tworzenia nowej wartości. Tak więc wydajność wise String Builder jest korzystne, ponieważ niepotrzebnie nie zajmujemy więcej miejsca w pamięci.

     1
    Author: Nitin Nayyar,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2015-01-01 18:24:42

    Łańcuch jest typem niezmiennym. Oznacza to, że za każdym razem, gdy zaczynasz łączyć ze sobą ciągi, za każdym razem tworzysz nowe ciągi. Jeśli robisz tak wiele razy, kończysz z dużą ilością nad głową i ryzykiem wyczerpania pamięci.

    Instancja StringBuilder jest używana do dodawania łańcuchów do tej samej instancji, tworząc łańcuch po wywołaniu metody ToString.

    Ze względu na narzut tworzenia instancji obiektu StringBuilder mówi Microsoft że jest to przydatne, gdy masz więcej niż 5-10 ciągów konkatenacji.

    Dla przykładowego kodu proponuję zajrzeć tutaj:

    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

    Grz, Kris.

     0
    Author: Kris van der Mast,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 12:16:08

    A String (System.String) jest typem zdefiniowanym wewnątrz. NET framework. Klasa String nie jest zmienna. Oznacza to, że za każdym razem, gdy robisz działanie do systemu.String instance, kompilator. NET tworzy nową instancję string. Operacja ta jest ukryta dla dewelopera.

    System.Tekst.StringBuilder jest klasą reprezentującą zmienny łańcuch znaków. Ta klasa zapewnia kilka użytecznych metod, które sprawiają, że użytkownik jest w stanie zarządzać ciągiem owiniętym przez StringBuilder. Zauważ, że wszystkie manipulacja odbywa się na tej samej instancji StringBuilder.

    Microsoft zachęca do korzystania z StringBuilder przyczyna jest bardziej efektywna pod względem wykorzystania pamięci.

     0
    Author: AngeloBad,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 12:19:41

    Również złożoność konkatenacji ciągu jest O(N2), podczas gdy dla StringBuffer jest O (N). Więc może wystąpić problem z wydajnością, gdy używamy konkatenacji w pętlach jako wielu nowych obiektów tworzonych za każdym razem.

     0
    Author: Vinay Lodha,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-06-18 13:05:25

    Możesz użyć metody klonowania, jeśli chcesz iterować poprzez ciągi wraz z konstruktorem łańcuchów.. Its zwraca obiekt, dzięki czemu można przekonwertować go na string za pomocą metody ToString...:)

     0
    Author: user2440156,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2013-07-12 04:38:50

    System. String is Mutable object mean cannot modified after it ' s created, please refer the below URL for better understand

    Http://developer-insight.blogspot.com/2017/04/different-between-system.html

     0
    Author: Amila Munasinghe,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-04-19 08:24:22