12

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

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

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

4

2 回答 2

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);
    }
}

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

于 2010-05-28T12:26:01.417 回答
6

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

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

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

于 2010-05-28T12:16:11.823 回答