Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2

Как устроен System.String ?

10.08.2017, 17:24. Показов 6966. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Подскажите что почитать про System.String. Статьи или книги где есть подробное описание.
Конкретно интересует устройство внутреннего буфера, который собственно хранит символы.

Буфер представлен не в виде явного массива или связного списка.
Если смотреть исходный код System.String, можно увидеть поле
private char m_firstChar;
Получить символы System.String можно по адресу этого поля.
Например, копия строки:
C#
1
2
3
4
5
6
7
8
9
string text = string.FastAllocateString(length);
            fixed (char* ptr = &text.m_firstChar)
            {
                fixed (char* ptr2 = &str.m_firstChar)
                {
                    string.wstrcpy(ptr, ptr2, length);
                }
            }
            return text;
Значит, при создании объекта System.String по адресу
поля m_firstChar
пишется массив символов ( или что-то) .
Удивляет, что при этом нет реализации интерфейса IDisposable ...
Как конкретно создаётся строка посмотреть нельзя,
метод string.FastAllocateString(length); написан не на C#.

Что бы почитать в этом направлении?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2017, 17:24
Ответы с готовыми решениями:

Как преобразовать System.DayOfWeek в String?
Нужно узнать день недели и вывести в label на windows form.

Создание TcpChannel: не удалось привести тип объекта "System.Int32" к типу "System.String"
Всем привет! Скажите, пожалуйста, почему такая строчка не работает: TcpChannel channels = new TcpChannel(props, null, new...

Ошибка: Не удалось привести тип объекта "System.Int32" к типу "System.String"
if (Convert.ToInt32(textBox10.Text) > Convert.ToInt32(sqlreader.GetString(0).ToString()) ) Появляется такая ошибка : Не...

14
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
10.08.2017, 17:29
RunningMan, строка - массив символов (16-тибитных слов). Что вам ещё нужно знать?
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
10.08.2017, 17:31  [ТС]
Непонятно как по адресу символа хранится буфер.
Как же сборка мусора и уплотнение памяти?

Простой тестовый пример:
Печатаем адрес символа char ch = '7';
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
   class Test
        {
 
            private char  ch = '7';
             
            public unsafe void PrintPtr()
            {
                fixed (char* p = &this.ch)
                {           
                    Console.WriteLine("address: {0}",new IntPtr(p));
                }
            }
        }
        unsafe class SimpleTest
        {
          
            static void Main(string[] args)
            {
                for (int i = 0; i < 10000000; i++)
                {
                    new Object();
                }
 
                Test test = new Test();
                test.PrintPtr();
                for (int i = 0; i < 10000000; i++)
                {
                    new Object();
                }
                System.GC.Collect();
                test.PrintPtr();
                                               
                Console.ReadKey();
            }
        }


После сборки мусора адрес символа изменился.
Вывод:
address: 46482476
address: 46011628
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
10.08.2017, 17:31
https://referencesource.micros... /string.cs
1
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
10.08.2017, 17:34
Цитата Сообщение от RunningMan Посмотреть сообщение
Непонятно как по адресу символа хранится буфер.
Как же сборка мусора и уплотнение памяти?
Очень просто. Адрес вы получаете только, когда выполняете pinning данных (fixed). В остальное время данные свободно контроллируются сборщиком мусора.
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
10.08.2017, 17:36  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
RunningMan, строка - массив символов (16-тибитных слов). Что вам ещё нужно знать?
хочу знать всё
LeniumSoft, ну так этого уже смотрел и смотреть буду. Но всё равно спасибо.

Добавлено через 32 секунды
Цитата Сообщение от Usaga Посмотреть сообщение
Очень просто.
а вот мне не понятно...
почему сборщик контролирует буфер , а не один только символ.
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
10.08.2017, 17:36
RunningMan, почитайте Рихтера или Саню Гольдштейна.
1
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
10.08.2017, 17:39  [ТС]
Спасибо. Рихтера читал и опять читаю. Пока не понимаю.
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
10.08.2017, 17:40
Лучший ответ Сообщение было отмечено RunningMan как решение

Решение

RunningMan, значит почитайте Гольдштейна. Там всё отлично рассказыватеся\показывается.
1
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
10.08.2017, 17:41  [ТС]
Понял, хорошо. Ищу Гольдштейна.
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
10.08.2017, 17:48
RunningMan, его книги раскупают только в путь. Ну и дорого оно стоит.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
10.08.2017, 18:05
Лучший ответ Сообщение было отмечено RunningMan как решение

Решение

Цитата Сообщение от RunningMan Посмотреть сообщение
Значит, при создании объекта System.String по адресу
поля m_firstChar
пишется массив символов ( или что-то) .
Да. Воспринимай поле char m_firstChar как fixed char chars[Length+1].

Цитата Сообщение от RunningMan Посмотреть сообщение
Непонятно как по адресу символа хранится буфер.
Как же сборка мусора и уплотнение памяти?
Там нет адреса символа. Там сам первый символ, за которым идут остальные. Со сборкой мусора и уплотнением нет никаких проблем. Длина строки и буфер хранятся друг за другом образуя единое целое с точки зрения GC.

Цитата Сообщение от RunningMan Посмотреть сообщение
Удивляет, что при этом нет реализации интерфейса IDisposable
Она не нужна т.к. string не владееет неуправляемыми ресурсами.

Цитата Сообщение от RunningMan Посмотреть сообщение
Простой тестовый пример:
Печатаем адрес символа char ch = '7';
Символ и строка это разные вещи. Тем более что CLR обращается со строками по особенному. Именно поэтому якобы char поле является на самом деле массивов символов.
1
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
10.08.2017, 22:55  [ТС]
Цитата Сообщение от RunningMan Посмотреть сообщение
Простой тестовый пример:
Печатаем адрес символа
Хотел сказать адрес поля.


OwenGlendower ответил на мой вопрос
Цитата Сообщение от RunningMan Посмотреть сообщение
Непонятно как по адресу символа хранится буфер.
Как же сборка мусора и уплотнение памяти?
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Воспринимай поле char m_firstChar как fixed char chars[Length+1].
Разобрался.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
   class Test
        {
            const int SIZE = 256;          
            private char  ch;
            private FixedBufferStruct fixedBufferStruct;
 
 
            unsafe struct FixedBufferStruct
            {           
                public fixed char buffer[SIZE]; 
            }
          
 
            public unsafe Test(string s)
            {
                fixed (char* pch = &this.ch)
                {
                    fixed (char* buffer = fixedBufferStruct.buffer)
                    {
                        Buffer.MemoryCopy(buffer, pch, SIZE, SIZE);
                    }
                }
 
                fixed (char* p = &this.ch)
                {
                    for (int i = 0; i < s.Length; i++)
                    {
                        *(p + i) = s[i];
                    }
 
                }
            }
 
 
            public unsafe override string ToString()
            {
                fixed (char* p = &this.ch)
                {
                    return new string(p);
                }
            }
        }
 
        
            static void Main(string[] args)
            {
                Test test = new Test("Hello World!!!");
                Console.WriteLine(test.ToString());
Вывод:
Hello World!!!
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
11.08.2017, 04:43
RunningMan, никогда так не делайте! Так даже во всяких Си и С++ не принято делать.

Если вы внимательно присмотритесь к исходнику класса String, то увидите там комментарий возле поля m_firtsChar о том, что данное поле непростое. Компилятор (или JIT) знает это поле «в лицо», и позволяет через него работать с внутренним массивом объекта StringObject, который и есть настоящая строка.
1
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
11.08.2017, 05:02  [ТС]
Не-не, это только что я понял примерно как оно устроено
Ничего подобного куда-то в продакшен не пойдет
Извините что не уточнил.

Цитата Сообщение от Usaga Посмотреть сообщение
Компилятор (или JIT) знает это поле «в лицо», и позволяет через него работать с внутренним массивом объекта StringObject, который и есть настоящая строка
Когда-нибудь докапаюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2017, 05:02
Помогаю со студенческими работами здесь

Как устроен BitConverter
Здравствуйте! :) Задался я тут вопросом: как работает BitConverter? Проблема в том, что у меня не сходятся &quot;цифры&quot;. Может...

Как устроен механизм обновления приложений?
Здравствуйте, помогите, пожалуйста, написать 2 программы. 1) Программа, которая обновляется саму себя. Программа должна показывать...

System.Uri -> string
Как System.Uri ппеоброзовать в string? В моём случаи в System.Uri это адрес страници полученый из request.Address;

Не удается преобразовать из "string" в System.Preficate<string>"
Хочу сделать некий &quot;конвертер&quot;, который превращает строку &quot;руддщ&quot; в &quot;hello&quot;, возникла ошибка &quot;не удается преобразовать из string в...

Преобразование System.Array в string[,]
здравствуйте, есть предположим такой код в 1м классеstatic string forreturn = new string; public static Array method1() { forreturn =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru