好的,我知道您在想什么,“为什么写一种您不希望人们使用的方法?”正确的?

嗯,简而言之,我有一个类需要序列化为 XML。为了 XmlSerializer 为了发挥它的魔力,该类必须有一个默认的空构造函数:

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

所以,我需要拥有它,但我不希望人们拥有它 使用 它,所以 是否有任何属性可用于将该方法标记为“请勿使用”?

我正在考虑使用 过时的 属性(因为这可以停止构建),但这似乎有点“错误”,有没有其他方法可以做到这一点,或者我需要继续硬着头皮?:)

更新

好吧,我接受了Keith的回答,因为我内心深处认为我完全同意。这就是我首先问这个问题的原因,我不喜欢拥有 过时的 属性。

然而...

那里 仍然是一个问题,当我们在智能感知中收到通知时,理想情况下,我们想破坏构建,那么有什么办法可以做到这一点吗?也许创建一个自定义属性?

已创建更集中的问题 这里.

有帮助吗?

解决方案

如果一个类是 [Serialisable] (IE。可以根据需要在各处复制)需要无参数构造函数来反序列化。

我猜您想强制代码的访问权限将属性的默认值传递给参数化构造函数。

基本上你是说这对 XmlSerializer 制作副本然后设置属性,但您不希望自己的代码这样做。

在某种程度上,我认为这是过度设计。

只需添加 XML 注释来详细说明哪些属性需要初始化(以及初始化什么)。

不要使用 [Obsolete], ,因为事实并非如此。将其保留给真正弃用的方法。

其他提示

您可以使用:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

这样它就不会出现在Intellisence中。如果消费者仍然想使用它,他们可以,但它不会那么容易被发现。

尽管如此,基思关于过度工程的观点仍然成立。

我读了标题并立即想到“过时的属性”。怎么样

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

我实际上倾向于不同意所有提倡使用 ObsoleteAttribute 正如 MSDN 文档所说:

将元素标记为过时会通知用户该元素将在产品的未来版本中删除。

由于 XML 序列化的通用构造函数不应该从应用程序中删除,因此我不会应用它,以防万一维护开发人员不熟悉 XML 序列化的工作原理。

我实际上一直在使用 基思的 方法只是注意到构造函数用于 XML 文档中的序列化,以便它显示在 Intellisense 中。

你可以建立自己的 Attribute 派生类,比如说 NonCallableAttribute 限定方法,然后将检查添加到构建/CI 代码分析任务中以监视是否有任何代码正在使用这些方法。

在我看来,你确实不能强迫开发人员不使用该方法,但你可以尽快检测到有人违反规则并修复它。

哇,这个问题也困扰着我。

您还需要 NHibernate 的默认构造函数,但我想强制人们不要使用 C# 3.0 对象初始值设定项,以便类通过构造函数代码。

throw new ISaidDoNotUseException();

将可序列化对象与域对象分开。

您正在寻找的是 ObsoleteAttribute 班级:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

ObsoleteAttribute 可能会在你的情况下工作 - 如果使用该方法,你甚至可能导致构建中断。

由于过时警告发生在编译时,并且由于序列化所需的反射发生在运行时,因此将该方法标记为过时不会破坏序列化,但会警告开发人员该方法不可用。

我正在使用 ObsoleteAttribute.

当然,您也可以发表一些评论。

最后,如果可以的话,将其完全删除(不必保持与旧内容的兼容性)。这是最好的办法。

是的,有。

我写了这篇关于它的博文 与设计师合作.

这是代码:


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top