【问题标题】:When should I use the [Obsolete] attribute and when should I delete my code? [closed]我什么时候应该使用 [Obsolete] 属性,什么时候应该删除我的代码? [关闭]
【发布时间】:2016-11-01 13:24:34
【问题描述】:

[Obsolete] 的功能本质上是停止使用类/函数,但仍将其保存在代码中以供记录。

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

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

【问题讨论】:

  • 将代码标记为过时对 API 的使用者来说更合适。它使他们有机会在实际删除过时的代码之前做出反应并改变当前的方法。如果它只是供您内部使用而不是外部消费者,那么没有真正的理由将其标记为过时。
  • @GlorinOakenfoot 是有原因的。也许您有多个具有依赖关系的项目。例如。您的库 A 使用您的库 B。也许您现在不想更改 A 的所有代码,只需标记它,以便以后修改。例如。有一种方法在 200 个地方的其他库中使用。您可能不想一次全部修复它。 (只要过时的代码仍然正确)。更好的解决方案是更改现有方法,然后调用新的(不是过时的)代码。

标签: c# obsolete


【解决方案1】:

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

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

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

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

【讨论】:

  • 您在“users”而不是“uses”中有一个小错字,无法编辑,因为不允许进行小幅编辑。
  • @fahadash,我说的是图书馆的新用途。就像使用的动作一样。
【解决方案2】:

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(String, true) 会抛出错误。
  • @MatthiasBurger 该属性接受一个参数,该参数指示使用是否会导致警告或错误。测试一下。 (或者只看它的文档)
  • 是的,刚刚看到true - 抱歉,我的错...
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多