2010-05-28 58 views
11

我不知道只在运行时检查过时的属性吗?仅在编译时检查Obsolete属性?

认为你有两个组件。程序集A使用程序集B中的方法。之后,我们将程序集B中的方法标记为过时,这会在编译程序集A时导致编译时错误。

到目前为止没有问题,但问题是旧程序集A是否继续与新的B组合还是不合作?谢谢

回答

13

这取决于你在做什么。 [Obsolete]属性为主要为供编译时使用,但请注意,运行时的某些部分在存在时具有不同的行为(请参见下文)。它可能会导致问题,即使是现有的代码不重建,所以我们必须得出结论,编号[Obsolete]不仅仅在编译时检查。

例如,下面的代码会写Foo但不Bar

using System; 
using System.Xml.Serialization; 
public class Data 
{ 
    public int Foo { get; set; } 
    [Obsolete] public int Bar {get;set;} 

    static void Main() 
    { 
     var data = new Data { Foo = 1, Bar = 2 }; 
     new XmlSerializer(data.GetType()).Serialize(Console.Out, data); 
    } 
} 

XmlSerializer是一个运行时过 - 不是编译器的一部分)

+0

感谢您的详细回复Marc。 – mkus 2010-05-28 13:40:58

+0

我遇到了这个问题。我在Web服务中用[Obsolete]标记了一些枚举条目。使用该服务的客户端将不再在运行时接收这些枚举条目。但是网络引用仍然会包含它们。这看起来像是我的序列化中的一个错误 - 或者充其量只是一个糟糕的设计决策。在我看来,赋予这个标志运行时的意义完全失败了。 – LOAS 2012-09-03 05:57:52

6

构建一个使用另一个程序集标记为Obsolete的方法的程序集会导致编译时警告(除非您将'显示警告显示为错误')。

没有什么能阻止你使用这种方法,而它仍然在引用程序集中。 Obsolete属性是图书馆开发人员的一种方式,让图书馆使用者知道他们应该使用不同的方法来实现他们需要的东西。

要回答你的问题,是的,旧的装配A将继续与新的装配B.工作(提供程序集的版本保持不变)

+0

+1打我给它。 – 2010-05-28 12:17:16

+2

这在所有情况下都不能保证;看到我的回复为什么...... – 2010-05-28 12:26:23

+0

'[Obsolete(“nitpicking”,true)]'应该会在编译时给你一个错误,如果直接引用,即使你的_display警告为errors_ disabled。 – mbx 2014-02-27 13:27:54