9

注意:我已经检查了 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
   }
}

任何和所有的帮助将不胜感激,在此先感谢!

4

4 回答 4

11

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

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

于 2012-05-30T17:37:22.927 回答
3

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

于 2012-05-30T17:36:35.633 回答
2

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

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

于 2012-05-30T17:37:58.230 回答
2

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

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

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

于 2012-05-30T17:36:42.600 回答