【问题标题】:Is Obsolete attribute only checked at Compile time?是否仅在编译时检查过时属性?
【发布时间】:2010-05-28 12:11:44
【问题描述】:

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

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

到目前为止没有问题,但问题是旧的程序集 A 是否继续与新的程序集 B 一起使用?谢谢

【问题讨论】:

    标签: c# .net attributes obsolete


    【解决方案1】:

    这取决于你在做什么。 [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);
        }
    }
    

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

    【讨论】:

    • 感谢您的详细回复马克。
    • 我遇到了这个问题。我在网络服务中用 [Obsolete] 标记了枚举中的一些条目。使用该服务的客户端将不再在运行时收到这些枚举条目。但网络参考仍将包括它们。这对我来说似乎是序列化中的一个错误——或者充其量是一个糟糕的设计决定。在我看来,赋予这个标志运行时意义完全违背了它的目的。
    【解决方案2】:

    构建使用来自另一个程序集的方法的程序集被标记为已过时会导致编译时警告(除非您启用了“将警告显示为错误”)。

    没有什么可以阻止您使用此方法,而它仍保留在引用的程序集中。 Obsolete 属性是库开发人员让使用库的人知道他们应该寻求使用不同的方法来实现他们需要的一种方式。

    要回答您的问题,是的,旧程序集 A 将继续与新程序集 B 一起使用。(只要程序集版本保持不变)

    【讨论】:

    • 如果直接引用 [Obsolete("nitpicking", true)] 应该在编译时给你一个错误,即使你禁用了将警告显示为错误
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2020-11-14
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多