2010-05-28 13 views
11

Zastanawiam się, że przestarzały atrybut jest sprawdzany tylko w czasie wykonywania?Czy atrybut przestarzały jest zaznaczony tylko podczas kompilacji?

Pomyśl, że masz dwa zjazdy. Zespół A stosuje metodę z zespołu B. Następnie oznaczamy metodę w zespole B jako przestarzałą, co powoduje błąd czasu kompilacji podczas kompilowania zespołu A.

Nie stanowi problemu, ale pytanie brzmi, czy starszy zespół A nadal pracować z nowym zespołem B, czy nie? Dzięki

Odpowiedz

13

To zależy od tego, co robisz. Atrybut [Obsolete] jest głównie do użytku w czasie kompilacji, ale należy pamiętać, że niektóre części środowiska wykonawczego mają inne zachowanie, gdy jest obecne (patrz poniżej). To może powodować problemy, nawet do istniejącego kodu, który nie jest przebudowywany, więc musimy stwierdzić, że , [Obsolete] nie jest sprawdzany tylko w czasie kompilacji.

Na przykład poniższy kod napisze Foo ale nie 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 jest zbyt Runtime - nie jest częścią kompilatora)

+0

Dzięki za szczegółową odpowiedź Marc. – mkus

+0

Wpadłem na ten problem. W serwisie internetowym zaznaczyłem kilka wpisów w wyliczeniu [Przestarzałe]. Klienci korzystający z usługi nie będą już otrzymywać tych wyliczeń w czasie wykonywania. Jednak odwołania do stron internetowych nadal będą je zawierały. Wydaje się, że to błąd w serializacji - lub w najlepszym przypadku kiepska decyzja projektowa. Podkreślenie tego znaczenia środowiska wykonawczego flagi całkowicie negatywnie wpływa na jego cel. – LOAS

6

Budowanie zestawu korzystającego z metody z innego zestawu oznaczonego jako Przestarzałe powoduje ostrzeżenie o czasie kompilacji (chyba, że ​​włączono opcję "wyświetlaj ostrzeżenia jako błędy").

Nic nie powstrzyma cię od użycia tej metody, dopóki nie zostanie w zespole referencyjnym. Przestarzały atrybut jest dla twórców bibliotek sposobem na umożliwienie ludziom, którzy korzystają z biblioteki, wiedzy, że powinni oni korzystać z innej metody, aby osiągnąć to, czego potrzebują.

Aby odpowiedzieć na to pytanie, tak, starszy zespół A będzie nadal działać z nową montażowej B. (zapewniającej wersję montażową pozostaje taka sama)

+0

+1 beat mnie do niego. –

+2

To nie jest gwarantowane we wszystkich przypadkach; zobacz moją odpowiedź na pytanie dlaczego ... –

+0

'[Obsolete (" nitpicking ", true)]' powinno dać błąd podczas kompilacji, jeśli odwołanie się do niego bezpośrednio, nawet jeśli wyświetlasz _dane ostrzeżenia jako błędy_ wyłączone. – mbx

Powiązane problemy