Устаревший атрибут проверяется только во время компиляции? - PullRequest
11 голосов
/ 28 мая 2010

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

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

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

Ответы [ 2 ]

14 голосов
/ 28 мая 2010

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

6 голосов
/ 28 мая 2010

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

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

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

...