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

时间:2016-11-01 13:24:35

标签: c# obsolete

[Obsolete]的功能主要是停止使用类/函数,但仍然将其保存在记录的代码中。

是否有任何充分的理由可以使用[Obsolete]而不是仅删除或注释掉代码。如果你有源代码控制这个问题就更有意义,所以没有必要保留代码以供参考,因为它将在SC中。

我很好奇什么是最佳做法?

3 个答案:

答案 0 :(得分:4)

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

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

在内部,它可以用于重构,以逐步的方式替换实现不佳但工作正常的功能。您将其标记为已过时并开始处理警告,直到您不再看到它们为止,然后您可以继续安全删除它。

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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

  

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

正如评论中所提到的,如果其他人使用你的程序集版本,这显然是非常有用的。