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

7
< p > [Obsolete] 的作用是防止类/函数被使用,但仍将其保留在代码中以备记录。

是否有充分的理由使用[Obsolete],而不是只删除或注释掉代码?如果您拥有源代码控制,则此问题更加相关,因为保留代码以供参考是没有意义的,因为它已经在源代码控制中。

我想知道什么是最佳实践?


3
将代码标记为过时更多地是针对您的API消费者。这样可以让他们有机会在实际删除废弃代码之前做出反应并转换为当前方法。如果只是用于内部使用而不是外部消费者,则没有真正的理由将其标记为过时。 - Glorin Oakenfoot
请参考以下链接了解如何使用过时的属性:https://dev59.com/q3A75IYBdhLWcg3wBkS1 - Shekhar Pankaj
1
@GlorinOakenfoot,这是有原因的。也许您有多个具有依赖性的项目。例如,您的库A使用您的库B。也许您现在不想更改A的所有代码,只需标记它以稍后修改即可。例如,在另一个库中使用了一种方法200次。您可能希望不要一次性全部修复它(只要废弃的代码仍然正确)。更好的解决方案是更改现有方法,调用新的(不过时)代码。 - Matthias Burger
3个回答

7

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

如果您正在维护被第三方使用的库,则应制定一个路线图来确定过时功能何时以及是否将被删除。如果它很重要,那么你只是在表示该函数不再维护,应改用新方法。

在内部,可以用于逐步替换工作不良但有效的功能。您将其标记为过时并开始处理警告,直到不再出现,然后可以安全地将其删除。

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


你在那里有一个小错别字,应该是“users”而不是“uses”,但无法编辑因为不允许进行小修改。 - fahadash
@fahadash,我在谈论库的新用途。也就是使用的行为。 - Yeray Cabello

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

程序实体?不,它只是生成了一个编译器警告,而不是错误。 - Matthias Burger
如果您定义了 ObsoleteAttribute(String,true) 将会引发错误。 - mybirthname
@MatthiasBurger 这个属性接受一个参数,指示使用是否会导致警告或错误。测试一下吧(或者只需查看其文档)。 - Servy
是的,刚看到了 true - 抱歉,是我的错... - Matthias Burger

0

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

将一个元素标记为过时的,可以告知用户该元素将在未来版本中被移除。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接