.net - 使用 [Obsolete] 属性来指示开发人员不要使用 API 的某些部分是一种好习惯吗?

标签 .net obsolete code-inspection

最近我一直在写一些可序列化的对象,它也处理特定的逻辑并具有特定的生命周期。为了使其正常工作,必须使用适当的构造函数对其进行实例化,该构造函数需要强制参数。但是,出于序列化目的,我还必须添加一个公共(public)默认构造函数。

该对象将由我们的 API 公开可用,并且第 3 方开发人员应该能够实例化和使用它。尽管会有适当的文档说明如何正确操作该对象,但不能保证有人会尝试使用不正确的构造函数——然后遇到麻烦。

我正在寻找一种巧妙的方法来应用一些指导,而 3rd 方开发人员正在编写他们的代码。 Obsolete我想到了属性——我可以用适当的注释来注释序列化构造函数作为消息。然后该消息将出现在输出警告中,并将开发人员引导至正确的代码行。此外,Visual Studio 和使用的任何代码检查插件都会适本地突出显示构造函数的用法。

在这种方法中困扰我的是 Obsolete 的目的属性完全不同。它的语义含义是被装饰的项目已被弃用,并且可能会在以后的版本中被删除。在序列化构造函数场景中这是错误的,并且该属性的用法和含义之间会存在差异。更不用说某些开发部门可能启用的“将警告视为错误”选项......

所以,问题是 - 对于这种属性的使用,这是一种可接受的做法吗?是否有任何其他合法和通用的方法来达到相同的效果(通用我的意思是不依赖第 3 方代码检查插件等 - 我不控制谁使用代码以及他们的设置是什么)?

关于下面答案中的评论(这对我仍然有用),我必须澄清我在可继承类上使用 protected 默认构造函数。构造函数用于支持 XML 序列化,但不应用于在业务逻辑中初始化类。继承类应该调用其他一些基本构造函数,编写继承类的开发人员需要知道这一点。尽管如此,如果需要,从该代码派生的开发人员还必须能够为其继承的类启用 XML 序列化。

最佳答案

嗯,我认为这不是一个好的解决方案。但是,您真的需要默认构造函数吗?

请注意,序列化 API 具有创建未初始化实例的方法,根本不需要使用构造函数(请参阅 MSDN:FormatterServices.GetUninitializedObject)。

此外,普通的自定义序列化构造函数不是默认构造函数,而是采用 SerializationInfo 和 StreamingContext 的构造函数。如果您有一些自定义序列化,您也可以通过将默认构造函数设置为内部并应用 InternalsVisibleToAttribute 来解决您的问题。用于执行序列化的程序集。

关于.net - 使用 [Obsolete] 属性来指示开发人员不要使用 API 的某些部分是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798884/

相关文章:

.net - 在 Azure Web App Service 上,有时会出现字符 �(#65533),但随后一切恢复正常,它们是同一页面

.net - 如何确定 System.Diagnostics.Process 是 32 位还是 64 位?

linux - 什么是 (PF_INET,SOCK_PACKET) 的正确替代品

.net - MonoTouch : UIImage. asJPEG 需要一个 NSError 对象

c# - 使用 ReSharper 您可以选择一个规则来确保返回的值是 C# 的文字或变量

用于集成到 CI 管道中的 Android Studio 代码检查 shell 脚本

c# - 方法返回在 C# 控制台应用程序中同步运行的任务

.net - Elasticsearch.NET 故障转移似乎不排除死节点

c++ - 我应该使用什么来代替 AddPort?

python - pep8 - 整个项目的统计数据