Я только что заметил два объекта структуры: JwtHeaderParameterNames и JwtRegisteredClaimNames, единственной целью которых является хранение string
констант.
Почему они сделали их структурами, а не статическими классами, хотя в пространстве имен уже есть статические классы для констант?
Зачем вам создавать структуру, содержащую только константы или статические члены?
Спасибо
@vusaldev static class
избегает этого - как будто просто нет доступного конструктора.
@vusaldev AFAIK, на самом деле это неприменимо к статическим членам, будь то структура или класс, поскольку ни один из них фактически не инициируется.
Хорошо, но я рассказал о самом экземпляре, а не о членах
@vusaldev никто не собирается создавать экземпляры этого типа, так что... не о чем говорить.
Это «структура»; все поля являются «строками»; все строки являются «константами»; это означает, что он «запечен». Это «безопасный»/неизменяемый «объект данных»; из-за отсутствия лучшего термина.
Не имеет значения, используете ли вы класс или структуру. Просто выберите один. Эти константы группируются в новую структуру (или класс), поскольку такая группировка имеет больше смысла, чем размещение их в существующей структуре (или классе).
Спасибо за ваш ответ. К сожалению, это не касается моего вопроса. Я подкорректирую пост. Я спрашиваю, почему они сделали их структурами, а не статическими классами?
Вы правы в том, что более идиоматическим способом выразить это было бы static class
; иметь struct
без полей, но с этими const
записями, необычно и нетипично. На самом деле это ничему не повредит, но немного странно иметь возможность делать new JwtHeaderParameterNames()
или new JwtRegisteredClaimNames()
, которые бесполезны.
Я немного удивлен, что в процессе проверки его не изменили на static class
. Если есть веская причина, имеющая отношение к этому конкретному использованию, я бы ожидал комментария в коде ( также), но я его не вижу. В отсутствие этого мы могли только предполагать.
Интересно, что WsTrustConstants работает лучше, чем мы ожидали, что делает его еще более странным. Вполне вероятно, что эта странность известна и признана, но ее нельзя изменить сейчас, не сделав кардинальных изменений.
Мне нравится получать ваши ответы! Спасибо. Я часто считаю кодовую базу .NET наиболее правильной, но подобные вещи меня очень смущают и заставляют думать, что я чего-то не понимаю/не знаю.
Я думаю, что это оптимизация памяти: экземпляр класса выделяет дополнительную память, и GC должен обработать этот экземпляр. Struct не содержит GC и не выделяет дополнительную память.