gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:29:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com