是否仅在编译时检查过时属性?

mku*_*kus 11 .net c# attributes obsolete

我想知道只在运行时检查过时的属性?

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

到目前为止没有问题,但问题是旧的A组件是否继续与新的B组件一起工作?谢谢

Mar*_*ell 14

这取决于你在做什么.该[Obsolete]属性主要用于编译时,但要注意运行时的某些部分在存在时具有不同的行为(参见下文).这可能会导致问题,甚至现有的未重建代码,所以我们必须得出结论,NO,[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

(XmlSerializer也是运行时 - 不是编译器的一部分)

  • 我遇到了这个问题。我在网络服务中用 [Obsolete] 标记了枚举中的一些条目。使用该服务的客户端将在运行时不再接收这些枚举条目。但网络引用仍将包括它们。这对我来说似乎是序列化中的一个错误 - 或者充其量是一个糟糕的设计决策。在我看来,赋予这个标志运行时意义完全违背了它的目的。 (2认同)

Gre*_*g B 6

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

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

要回答你的问题,是的,较旧的装配件A将继续使用新的装配件B.(提供装配版本保持不变)