StringName
Интернированное имя движка с C#-обёрткой; значение, пустота и строковые преобразования.
Класс C#, оборачивающий интернированное имя движка. Равные текстовые значения используют общее внутреннее представление, но могут находиться в разных управляемых объектах StringName. Поэтому ReferenceEquals не заменяет сравнение значений имён.
Поддерживаются преобразования между string и StringName. Например, присваивание StringName name = "player" создаёт обёртку имени; строковое содержимое можно получить через ToString(). В C# нет литерала &"player".
StringName не преобразуется в bool. Проверяйте наличие управляемой ссылки через is null, а пустое значение имени — свойством IsEmpty после проверки ссылки. Не считайте, что у StringName есть все методы System.String: для операций со строкой сначала получите строковое значение.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы2
StringName2 перегрузки
public StringName();Создаёт отдельный управляемый объект с пустым именем. IsEmpty равен true, ToString() возвращает пустую строку. Объект существует и не равен null.
public StringName(string name);Создаёт управляемую оболочку интернированного имени. Регистр и последовательность символов сохраняются: Unicode-нормализация не выполняется. Равные имена могут иметь разные управляемые оболочки; сравнивайте значения через == или Equals, а не ReferenceEquals. Пустая строка и, в текущем SDK, null дают пустое имя. Для обычного кода передавайте непустую ссылку string.
Пример возвращает true. Каждый локально созданный объект освобождается своим using; C#-литерала &"player" нет.
using System;
using Reckfell;
public static class StringNameExamples
{
public static bool SameName()
{
using StringName first = "player";
using var second = new StringName("player");
return first == second && !ReferenceEquals(first, second)
&& first.ToString() == "player";
}
}| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
nameТекст имени. Пустая строка создаёт пустое имя; пробелы не удаляются.
Свойства1
IsEmptyСвойство
public bool IsEmpty { get; }Проверяет пустоту нативного имени. Новый StringName() и имя из пустой строки имеют IsEmpty == true. Это не проверка управляемой ссылки: сначала проверяйте name is not null. Свойство не проверяет отсутствие пробелов и не заменяет учёт времени жизни ресурса.
Методы15
Dispose2 перегрузки
public void Dispose();Освобождает принадлежащую оболочке ссылку на нативное имя, снимает регистрацию ресурса и подавляет финализатор. Управляемая ссылка не становится null; другие самостоятельно созданные оболочки того же имени остаются действительными.
Освобождайте свой объект ровно один раз, обычно через using. В текущем SDK повторный Dispose() ранее зарегистрированной непустой оболочки выбрасывает ArgumentException («Disposable not registered»); идемпотентность не гарантируется. Не вызывайте Dispose() вручную внутри using и не освобождайте заимствованные имена, включая общие константы API. После освобождения не используйте объект и не оставляйте его ключом словаря: нативная идентичность и хеш меняются.
public void Dispose(bool disposing);Низкоуровневая перегрузка освобождения. В текущей реализации оба значения disposing освобождают нативное имя и снимают регистрацию ресурса. Этот метод сам не вызывает GC.SuppressFinalize. В прикладном коде используйте Dispose() без аргументов или using; прямой вызов может оставить финализатор для уже освобождённого ресурса. Повторное снятие регистрации может выбросить ArgumentException.
| Имя | Тип | По умолчанию |
|---|---|---|
disposing | bool | — |
disposingФлаг пути освобождения; текущая реализация освобождает ресурс и при true, и при false. Это не переключатель сохранения нативного имени.
Equals3 перегрузки
public bool Equals(in Reckfell.NativeInterop.reckfell_string_name other);Перегрузка для нативного interop: сравнивает внутреннюю идентичность имени с действительным reckfell_string_name. Пустая оболочка равна пустому нативному имени. Метод не передаёт владение и не освобождает аргумент. Обычному игровому коду подходит Equals(StringName).
| Имя | Тип | По умолчанию |
|---|---|---|
other | Reckfell.NativeInterop.reckfell_string_name | — |
otherДействительное нативное имя, срок жизни которого покрывает вызов; default представляет пустое имя. Не освобождайте заимствованное значение.
booltrue, если нативные идентичности имён совпадают; иначе false.
public bool Equals(StringName? other);Сравнивает интернированное значение имени с другой управляемой оболочкой. Регистр значим; разные оболочки одинакового текста равны. null не равен даже пустому существующему StringName.
| Имя | Тип | По умолчанию |
|---|---|---|
other | StringName | — |
otherДругая оболочка имени или null.
booltrue для одинаковых интернированных имён; false для другого имени или null.
public override bool Equals(object? obj);Возвращает true для этой же ссылки или другого StringName с тем же значением. Здесь преобразование string в StringName не выполняется: переданная как object строка с тем же текстом не равна имени.
| Имя | Тип | По умолчанию |
|---|---|---|
obj | object | — |
objПроверяемый объект; StringName сравнивается по значению, другие типы и null не совпадают.
booltrue только для StringName с тем же значением, включая эту же ссылку; иначе false.
GetHashCodeint
public override int GetHashCode();Возвращает хеш внутреннего нативного указателя имени. Живые равные имена имеют одинаковый хеш и подходят для Dictionary<StringName, T>. Разные имена могут иметь одинаковый хеш. Не сохраняйте результат в файл и не используйте как сетевой или стабильный идентификатор: это не переносимый хеш текста. Освобождение объекта изменяет его хеш.
intХеш для текущей внутренней идентичности имени; стабильность между запусками не гарантируется.
ToStringstring
public override string ToString();Возвращает текст имени как управляемую строку с сохранением регистра и Unicode. Для пустого имени возвращает string.Empty. Метод не освобождает StringName. Для строковых операций сначала получите string, затем используйте API System.String.
stringТекст имени или пустая строка для пустого имени.
op_Equality3 перегрузки
public static bool operator ==(in Reckfell.NativeInterop.reckfell_string_name left, StringName? right);Перегрузка для нативного interop: сравнивает внутренние идентичности имён. Здесь управляемый null считается равным пустому нативному имени — в отличие от сравнения двух управляемых оболочек, где null не равен пустой оболочке. Порядок операндов результата не меняет. Аргументы не освобождаются.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Reckfell.NativeInterop.reckfell_string_name | — |
right | StringName | — |
leftДействительное нативное имя; default — пустое. Срок жизни должен покрывать вызов.
rightУправляемая оболочка или null; null соответствует пустому нативному имени.
booltrue при одинаковых нативных идентичностях, включая null и пустое нативное имя; иначе false.
public static bool operator ==(StringName? left, in Reckfell.NativeInterop.reckfell_string_name right);Перегрузка для нативного interop: сравнивает внутренние идентичности имён. Здесь управляемый null считается равным пустому нативному имени — в отличие от сравнения двух управляемых оболочек, где null не равен пустой оболочке. Порядок операндов результата не меняет. Аргументы не освобождаются.
| Имя | Тип | По умолчанию |
|---|---|---|
left | StringName | — |
right | Reckfell.NativeInterop.reckfell_string_name | — |
leftУправляемая оболочка или null; null соответствует пустому нативному имени.
rightДействительное нативное имя; default — пустое. Срок жизни должен покрывать вызов.
booltrue при одинаковых нативных идентичностях, включая null и пустое нативное имя; иначе false.
public static bool operator ==(StringName? left, StringName? right);Сравнивает значения двух управляемых оболочек с учётом регистра. Две ссылки null равны; null и существующая пустая оболочка различаются. ReferenceEquals проверяет другую вещь — совпадение самих оболочек.
| Имя | Тип | По умолчанию |
|---|---|---|
left | StringName | — |
right | StringName | — |
leftСравниваемая управляемая оболочка или null.
rightСравниваемая управляемая оболочка или null.
booltrue для одинаковых имён или двух ссылок null; иначе false.
op_Implicit2 перегрузки
public static implicit operator string(StringName? from);Для существующей оболочки вызывает ToString(); для null возвращает null. Различайте null и пустое имя: пустой StringName преобразуется в "", отсутствующая ссылка — в null. Владение оболочкой не передаётся.
| Имя | Тип | По умолчанию |
|---|---|---|
from | StringName | — |
fromИмя для чтения или null.
stringТекст имени; пустая строка для пустого имени; null для отсутствующей оболочки.
public static implicit operator StringName(string from);Создаёт новую управляемую оболочку так же, как new StringName(from). Даже при уже интернированном тексте это отдельный объект с собственным временем жизни. Если преобразование создаёт ваш локальный ресурс, управляйте им через using; не освобождайте чужую общую оболочку.
| Имя | Тип | По умолчанию |
|---|---|---|
from | string | — |
fromИсходный текст. Пустая строка и, в текущем SDK, null дают пустое имя.
StringNameНовая оболочка StringName, включая отдельную пустую оболочку для пустого входа.
op_Inequality3 перегрузки
public static bool operator !=(in Reckfell.NativeInterop.reckfell_string_name left, StringName? right);Отрицает соответствующий ==. Перегрузка для нативного interop: сравнивает внутренние идентичности имён. Здесь управляемый null считается равным пустому нативному имени — в отличие от сравнения двух управляемых оболочек, где null не равен пустой оболочке. Порядок операндов результата не меняет. Аргументы не освобождаются.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Reckfell.NativeInterop.reckfell_string_name | — |
right | StringName | — |
leftДействительное нативное имя; default — пустое. Срок жизни должен покрывать вызов.
rightУправляемая оболочка или null; null соответствует пустому нативному имени.
booltrue при разных нативных идентичностях с описанным правилом null; иначе false.
public static bool operator !=(StringName? left, in Reckfell.NativeInterop.reckfell_string_name right);Отрицает соответствующий ==. Перегрузка для нативного interop: сравнивает внутренние идентичности имён. Здесь управляемый null считается равным пустому нативному имени — в отличие от сравнения двух управляемых оболочек, где null не равен пустой оболочке. Порядок операндов результата не меняет. Аргументы не освобождаются.
| Имя | Тип | По умолчанию |
|---|---|---|
left | StringName | — |
right | Reckfell.NativeInterop.reckfell_string_name | — |
leftУправляемая оболочка или null; null соответствует пустому нативному имени.
rightДействительное нативное имя; default — пустое. Срок жизни должен покрывать вызов.
booltrue при разных нативных идентичностях с описанным правилом null; иначе false.
public static bool operator !=(StringName? left, StringName? right);Отрицает результат ==. Сравнивает значения двух управляемых оболочек с учётом регистра. Две ссылки null равны; null и существующая пустая оболочка различаются. ReferenceEquals проверяет другую вещь — совпадение самих оболочек.
| Имя | Тип | По умолчанию |
|---|---|---|
left | StringName | — |
right | StringName | — |
leftСравниваемая управляемая оболочка или null.
rightСравниваемая управляемая оболочка или null.
booltrue, если имена или состояние null различаются; иначе false.