【问题标题】:Uses for [Obsolete(string, bool)] attribute for .NET用于 .NET 的 [Obsolete(string, bool)] 属性
【发布时间】:2012-05-30 17:30:13
【问题描述】:

注意:我已经检查了 msdn,它并没有解决我的实际问题,见下文。

我正在尝试在我的一个类中的(显然已过时的)构造函数上使用过时的属性。这是场景:

我希望能够强制开发人员更新到新的构造函数,而不影响已经存在和部署的代码。这样我就可以很好地将我的代码部署到生产环境中,但是从开发人员的角度来看,每当他们进入他们的代码时,而不是仅仅得到一个我确信他们会忽略的“警告”,我希望他们得到一个编译错误,因为现状已经不行了。

所以我的问题是,这只会影响开发人员,还是所有调用应用程序,还是我错了?

示例代码:

public class MyClass
{
   private string _userID; //new code

   [Obsolete("This constructor is obsolete, please use other constructor.", true)]
   public MyClass()
   {
      _userID = ""; //defaulting to empty string for all those using this constructor
   }

   public MyClass(string userID)
   {
      _userID = userID; //this is why they need to use this constructor
   }
}

我们将不胜感激,提前致谢!

【问题讨论】:

  • 这实际上是一个好问题。但坦率地说,你为什么不简单地尝试一下呢?考试好像没那么难。不过没有冒犯。
  • 我相信它会影响任何根据程序集参考进行编译的人。
  • 我不尝试测试它的唯一原因是因为我非常紧张时间并且认为如果有人已经知道那么我会作弊:)

标签: c# .net methods attributes obsolete


【解决方案1】:

是的,这主要影响编译器 - 任何预构建的代码都不会受到影响...除非该代码明确检查此属性。例如,一些序列化代码(XmlSerializer、IIRC)会对此进行检查 - 所以它可能不是完全无副作用...但原则上现有代码不会通常会受到影响,直到他们尝试下一次编译。

当然,如果您从使用动态编译的东西(例如没有预编译的 ASP.NET)中使用此代码,那么 所有赌注都没有

【讨论】:

    【解决方案2】:

    该属性只是对编译器的一条指令。已经存在的二进制文件仍然可以使用构造函数。

    【讨论】:

      【解决方案3】:

      所以我的问题是,这只会影响开发人员,还是所有调用应用程序,还是我错了?

      这只会在编译时由编译器使用。它不会影响已经部署的应用程序。

      因此,这将具有您试图完成的行为。

      【讨论】:

        【解决方案4】:

        这是 [Obsolete] 已经做的,不需要额外的帮助。这不是编译时警告,它会产生错误:

        错误 CS0619:“ConsoleApplication1.MyClass.MyClass()”已过时: '此构造函数已过时,请使用其他构造函数。'

        【讨论】:

        • 我从这门课上知道,问题在于简单地过时只会给用户一个警告。如果您使用重载属性来显示错误然后显示错误,我只是想确保这不会影响我们使用预先存在的代码的用户。
        • 准确来说,只有当ObsoleteAttribute的第二个参数为true时,编译器才会报错。否则,默认情况下,编译器只会发出警告(除非您还启用了警告作为错误进行编译)。
        • 当您使用带有bool error 参数的构造函数重载并且您传递true 时,这不是警告。这就是你所做的。现有代码不受影响,只有编译器检查属性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 2013-11-11
        相关资源
        最近更新 更多