Когда я должен использовать атрибут [Устаревший] и когда я должен удалить свой код?
Функция [Obsolete]
по сути, чтобы остановить использование класса / функции, но при этом сохранить его в коде для записи.
Есть ли веская причина, почему [Obsolete]
следует использовать вместо простого удаления или комментирования кода. Этот вопрос еще более актуален, если у вас есть контроль версий, поэтому нет смысла хранить код в справочных целях, как это будет в СЦ.
Мне интересно, что считается лучшей практикой?
3 ответа
Он используется главным образом для обратной совместимости, поэтому, когда вы выполняете новую реализацию функциональности, которая имеет другое ожидаемое поведение, любой код, использующий старую функциональность, будет по-прежнему работать, но вы убедитесь, что новое использование вашей библиотеки использует новую реализацию.
Если вы поддерживаете библиотеку, которая используется третьими лицами, вы должны разработать план действий, когда и если будут удалены устаревшие функции. Если это важно, потому что много раз вы просто указываете, что эту функцию больше не нужно поддерживать, и вместо нее следует использовать новую.
Внутренне, это может использоваться в рефакторингах, чтобы постепенно заменить плохо реализованную, но работающую функциональность. Вы помечаете его как устаревшее и начинаете прорабатывать предупреждения, пока не увидите их больше, затем вы можете безопасно их удалить.
Помните, что это мнение основано на опыте обновления баз унаследованного кода, и нет единого мнения.
Obsolete
Атрибут помечает программный объект как объект, который больше не рекомендуется для использования. Каждое использование объекта, помеченного как устаревшее, впоследствии генерирует предупреждение или ошибку, в зависимости от того, как настроен атрибут.
Вот пример для Hashtable
компаратор из справочного источника.
[Obsolete("Please use KeyComparer properties.")]
protected IComparer comparer
{
get
{
if( _keycomparer is CompatibleComparer) {
return ((CompatibleComparer)_keycomparer).Comparer;
}
else if( _keycomparer == null) {
return null;
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
set
{
if (_keycomparer is CompatibleComparer) {
CompatibleComparer keyComparer = (CompatibleComparer)_keycomparer;
_keycomparer = new CompatibleComparer(value, keyComparer.HashCodeProvider);
}
else if( _keycomparer == null) {
_keycomparer = new CompatibleComparer(value, (IHashCodeProvider)null);
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
}
Документация к ObsoleteAttribute описывает причины его существования довольно хорошо...
Пометка элемента как устаревшего информирует пользователей о том, что этот элемент будет удален в будущих версиях продукта.
Как уже упоминалось в комментариях, это, очевидно, действительно полезно, только если другие используют версии вашей сборки.