向后兼容性

时间:2014-09-16 07:48:44

标签: c#

如果我有一个函数返回一个int LoadProgress(int),现在相同的函数被更改但它会破坏其他游戏项目,因为现在它需要返回一个keypairvalue,但我错误地删除了原来的函数int lodprogress(int),可以添加相同的函数但输入和输出不同吗?

还有一些功能可以保存和加载来破坏其他游戏项目的文件,我如何确保向后兼容性

3 个答案:

答案 0 :(得分:1)

这边界太宽泛/不清楚。需要更多细节来回答您的具体问题。

  

可以添加相同的功能但输入和输出不同吗?

是的,但返回类型不是签名的一部分,即包含两种方法的类只有不同的返回类型才能编译。

  

我如何确保保存和加载文件的向后兼容[in]函数[s]

同样,您需要显示代码并解释您想要更改的内容,以便正确回答这些问题,但可选参数可能是最佳选择。

答案 1 :(得分:0)

如果新方法的签名不是旧方法,那就没问题了。

例如,这些不存在冲突,其签名类型不同:

public void DoThis(int oldParameter) { }
public void DoThis(string newParameter) { }

这样做,因为返回类型不是签名的一部分:

public void DoThis(int oldParameter) { }
public int DoThis(int newParameter) { }

在该级别上没有任何后向兼容性。您无法将新旧混合在一起,而无需在不同的AppDomain中加载旧版本。在创建某些内容之前,请三思而后行,并根据需要调整旧代码以适应新内容。

答案 2 :(得分:0)

方法名称不足以识别方法。

它的名称,返回类型和参数类型都定义了方法。

基本上:void Foo(int)void Foo(string)int Foo()不同。

当多个方法具有相同的名称时,这些方法被视为重载,编译器将根据您传递的参数选择正确的方法。

在您的情况下,如果不使用旧方法,除了遗留代码,您不想重写,我建议您使用Obsolete attribute。这将有助于开发人员通过在编译时生成警告来识别已弃用的方法(如果设置了标志,甚至是编译错误):

[Obsolete("Please use the 'void Foo(int, string)' overload"]
void Foo(int a){
    // old code
}

void Foo(int a, string b) {
    // new code
}