2010-05-28 4 views
11

Интересно, что устаревший атрибут проверяется только во время выполнения?Атрибут Obsolete проверяется только во время компиляции?

Думайте, что у вас есть две сборки. В сборке A используется метод из сборки B. После этого мы отмечаем метод в сборке B как устаревший, что вызывает ошибку компиляции во время компиляции сборки A.

Проблем пока нет, но вопрос в том, будет ли старая сборка A продолжать работать с новой Ассамблеей B или нет? Спасибо

ответ

13

Это зависит от того, что вы делаете. Атрибут [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 это среда тоже - не часть компилятора)

+0

Спасибо за подробный ответ Marc. – mkus

+0

У меня проблемы с этим. Я отметил некоторые записи в перечислении с [Устаревшим] в веб-службе. Клиенты, потребляющие услугу, больше не будут получать эти записи перечисления во время выполнения. Но ссылки в Интернете все равно будут включать их. Это похоже на ошибку в сериализации для меня - или в лучшем случае плохое дизайнерское решение. Предоставление значения времени выполнения этого флага полностью наносит ущерб его цели, на мой взгляд. – LOAS

6

Построение сборки, которая использует метод из другой сборки, которая отмечена как «Устаревшая», вызывает предупреждение о времени компиляции (если у вас нет предупреждений «отображать предупреждения как ошибки»).

Нет ничего, что помешало бы вам использовать этот метод, пока он остается в ссылочной сборке. Атрибут Obsolete существует как способ для разработчиков библиотек, чтобы люди, которые используют библиотеку, знали, что они должны искать другой метод для достижения того, что им нужно.

Чтобы ответить на ваш вопрос, да, старая сборка А будет продолжать работать с новой сборочной B. (обеспечение версии сборки остается неизменным)

+0

+1 Избили меня к нему. –

+2

Это не гарантируется во всех случаях; см. мой ответ, почему ... –

+0

'[Устаревший (" nitpicking ", true)]' должен давать вам ошибку во время компиляции, если ссылки указаны напрямую, даже если у вас есть _display предупреждения, поскольку ошибки_ отключены. – mbx