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

When should I use the [Obsolete] attribute and when should I delete my code?

[Obsolete]的作用本质上是停止一个class/function被使用,但仍然在代码中维护它以供记录。

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

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

ObsoleteAttribute 的文档很好地描述了它存在的原因...

Marking an element as obsolete informs users that the element will be removed in future versions of the product.

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

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"));
            }
        }
    }

它主要用于向后兼容,因此当您对具有不同预期行为的功能进行新实现时,任何使用旧功能的代码仍然有效,但您要确保您的库的新用途使用新的实现。

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

在内部,它可以用于重构以逐步替换实现不佳但有效的功能。您将其标记为已过时并开始处理警告,直到您看不到更多警告,然后您可以继续安全地删除它。

请注意,这是基于更新遗留代码库的经验得出的意见,没有达成共识。