什么时候应该使用[Obsolete]属性,什么时候应该删除代码

本文关键字:什么时候 代码 属性 删除 Obsolete | 更新日期: 2023-09-27 18:15:51

[Obsolete]的功能本质上是阻止类/函数被使用,但仍然在记录的代码中维护它。

有什么好的理由为什么应该使用[Obsolete]而不是仅仅删除或注释掉代码吗?如果你有源代码控制,那么这个问题就更相关了,所以没有必要保留代码作为参考,因为它将在SC中。

我很好奇什么是最佳实践?

什么时候应该使用[Obsolete]属性,什么时候应该删除代码

它主要用于向后兼容,所以当你做一个功能的新实现时,有不同的预期行为,任何使用旧功能的代码仍然可以工作,但你要确保你的库的新使用使用新的实现。

如果您正在维护一个由第三方使用的库,那么您应该制定的路线图,以便在中过时的功能何时以及是否将被删除。如果它很重要,因为很多时候你只是在表明不再需要维护该函数,而应该使用新的函数。

在内部,它可以在重构中使用,以渐进的方式替换实现不佳但工作正常的功能。您将其标记为"过时",并开始处理警告,直到您看到没有更多的警告,然后您可以继续安全地删除它。

请注意,这是一种基于更新遗留代码库的经验的意见,并且没有共同的共识。

Obsolete属性将程序实体标记为不再推荐使用的程序实体。每次使用被标记为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的文档很好地描述了它存在的原因…

标记一个元素为过时的通知用户该元素将在产品的未来版本中被删除。

正如在评论中提到的,这显然只有在其他人正在使用您的程序集的版本时才真正有用。