【问题标题】:How can I mark a specific parameter as obsolete/deprecated in C#?如何在 C# 中将特定参数标记为过时/弃用?
【发布时间】:2011-04-30 07:22:09
【问题描述】:

我希望能够保持 C# API 与现在相同,但只需在方法调用中弃用其中一个参数即可。是否可以这样做,或者我是否需要创建一个不带参数的新方法并将原始方法标记为已过时?

【问题讨论】:

    标签: c# parameters deprecated obsolete


    【解决方案1】:

    简答:

    您需要使用新签名创建一个新网络,并将当前的网络标记为过时。

    更长的答案

    您要不惜一切代价避免代码中断!然后,特别是在公司框架中,您想宣传您的方法将不再受支持,但您不想为依赖解决方案因架构或设计决策或您一方而崩溃负责,对吗?

    ObsoleteAttribute 类将为您解决问题。

    一旦一个班级成员被标记为过时,就会在客户端发出警告,使用你的框架的人,以继续这种方式,甚至是你在同一项目下的同事。

    public class MyClass {
        [Obsolete("This method should no longer be used, please use MyNewMethod() instead.")]
        public void MyMethod(string name, long phoneNumber, long faxNumber) { 
        }
    
        public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
        }
    }
    

    这将宣传您的代码用户不再支持MyMethod

    经过一段时间,合理到足以让每个人更改他/她的代码,你可以告诉这个属性,当你的过时方法仍然在代码中使用时抛出一个错误消息。

    public class MyClass {
        [Obsolete("This method should no longer be used, please use MyNewMethod() instead.", true)]
        public void MyMethod(string name, long phoneNumber, long faxNumber) { 
        }
    
        public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
        }
    }
    

    通过将第二个ObsoleteAttribute 类构造函数参数设置为true,您可以通知编译器将此方法的使用作为错误进行通告。

    只需要一段时间后,您就可以从代码中完全删除您的方法以稍微清理一下。这是敏捷软件开发方法鼓励的重构方法的一部分。

    这有帮助吗?

    【讨论】:

    • +1 以获得更有竞争力的答案并详细说明步骤。比史蒂夫回答的信息更丰富
    【解决方案2】:

    是的,我认为唯一的方法是创建一个不带参数的新方法并将原始方法标记为ObsoleteAttribute

    【讨论】:

      【解决方案3】:

      使用过时属性:

      [Obsolete("Please use void AnotherMethod() instead", false)]
      void SomeMethod(Int32 data){
      }
      

      属性中的布尔值告诉编译器生成警告,如果将其更改为true,编译器将生成错误。有关它的文档,请参阅here

      【讨论】:

      • 是否可以在不将整个方法标记为过时的情况下执行此操作?
      • 不,正如其他答案(例如 Chris Wallis)所说,参数不是 ObsoleteAttribute 的目标。
      【解决方案4】:

      是的。您只能mark types and members of types as obsolete,而不是单个参数。但是,您可以重载该方法,从而保持相同的名称并将旧的方法标记为已过时:

      class Act
      {
          [Obsolete("DoSomething(int, int) is obsolete", false /*warn only*/)]
          public void DoSomething(int i, int j)
          {
          }
      
          public void DoSomething(int i)
          {
          }
      }
      

      【讨论】:

        【解决方案5】:

        我认为最好创建一个新方法。

        使参数过时是什么意思?这是否取决于该参数的特定值?当你调用一个方法时,你总是必须指定参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-18
          • 2011-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-01
          相关资源
          最近更新 更多