我什么时候应该使用 [Obsolete] 属性,什么时候应该删除我的代码?
When should I use the [Obsolete] attribute and when should I delete my code?
[Obsolete]
的作用本质上是停止一个class/function被使用,但仍然在代码中维护它以供记录。
为什么应该使用 [Obsolete]
而不是仅仅删除或注释掉代码,有什么好的理由吗?如果你有源代码控制,这个问题就更重要了,所以没有必要保留代码以供参考,因为它会在 SC 中。
我很好奇什么是最佳实践?
ObsoleteAttribute 的文档很好地描述了它存在的原因...
Marking an element as obsolete informs users that the element will be removed in future versions of the product.
如评论中所述,这显然只有在其他人使用您的程序集版本时才真正有用。
Obsolete
属性将程序实体标记为不再推荐使用。每次使用标记为过时的实体随后都会生成警告或错误,具体取决于属性的配置方式。
这里是来自参考源的 Hashtable
比较器的示例。
[Obsolete("Please use KeyComparer properties.")]
protected IComparer comparer
{
get
{
if( _keycomparer is CompatibleComparer) {
return ((CompatibleComparer)_keycomparer).Comparer;
}
else if( _keycomparer == null) {
return null;
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
set
{
if (_keycomparer is CompatibleComparer) {
CompatibleComparer keyComparer = (CompatibleComparer)_keycomparer;
_keycomparer = new CompatibleComparer(value, keyComparer.HashCodeProvider);
}
else if( _keycomparer == null) {
_keycomparer = new CompatibleComparer(value, (IHashCodeProvider)null);
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
}
它主要用于向后兼容,因此当您对具有不同预期行为的功能进行新实现时,任何使用旧功能的代码仍然有效,但您要确保您的库的新用途使用新的实现。
如果您正在维护第三方正在使用的库,您应该制定一个路线图,说明何时以及如果 过时的功能将被删除。如果它很重要,因为很多时候你只是表明不再维护该功能,应该使用新功能。
在内部,它可以用于重构以逐步替换实现不佳但有效的功能。您将其标记为已过时并开始处理警告,直到您看不到更多警告,然后您可以继续安全地删除它。
请注意,这是基于更新遗留代码库的经验得出的意见,没有达成共识。
[Obsolete]
的作用本质上是停止一个class/function被使用,但仍然在代码中维护它以供记录。
为什么应该使用 [Obsolete]
而不是仅仅删除或注释掉代码,有什么好的理由吗?如果你有源代码控制,这个问题就更重要了,所以没有必要保留代码以供参考,因为它会在 SC 中。
我很好奇什么是最佳实践?
ObsoleteAttribute 的文档很好地描述了它存在的原因...
Marking an element as obsolete informs users that the element will be removed in future versions of the product.
如评论中所述,这显然只有在其他人使用您的程序集版本时才真正有用。
Obsolete
属性将程序实体标记为不再推荐使用。每次使用标记为过时的实体随后都会生成警告或错误,具体取决于属性的配置方式。
这里是来自参考源的 Hashtable
比较器的示例。
[Obsolete("Please use KeyComparer properties.")]
protected IComparer comparer
{
get
{
if( _keycomparer is CompatibleComparer) {
return ((CompatibleComparer)_keycomparer).Comparer;
}
else if( _keycomparer == null) {
return null;
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
set
{
if (_keycomparer is CompatibleComparer) {
CompatibleComparer keyComparer = (CompatibleComparer)_keycomparer;
_keycomparer = new CompatibleComparer(value, keyComparer.HashCodeProvider);
}
else if( _keycomparer == null) {
_keycomparer = new CompatibleComparer(value, (IHashCodeProvider)null);
}
else {
throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
}
}
}
它主要用于向后兼容,因此当您对具有不同预期行为的功能进行新实现时,任何使用旧功能的代码仍然有效,但您要确保您的库的新用途使用新的实现。
如果您正在维护第三方正在使用的库,您应该制定一个路线图,说明何时以及如果 过时的功能将被删除。如果它很重要,因为很多时候你只是表明不再维护该功能,应该使用新功能。
在内部,它可以用于重构以逐步替换实现不佳但有效的功能。您将其标记为已过时并开始处理警告,直到您看不到更多警告,然后您可以继续安全地删除它。
请注意,这是基于更新遗留代码库的经验得出的意见,没有达成共识。