Реализация таблицы Char.Latin1CharInfo в .NET
Я читал исходный код структуры System.Char и заметил, что таблица была определена довольно нелогичным образом:
private static ReadOnlySpan<byte> Latin1CharInfo => new byte[]
{
// Table entries are here.
};
РЕДАКТИРОВАТЬ: Обратите внимание на
=>
между и
new byte[]
, указывая, что это свойство доступно только для чтения. Итак, похоже, что каждый раз при доступе выделяется новый. Я не могу себе представить, что это так, так как это произвело бы много мусора при запуске кода обработки текста, который должен вызывать
char.IsUpper
или же
char.IsLower
в тугой петле.
Так что мой вопрос в том, делает ли новый
byte[]
выделяться каждый раз
Latin1CharInfo
осуществляется доступ, а если нет, то как это предотвращается компилятором C# или средой выполнения .NET?
Я предполагаю, что разработчики не хотели статически размещать этот объект, поскольку это потребовало бы накладных расходов памяти для каждой программы dotnet, независимо от того, вызывает ли она код в
Char
. Но я ожидал, что они будут использовать
WeakReference
чтобы гарантировать, что таблица может быть повторно использована, если не будет собран мусор.