#c# #.net #language-features #feature-detection
#c# #.net #язык-особенности #обнаружение функций
Вопрос:
Я думаю, что многие разработчики C # сталкивались с такой проблемой: в стандартной библиотеке .net есть некоторое перечисление и много стандартных классов и их методов для работы с ними. Но если вы хотите расширить это перечисление, добавив некоторые поля, это невозможно, но это может эффективно упростить процесс разработки и не может помешать работе этих стандартных классов. Я описываю это на конкретном примере: в системе есть enum TraceOptions .Пространство имен Diagnostics и оно используется TraceListeners. Давайте я хочу спроектировать Listener с некоторыми дополнительными опциями (например, AssemblyName и так далее). Теперь я должен создать новое перечисление, содержащее все мои дополнительные опции, которые дополняют опции из перечисления TraceOptions. Затем добавить новое свойство ExtraTraceOptions к моему слушателю. Но что, если я смогу написать что-то вроде этого:
enum MyExtraEnum : TraceOptions
{
AssemblyName = 128
}
MyExtraEnum расширит TraceOptions новыми полями, которые не должны пересекаться с полями TraceOptions ни по именам, ни по значениям. Тогда я могу использовать TraceOptions с новыми полями, такими как:
TraceOptions t = TraceOptions.AssemblyName; (IntelliSense may display that this
field is extended field from MyExtraEnum enumeration)
Я понимаю, что это может повредить существующий код, используя перечисление TraceOptions, но если я уверен, что этого не произойдет, и вся ответственность за использование таких функций лежит на мне.
Что вы делаете с такой проблемой?
Комментарии:
1. Это своего рода противоречит цели перечислений.
Ответ №1:
Для меня это звучит не очень хорошей идеей. Итак, теперь C # 6 отсутствует и TraceOptions
имеет новую функцию: SomeFoo = 128
. Или, может быть, a AssemblyName = 127
. И теперь у вас есть столкновение, которого (в отличие от обычного подкласса) поставщик TraceOptions
не ожидает.
Перечисления предоставляют ограниченный набор опций, которые поддерживает автор перечисления. Заявление о том, что вы берете на себя полную ответственность, недостаточно. Это все равно, что просить, чтобы все переменные-члены были общедоступными, заявляя, что вы никогда не будете злоупотреблять ими. Это просто небезопасный подход к программированию.
Комментарии:
1. Но это может произойти для всех методов расширений, а не только для перечислений…
2. @JoanCharmant, хорошая мысль, но все еще есть большая разница, когда дело доходит до части значений. Если перечисление использует значения 1-9, значение 10, вероятно, будет использоваться как расширением, так и следующей версией перечисления. Вероятность столкновения имен намного ниже, и это единственная проблема с методами расширения.
Ответ №2:
Вы не можете наследовать от перечисления, все перечисления неявно запечатаны. Таким образом, нет простого способа добавить дополнительное значение к перечислению (если это то, что вы пытаетесь сделать). Вам нужно будет определить новое перечисление.
Если вы хотите добавить дополнительные методы в enum, вы можете использовать методы расширения, но это единственный способ их расширения.