zequion Ответов: 4

Оптимизация строки.операции длины в исходном коде C# и системы


Я делаю стандартные функции, которые проверяют длину переменных. Эти функции вызывают другие функции, которые также проверяют длину переменных.

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

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

Имея код:
// SAMPLE 1.
try
{ string Text = "123";
  for (int index = 0; index < 999; index++)
  { // Error in Mychar[3]. HResult = -2146233080  ErrorExcp = {"Index outside the matrix limits."}
    char Mychar = Text[index];
  }
}catch (System.Exception ErrorExcp){}

// SAMPLE 2.
try
{ System.Text.StringBuilder Text_Builder = new System.Text.StringBuilder("123");
  Text_Builder[0] = 'A';
  // Error. HResult = -2146233086 ErrorExcp = {"The index was out of range. It must be a non-negative value and less than the size of the collection.\r\nNombre del parámetro: index"}
  Text_Builder[3] = 'A';
}catch (System.Exception ErrorExcp){}


Вопросы:
1.- как система узнает размер строки?

2.- где мы можем найти исходные коды?

3.- я хотел бы знать исходный код IndexOf. Я посмотрел на ... https://referencesource.microsoft.com/" но кажется, что большая часть кода отсутствует, потому что он вызывает dll.
Кто-нибудь знает, где его найти?

Question update

1.- следовать исходному коду IndexOf трудно, и в конце концов вы достигнете точки, где вам придется исследовать дальше. Поэтому я остаюсь таким же, как в начале.

2.- строка строки имеют поле, которое указывает размер длины, так что его не нужно проверять каждый раз через строку. Предположим, что в моих стандартных функциях сравнения строк я выполняю string.ToLower() каждый раз или что-то еще повторяющееся. Если бы в переменных были такие поля, как length, которые также можно было бы расширить пользователем, то при первом выполнении ToLower() мы могли бы пометить его так, чтобы в следующих функциях этот процесс не повторялся.

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

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

Некоторые из этих свойств будут, например:
1.- Длина.
2.- Преобразование: Нет, Верхний Регистр, Нижний Регистр
3.- содержание (флаги): не указано, акцентировано, не акцентировано, контрольные коды, расширенные коды, буквы, цифры ...

Что я уже пробовал:

на всех интернет-сайтах. на всех интернет-сайтах.

Richard MacCutchan

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

4 Ответов

Рейтинг:
33

OriginalGriff

Цитата:
Как система узнает размер строки?

Что ж... он является внутренним для JIT - единственной инструкции в IL - которая встроенно обращается к полю в классе String, содержащему количество используемых символов:
// Gets the length of this string
//
/// This is a EE implemented function so that the JIT can recognise is specially
/// and eliminate checks on character fetchs in a loop like:
///        for(int I = 0; I < str.Length; i++) str[i]

/// The actually code generated for this will be one instruction and will be inlined.

//

// Spec#: Add postcondition in a contract assembly.  Potential perf problem.

public extern int Length {

    [System.Security.SecuritySafeCritical]  // auto-generated

    [ResourceExposure(ResourceScope.None)]

    [MethodImplAttribute(MethodImplOptions.InternalCall)]

    get;

}
Это быстро. Очень быстрый.
Цитата:
Где мы можем найти исходные коды?

Microsoft выпустила всю версию .NET at опорный источник[^]
Цитата:
Кто-нибудь знает, где его найти?

Он здесь: Источник Ссылки: String Class[^] - используйте CTRL+F в вашем браузере и введите "IndexOf", и это приведет вас к набору перегрузок.


[no name]

Хороший ответ, я отвечаю выше, обновляя вопрос.

Рейтинг:
1

F-ES Sitecore

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

string x = "Hello";


затем создается строковый объект, имеющий значение "Hello" и длину 5. Каждый раз, когда вы запрашиваете x.Length, он просто возвращает 5. Он не делает никаких вычислений длины, он знает, что такое длина.

Когда я пишу

x = x + ".";


теперь x-это "привет". однако исходный строковый объект не был изменен, он был просто удален, и был создан новый строковый объект со значением "привет" и длиной 6.

Если вы хотите использовать только один раз такие функции, как ToLower, то вы можете создать свой собственный строковый объект, который наследуется от System.Строка, которая ovrrides ToLower возвращает копию объекта, имеющего внутренний набор переменных, указывающий, что он уже находится в нижнем регистре, поэтому, если ToLower вызывается для него снова, он просто возвращает себя.


[no name]

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

Некоторые из этих свойств будут, например:
1.- Длина.
2.- Преобразование: Нет, Верхний Регистр, Нижний Регистр
3.- содержание (флаги): не указано, акцентировано, не акцентировано, контрольные коды, расширенные коды, буквы, цифры

"Если бы вы хотели иметь только разовые функции, такие как ToLower, то вы могли бы создать свой собственный строковый объект, который наследуется от System.Строка, которая ovrrides ToLower возвращает копию объекта, имеющего внутренний набор переменных, указывающий, что он уже находится в нижнем регистре, поэтому, если ToLower вызывается для него снова, он просто возвращает себя."

-- и GT; что то, что нам нужно. Кто-нибудь, сделайте это.

Richard MacCutchan

- Это то, что нам нужно. Кто-нибудь, сделайте это."
Ты-это кто-то.

phil.o

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

0x01AA

- это наследуется от системы.Строка": нет, это невозможно, потому что строка запечатана ;)

F-ES Sitecore

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

Рейтинг:
0

Patrice T

Цитата:
1.- как система узнает размер строки?

В языке C# строка-это объект, а длина-это свойство этого объекта.
Система не имеет никакого представления о длине конкретной строки.
Система знает только то, что ваша программа запросила кусок памяти, она не знает его использования или значения.
Цитата:
Оптимизация строки.операции по длине

Можно с уверенностью предположить, что это не то место, где оптимизация окупится больше всего.
Вы можете считать, что такие объекты, как строки, оптимизированы и что ваш код гораздо более подвержен оптимизации.
{Обновление]
На самом деле длина в объектах также связана с безопасностью, она предотвращает целый класс ошибок, таких как переполнение буфера и любая попытка чтения/записи после окончания конца объекта. Это небольшая цена за безопасность.


Рейтинг:
0

Richard MacCutchan

См. length недвижимость в городе Класс String (System) | Microsoft Docs[^].