Зачем использовать структуру для хранения констант, а не статический класс?

Я только что заметил два объекта структуры: JwtHeaderParameterNames и JwtRegisteredClaimNames, единственной целью которых является хранение string констант.

  1. Почему они сделали их структурами, а не статическими классами, хотя в пространстве имен уже есть статические классы для констант?

  2. Зачем вам создавать структуру, содержащую только константы или статические члены?

Спасибо

Я думаю, что это оптимизация памяти: экземпляр класса выделяет дополнительную память, и GC должен обработать этот экземпляр. Struct не содержит GC и не выделяет дополнительную память.

vusaldev 02.08.2024 15:50

@vusaldev static class избегает этого - как будто просто нет доступного конструктора.

Marc Gravell 02.08.2024 15:54

@vusaldev AFAIK, на самом деле это неприменимо к статическим членам, будь то структура или класс, поскольку ни один из них фактически не инициируется.

desmondische 02.08.2024 15:54

Хорошо, но я рассказал о самом экземпляре, а не о членах

vusaldev 02.08.2024 16:01

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

Marc Gravell 02.08.2024 16:02

Это «структура»; все поля являются «строками»; все строки являются «константами»; это означает, что он «запечен». Это «безопасный»/неизменяемый «объект данных»; из-за отсутствия лучшего термина.

Gerry Schmitz 02.08.2024 18:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не имеет значения, используете ли вы класс или структуру. Просто выберите один. Эти константы группируются в новую структуру (или класс), поскольку такая группировка имеет больше смысла, чем размещение их в существующей структуре (или классе).

Спасибо за ваш ответ. К сожалению, это не касается моего вопроса. Я подкорректирую пост. Я спрашиваю, почему они сделали их структурами, а не статическими классами?

desmondische 02.08.2024 15:50
Ответ принят как подходящий

Вы правы в том, что более идиоматическим способом выразить это было бы static class; иметь struct без полей, но с этими const записями, необычно и нетипично. На самом деле это ничему не повредит, но немного странно иметь возможность делать new JwtHeaderParameterNames() или new JwtRegisteredClaimNames(), которые бесполезны.

Я немного удивлен, что в процессе проверки его не изменили на static class. Если есть веская причина, имеющая отношение к этому конкретному использованию, я бы ожидал комментария в коде ( также), но я его не вижу. В отсутствие этого мы могли только предполагать.

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

Мне нравится получать ваши ответы! Спасибо. Я часто считаю кодовую базу .NET наиболее правильной, но подобные вещи меня очень смущают и заставляют думать, что я чего-то не понимаю/не знаю.

desmondische 02.08.2024 16:00

Другие вопросы по теме

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

Невозможно получить доступ к наблюдаемому свойству в модели представления из соответствующего файла .xaml представления — .NET MAUI MVVM
Устойчивые функции Azure не вызываются при использовании с триггером Q с использованием управляемого удостоверения
Как я могу преобразовать этот SQL-запрос в linq, когда у меня есть подзапрос, группировка и предложение?
Проблема развертывания Blazor WASM Core в Azure
Преобразование оператора foreach в оператор выбора
Что происходит, когда несколько задач C# запускаются после завершения другой задачи?
ASP .NET Core — расширение @Html.EditorFor для добавления <span>
Netwonsoft JsonConvert.Deserialization выдает исключение JsonSerializationException: «Ошибка преобразования значения «Имя моего пользовательского объекта» в тип «System.Type»
Как обеспечить автоматическое масштабирование для CollectionView в объекте Popup из CommunityToolkit.Maui после его заполнения с помощью события нажатия кнопки на платформе Windows?
Перенаправление вызова .NET Core OIDC не работает с интерфейсом Angular