Почему.NET создает новые подстроки вместо того, чтобы указать в существующие строки?

Вы также можете вывести свой файл в формате xdot, а затем отобразить его в браузере, используя canviz, библиотеку JavaScript.

Canviz на code.google.com :

Чтобы увидеть пример, на странице выше есть ссылка «Canviz Demo» по состоянию на 2 ноября 2014 года.

8
задан GEOCHET 6 July 2009 в 03:37
поделиться

5 ответов

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

Что произойдет, если строка используется для его подстрока, но тогда большая строка становится недоступной (кроме как через подстроку). Большую строку невозможно будет собрать, потому что это сделает подстроку недействительной. То, что казалось хорошим способом сэкономить память в краткосрочной перспективе, в долгосрочной перспективе превращается в утечку памяти.

24
ответ дан 3 November 2019 в 14:20
поделиться

Каждая строка должна иметь свои собственные строковые данные в соответствии со способом реализации класса String.

Вы можете создать свою собственную структуру SubString, которая использует часть строки:

public struct SubString {

   private string _str;
   private int _offset, _len;

   public SubString(string str, int offset, int len) {
      _str = str;
      _offset = offset;
      _len = len;
   }

   public int Length { get { return _len; } }

   public char this[int index] {
      get {
         if (index < 0 || index > len) throw new IndexOutOfRangeException();
         return _str[_offset + index];
      }
   }

   public void WriteToStringBuilder(StringBuilder s) {
      s.Write(_str, _offset, _len);
   }

   public override string ToString() {
      return _str.Substring(_offset, _len);
   }

}

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

1
ответ дан 3 November 2019 в 14:20
поделиться

Невозможно без поиска внутри .net с использованием классов String. Вам придется передавать ссылки на изменяемый массив и следить за тем, чтобы никто не облажался.

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

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

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

2
ответ дан 3 November 2019 в 14:20
поделиться

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

String s1 = "Hello", s2 = ", ", s3 = "World!";
String res = s1 + s2 + s3;

s1 + s2 => новый экземпляр строки (temp1)

temp1 + s3 => новый экземпляр строки (temp2)

res является ссылкой на temp2. ​​

0
ответ дан 3 November 2019 в 14:20
поделиться

Поскольку строки неизменяемы в .NET, каждый строковая операция, которая приводит к созданию нового строкового объекта, будет выделять новый блок памяти для содержимого строки.

Теоретически можно было бы повторно использовать память при извлечении подстроки, но это сильно усложнило бы сборку мусора: что если исходная строка собирается сборщиком мусора? Что произойдет с подстрокой, которая разделяет ее часть?

Конечно, ничто не мешает команде .NET BCL изменить это поведение в будущих версиях .NET. Это не повлияет на существующий код.

0
ответ дан 3 November 2019 в 14:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: