{
" /> {
" /> {
" />

首页 / 知识

关于.net:通知开发人员“请勿使用”方法

2023-04-13 05:16:00

关于.net:通知开发人员“请勿使用”方法

Notify Developer of a “DO NOT USE” Method

好吧,我知道您在想什么,"为什么写一种您不希望人们使用的方法?"对?

好吧,简而言之,我有一个需要序列化为XML的类。为了使XmlSerializer发挥作用,该类必须具有默认的空构造函数:

1
2
3
4
5
6
7
public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

因此,我需要它,但我不希望人们使用它,那么是否有任何属性可用于将该方法标记为"请勿使用"?

我当时正在考虑使用Obsolete属性(因为这可以停止构建),但这似乎有点"错误",还有其他方法可以这样做,还是我需要继续努力? :)

更新资料

好,我接受了基思的回答,因为我内心深处猜测,我完全同意。这就是为什么我首先问这个问题的原因,我不喜欢拥有过时属性的概念。

然而...

仍然存在一个问题,尽管在智能感知中收到通知时,理想情况下,我们想中断构建,所以有什么办法可以做到这一点?也许创建一个自定义属性?

在此创建了更集中的问题。


您可以使用:

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

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

Keiths关于工程的观点仍然存在。


如果一个类是[Serialisable](即可以根据需要在地方复制),则需要无参数的构造函数来反序列化。

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

基本上,您说的是XmlSerializer复制并设置属性是可以的,但是您不想自己的代码。

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

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

不要使用[Obsolete],因为不是。将其保留为真正不推荐使用的方法。


1
throw new ISaidDoNotUseException();

实际上,我倾向于不同意MSDN文档所说的提倡使用ObsoleteAttribute的每个人:

Marking an element as obsolete informs the users that the element will be removed in future versions of the product.

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

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


我读了标题,立即想到"过时的属性"。怎么样

1
2
3
4
5
6
7
    /// <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) {
    ....

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


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

在我看来,您确实不能强迫开发人员不使用该方法,但是您可以检测到有人何时尽快打破规则并加以解决。


已经有很多好的答案。
但是我认为最好的选择是使用可以使用参数化构造函数的序列化程序。
它不是您需要的序列化程序,但是例如,Entity Framework Core知道如何使用参数化的构造函数。

实体框架核心文档:

If EF Core finds a parameterized constructor with parameter names and
types that match those of mapped properties, then it will instead call
the parameterized constructor with values for those properties and
will not set each property explicitly.


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

您还需要NHibernate的默认构造函数,但我想强迫人们不要使用C#3.0对象初始化程序,以便类可以通过构造函数代码进行编码。


您正在寻找的是ObsoleteAttribute类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

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

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


是的,有。

我写了关于它的博客文章。

这是代码:

1
2
3
4
5
6
7
8
public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}


方法开发人员通知默认

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢