17

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

4

5 回答 5

26

简短的回答:

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

更长的答案

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

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,您可以通知编译器将此方法的使用作为错误进行宣传。

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

这有帮助吗?

于 2010-10-25T16:44:02.190 回答
8

是的,我认为唯一的方法是创建一个不带参数的新方法,并用ObsoleteAttribute.

于 2010-10-25T16:00:33.100 回答
8

使用过时属性:

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

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

于 2010-10-25T16:01:55.523 回答
6

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

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

    public void DoSomething(int i)
    {
    }
}
于 2010-10-25T16:00:08.567 回答
2

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

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

于 2010-10-25T16:00:24.623 回答