【发布时间】:2010-05-28 12:11:44
【问题描述】:
我想知道仅在运行时检查过时的属性?
认为您有两个程序集。程序集 A 使用程序集 B 中的方法。之后,我们将程序集 B 中的方法标记为过时,这会在编译程序集 A 时导致编译时错误。
到目前为止没有问题,但问题是旧的程序集 A 是否继续与新的程序集 B 一起使用?谢谢
【问题讨论】:
标签: c# .net attributes obsolete
我想知道仅在运行时检查过时的属性?
认为您有两个程序集。程序集 A 使用程序集 B 中的方法。之后,我们将程序集 B 中的方法标记为过时,这会在编译程序集 A 时导致编译时错误。
到目前为止没有问题,但问题是旧的程序集 A 是否继续与新的程序集 B 一起使用?谢谢
【问题讨论】:
标签: c# .net attributes obsolete
这取决于你在做什么。 [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 属性是库开发人员让使用库的人知道他们应该寻求使用不同的方法来实现他们需要的一种方式。
要回答您的问题,是的,旧程序集 A 将继续与新程序集 B 一起使用。(只要程序集版本保持不变)
【讨论】:
[Obsolete("nitpicking", true)] 应该在编译时给你一个错误,即使你禁用了将警告显示为错误。