向后可比性

本文关键字:可比性 | 更新日期: 2023-09-27 18:21:57

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

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

向后可比性

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

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

是的,但返回类型不是签名的一部分,即包含两个返回类型不同的方法的类不会编译。

我如何确保保存和加载文件的向后兼容性

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

如果新方法比旧方法有另一个签名,那就可以了。

例如,它们的签名类型不同:

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

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

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

在该级别上没有向后兼容性。如果不将旧的加载到不同的AppDomain中,就不能将旧的和新的混合在一起。在创建东西之前,请三思而后行,并根据需要调整旧代码以适应新代码。

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

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

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

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

在您的情况下,如果不应该使用旧方法,除了您不想重写的遗留代码之外,我建议您使用Obsolete属性。这将帮助开发人员通过在编译时生成警告(如果设置了标志,甚至会生成编译错误)来识别不推荐使用的方法:

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