如何在C#中将特定参数标记为已过时/弃用?

20

我希望能够保持 C# API 的现状,但只是弃用方法调用中的一个参数。是否可能这样做,还是需要创建一个没有该参数的新方法,并将原始方法标记为过时?

5个回答

28

简短回答:

您需要创建一个新签名的新方法,并将当前方法标记为过时。

更长的回答:

您要避免的是代码中断!尤其是在公司框架中,您希望宣传您的方法不再受支持,但您不想因为架构或设计决策而导致依赖解决方案崩溃,对吧?

这时可以使用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 对于一个更完整的答案并详细说明步骤。比Steve的回答更具信息性。 - user376591

8

是的,我认为唯一的方法是创建一个没有参数的新方法,并使用ObsoleteAttribute标记原始方法。


7

使用Obsolete属性:

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

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


不过,是否有可能在不标记整个方法为过时的情况下完成这个操作呢? - Brian
3
不,正如其他答案(例如Chris Wallis)所述,Parameter不是ObsoleteAttribute的目标。 - Steve Ellinger

6

是的。您只能将类型和类型成员标记为过时,而不能标记单个参数。但是,您可以重载该方法,从而保持相同的名称并将旧方法标记为过时:

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

    public void DoSomething(int i)
    {
    }
}

2

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

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


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