1. C# / Говнокод #17252

    +94

    1. 1
    2. 2
    3. 3
    4. 4
    public static string ToNew(this String source)
    {
        return new string(source.ToCharArray());
    }

    Запостил: pushistayapodmyshka, 04 Декабря 2014

    Комментарии (24) RSS

    • ...Но зачем?
      Ответить
      • Зачем - чтобы строка перестала расшариваться (к примеру ее получили сабстрингом из огромной строки). Зачем именно так - да хуй знает, автору лень было погуглить...
        Ответить
        • Ой, это ж шарп, а не жаба... Или в шарпе строки тоже иммутабельны и расшариваются?
          Ответить
          • в дотнете вроде не шарятся

            Небось с жабы человек перешёл, а разбираться в новой платформе лень. Ведь все говорят, что если выучил один "ООП езык", знаешь и все остальные.
            Ответить
            • вообще, его как бы по ссылке явно надо передавать, чтобы он шарился.
              http://ideone.com/bq5rYj
              а вообще, есть string.Copy(mystring), которая возвращает копию строки.
              Ответить
              • Речь не об этом.
                Строки в жабе (да и много ещё где) иммутабельны. Когда нужно взять подстроку, можно просто вычислять смещения, а копирования памяти не делать. Это и есть шаринг.

                Это всё круто, но если загрузить в память файл на пару метров и выдернуть из него подстроку размером в 10 символов, в памяти всё равно будет сидеть весь файл. Поэтому копировать память при вычислении подстрок (т.е. без шаринга) иногда предпочтительнее.

                В жабе раньше применялся шаринг, с какой-то версии семёрки его вроде отключили. В дотнете вроде вообще никогда не применялся.
                Ответить
                • Кстати на этот счет, компилятор c# делает String.Intern, при включенной оптимизации точно, чтобы избежать повторных выделений памяти под строки, которые уже заинтернены.
                  http://msdn.microsoft.com/ru-ru/library/system.string.intern(v=vs.110).aspx
                  Ответить
                  • Он хотя бы слабые ссылки на интернированные строки хранит?
                    UPD: пролистал доку. Похоже, что ссылки всё-же жёсткие. Не айс.
                    Ответить
                    • Они там пишут следующее:
                      Во первых, выделяемая для интернированных объектов String память едва ли освободится до завершения работы среды CLR. Дело в том, что [color=black]ссылка на интернированный объект String, которую хранит CLR, может сохраняться и после завершения работы приложения и даже домена приложения[/color]. Во-вторых, для интернирования строки ее сначала нужно создать. Используемая объектом String память должна быть вначале выделена, не смотря на то, что [color=black]она подлежит освобождению сборщиком мусора[/color].
                      На самом деле да) караул
                      Ответить
                      • Т.е. в цикле создавая строки в духе "aaaaaaaa", "aaaaaaab" и т.д. и сразу же освобождая их можно засрать пул для интернированных строк и устроить краш? Да ну нафиг, не верю, что M$ могло такую херню написать...

                        Может всё же интернируются только литералы?
                        Ответить
                        • >их можно засрать пул для интернированных строк и устроить краш?
                          В жабе(6) можно было, пока они в пермгене хранились...
                          PermGen = permanent generation с фиксированным размером. Ну со всеми вытекающими.
                          Ответить
                        • string asdsad = "a0";
                          
                                      for (int i = 0; i < 10; i++)
                                      {
                                          string a = "a" + (i).ToString();
                                      }
                          
                                      for (int i = 0; i < 10; i++)
                                      {
                                          string s = String.IsInterned("a" + (i).ToString());
                          
                                          if (string.IsNullOrEmpty(s))
                                              Console.WriteLine("a" + (i).ToString() + " Is Not Interned");
                                          else
                                              Console.WriteLine("a" + (i).ToString() + " Is Interned");
                                      }


                          a0 интернится, остальное нет, так что засрать пул не получится)
                          Ответить
                        • Интернируются литералы и те строки, для которых явно в процессе работы вызван String.Intern. И ещё пустая строка, даже если её создавать через new.
                          Ответить
                • не совсем понимаю, каким образом строки копируются.
                  вообще, если честно, я плохо разбираюсь в неуправляемом коде, но если я все правильно понял, то string.Substring использует неуправляемый код, и работает напрямую с указателем, фиксируя его на момент работы с ним от сборщика мусора
                  http://referencesource.microsoft.com/#mscorlib/system/string.cs,1277
                  Ответить
                  • Там наверху объявлен интересный символ условной компиляции, точнее проверка на то, был ли он объявлен:
                    #if GENERICS_WORK
                    Ответить
                • >В жабе раньше применялся шаринг, с какой-то версии семёрки его вроде отключили.
                  Кмк зря. Раньше у кого руки прямые наслаждались O(1), а при необходимости копировали в новый String. А теперь принудительно O(N) и ничего не поделаешь.
                  Ответить
          • > Ой, это ж шарп, а не жаба...

            Начиная с Java 7, substring создаёт копию диапазона массива, соответственно, в String хранится только указатель на массив безо всяких start/length.
            Ответить
          • Иммутабельны.

            Зачем кто-то в джаве может хотеть чтоб строки не шарились?? Он пишет универсальный кучезасиральщик?
            Ответить
      • Если там где-нибудь unsafe, то строки не такие уж и неизменяемые...
        Ответить
    • а в чем разница в String и string?
      Ответить
      • Класс и ключевое слово. А суть одна, разницы нет.
        Ответить
      • http://msdn.microsoft.com/ru-ru/library/362314fe.aspx в первой строке все сказано.
        Ответить
      • string это c# сахар для .NET класса System.String или как там его. В опколдах (IL) никаких string нет
        Ответить

    Добавить комментарий