C# 如何将代码标记为;“不供将来使用”;

C# 如何将代码标记为;“不供将来使用”;,c#,visual-studio,obsolete,C#,Visual Studio,Obsolete,我经常会遇到这样的情况:我想阻止其他开发人员继续使用某个方法或类。例如,假设我有两个库方法“A”和“B”,其中“A”是执行某些任务的“旧”方法,“B”是执行该任务的“新”方法。在许多情况下,A和B的差异足以使使用A开始使用B的重构代码变得非常重要(例如,需要通过一系列附加状态)。因为A在使用它的情况下工作,所以我不想优先考虑重构。然而,我确实想给我的开发伙伴们一个直观的指示,表明新代码中不会使用a 因此,我希望在引用带有ObsoleteAttribute的成员时,在没有相关编译器警告/错误的情况

我经常会遇到这样的情况:我想阻止其他开发人员继续使用某个方法或类。例如,假设我有两个库方法“A”和“B”,其中“A”是执行某些任务的“旧”方法,“B”是执行该任务的“新”方法。在许多情况下,A和B的差异足以使使用A开始使用B的重构代码变得非常重要(例如,需要通过一系列附加状态)。因为A在使用它的情况下工作,所以我不想优先考虑重构。然而,我确实想给我的开发伙伴们一个直观的指示,表明新代码中不会使用a

因此,我希望在引用带有
ObsoleteAttribute
的成员时,在没有相关编译器警告/错误的情况下(因为打开该选项将从所有旧用法中发出数百个错误,我们不打算很快解决这些错误)的情况下,您能获得理想的结果。这样,如果开发人员使用a编写新的代码行,他或她将立即注意到删除,并修复代码以使用B

有没有办法在VisualStudio(2012)中获得此类功能

编辑:

  • 有几条评论的大意是“没有办法区分新代码和旧代码”。我同意。然而,这不是我想要的,所以让我澄清一下:相反,我想要的是一种代码“过时”(例如删除线)的可视化表示,而没有相应的编译器警告或错误。这样,在阅读旧代码或编写新代码的过程中,开发人员将立即看到某些东西过时的迹象。即使.NET本机不支持这一点,也可能有一个用于此目的的VS扩展

  • 有几条评论的大意是“你不能既有警告又没有警告”。我想我已经解释了上面的用例,但我会再试一次。我们有一组核心库,这些库在构成我们代码库的各种解决方案中大量使用。有时,我会更新这些库中的一个,它为执行某些任务提供了一个新的、更好的API。为了保持向后兼容性,我不能仅仅删除执行该任务的旧方法(在许多情况下),因为大量现有代码依赖于使用旧的API集,不能通过简单的重构来使用新的API集。此外,没有迫切的理由这样做;这只会有在现有代码中引入bug的风险。但是,我想用某种方式直观地提醒开发人员,某些API应该避免使用,而应该使用其他API。这是很困难的,因为开发人员倾向于通过阅读完成相同任务的现有代码来学习如何完成某些任务。这使得新的API很难传播,因为旧的API被太多的现有代码引用。
    ObsoleteAttribute
    通过编译器警告实现了这一点,但是这些警告只会从数百个旧API的现有使用中产生大量噪音。这就是我喜欢删除线的原因:它非常直观,但它只会在开发人员阅读或编写使用过时API的代码时侵入。下面是一些我想标记旧API的更改示例:

    • 我们引入了一个新的API来运行SQL查询,与以前相比,它不那么冗长,不那么古怪,而且更加灵活。很难完全删除旧的API,因为它有太多可以依赖的古怪行为。然而,我想推动人们朝着新的API发展,以备将来的发展
    • 我们有两套内部的单元测试助手API。较旧的一个功能完善,但它依赖于继承,不太灵活。较新的版本是使用属性构建的,更灵活。数百个旧测试仍然使用旧API运行,但我想让新测试的编写者使用新API
    • 我们的核心库中有一些旧的随机遗留代码,这些代码实际上并不合适,但此时很难删除。我想减少对这些类型和方法的新引用的添加。这样,当依赖于它们的现有代码由于正常的搅动而消失时,在某个时候删除它们可能会变得经济高效
  • 作为进一步说明,我认为的答案很好地描述了为什么您可能不会将某个内容标记为过时,即使您不建议在新代码中使用它

  • 有几个注释/答案只是简单地指出了
    obsoletattribute
    的存在。请注意,此问题的文本始终引用该属性

    • 使用

      如果将最后一个参数(
      IsError
      )设置为
      true
      ,则将发出编译错误,否则将发出警告。您可以使用
      #pragma 612、618

      编辑:

      好吧,好吧,我让步了。您想要的解决方案似乎是:

      /// <summary>
      /// Please don't use
      /// </summary>
      public string SomeObsoleteMethod()
      {
         // ...
      }
      
      //
      ///请不要使用
      /// 
      公共字符串someObsoletMethod()
      {
      // ...
      }
      
      根本不支持编译器。

      将属性添加到方法中会在intellisense中给出删除线

      [ObsoleteAttribute("This property is obsolete. Use NewProperty instead.", false)] 
      public static string OldProperty
      { get { return "The old property value."; } }
      
      要禁用警告,请在属性之前添加以下内容:

      #pragma warning disable 612, 618
      
      要重新启用,请执行以下操作:

      #pragma warning restore 612, 618
      
      如前所述,在项目文件中而不是在代码中放置ignore将是一个非常干净的解决方案

      <WarningsNotAsErrors>618</WarningsNotAsErrors>
      
      当您尝试使用
      test1
      时,您将得到:

      请注意,当您键入
      var test=new test1()
      时,删除线不会出现


      但是
      test1 test=new test1()
      将显示删除线。

      我个人认为应该使用
      obsoletateAttribute
      ,确保在现有代码中需要时使用
      #pragma
      (参见示例)禁用它


      你会及时修复代码的。

      所以你想要一个警告,但是
      <WarningsNotAsErrors>618</WarningsNotAsErrors>
      
      #pragma warning disable 612, 618
      [Obsolete]
      #pragma warning restore 612, 618
      public class test1
      {...
      
      #pragma warning 612, 618 //This block of code uses BadOldMethod(), code review planned
      /* ... code here */
      #pragma warning restore 612, 618