更新库时,准确传达任何重大更改很重要。不幸的是,C#中存在许多不同类型的重大更改,其中一些非常微妙。
显而易见的是诸如更改类型名称或类型成员的名称。
细微的东西是诸如adding a new default parameter(二进制兼容性被破坏,但保留了源兼容性)或renaming a parameter(二进制兼容性被维护,但是了源兼容性被破坏)之类的东西。
我不确定要重命名通用参数。
例如,在某些情况下需要更改:
public class Foo<T>
{
public T Bar(){ /* something */ }
}
到
public class Foo<TMoreDescriptive>
{
public TMoreDescriptive Bar(){ /* something */ }
}
两次发布的库之间可能会破坏消费者?
答案 0 :(得分:5)
更改通用类型参数的名称与更改方法参数的名称相比,没有什么大的改变。 According to the C# Programming Guide,在使用者使用通用类型参数实例化类时,将替换通用类型-除非通过文档或类似IntelliSense的功能,否则使用者不会获得原始类型参数的名称。
该指南还提到,泛型类型参数可以通过反射获得-这很可能是您的消费者能够以编程方式检查名称更改的唯一向量,类似于方法参数。
答案 1 :(得分:2)
泛型在编译时解析,以便进行编译时类型检查。确实,允许进行这些检查是他们的目的。
虽然我都不知道任何信息,但我看不到这会破坏任何东西。
保持源兼容性。
并且二进制兼容性应该只关心其中的内容,而不是T / TMoreDescriptive / type占位符。
值得指出的是,.NET关于加载的.dll 非常具体。制作.NET时,我们至少有十年的经验,仅使用dll名称会导致版本问题。因此,.NET使用DLL的名称,版本和公共令牌(例如GUID)来确定它确实是编译器所针对的 exact DLL。因此,如果要进行重大更改,只需确保获得另一个公共令牌即可解决。
答案 2 :(得分:2)
由于您只是在更改通用类型占位符的名称,因此这应该不是问题。但是,作为一般规则,您不应使事情过于复杂。如果您的通用类只有一种遗传类型,那么T和TSomething一样清晰。实际上,使用T已成为泛型的标准。
但是,如果泛型类使用两种类型,则描述性更好的名称会更好。所以,
public class Foo<T1, T2>
{
public T1 Bar(T2 something) { return ... }
}
会很糟糕。您宁愿拥有
public class Foo<TResult, TSource>
{
public TResult Bar(TSource something) { return ... }
}
但是同样,如果只有一种类型,请坚持使用T。更改名称并不重要,因为它只是一个占位符。