2012-05-30 10 views
9

Nota: ho già controllato msdn, non risolve la mia domanda effettiva, vedi sotto.Utilizza per l'attributo [Obsoleto (stringa, bool)] per .NET

Sto cercando di utilizzare l'attributo obsoleto su un costruttore (ovviamente obsoleto) in una delle mie classi. Ecco lo scenario:

Desidero essere in grado di forzare lo sviluppatore ad aggiornare il nuovo costruttore senza influire sul codice già esistente e distribuito. In questo modo posso distribuire il mio codice alla produzione, ma dal punto di vista degli sviluppatori, ogni volta che entrano nel loro codice, invece di ricevere un "avvertimento" che sono sicuro ignoreranno, voglio che ottengano un compila errore perché lo status quo non è più ok.

Quindi la mia domanda è: interesserà solo gli sviluppatori, o tutte le app di chiamata o ho sbagliato tutto? Codice

campione:

public class MyClass 
{ 
    private string _userID; //new code 

    [Obsolete("This constructor is obsolete, please use other constructor.", true)] 
    public MyClass() 
    { 
     _userID = ""; //defaulting to empty string for all those using this constructor 
    } 

    public MyClass(string userID) 
    { 
     _userID = userID; //this is why they need to use this constructor 
    } 
} 

ne e tutto l'aiuto sarà apprezzato, grazie in anticipo!

+1

Questa è davvero una buona domanda. Ma francamente, perché non lo provi semplicemente? Un test non sembra essere così difficile. Senza offesa però. –

+0

Credo che effettuerà la compilazione di chiunque contro il riferimento all'assembly. –

+0

L'unico motivo per cui non sto provando a provarlo perché sono estremamente scricchiolante per il tempo e ho pensato che se qualcuno lo sapesse già avrei imbrogliato :) – IWriteApps

risposta

11

Sì, questo influisce principalmente sul compilatore - qualsiasi codice precostruito non sarà interessato ... a meno che tale codice controlli esplicitamente questo attributo. Ad esempio, alcuni codici di serializzazione (XmlSerializer, IIRC) verificano questo - quindi non è interamente privo di effetti collaterali ... ma in linea di principio il codice esistente di solito non viene modificato fino a quando non tentano di compilare successivamente.

Ovviamente, se si utilizza questo codice da qualcosa che utilizza la compilazione dinamica (ad esempio ASP.NET senza pre-compilazione), quindi tutte le scommesse sono disattivate.

3

L'attributo è solo un'istruzione per il compilatore. I binari già esistenti possono ancora utilizzare il costruttore.

2

So my question is, will this affect only developers, or all calling apps, or do I have the whole thing wrong?

Questo verrà utilizzato solo in fase di compilazione, dal compilatore. Non influenzerà le applicazioni che sono già state distribuite.

Come tale, questo avrà il comportamento che si sta tentando di realizzare.

2

Questo è ciò che [Obsoleta] già fa, non è necessario alcun ulteriore aiuto. Non è un avviso di compilazione, genera un errore:

error CS0619: 'ConsoleApplication1.MyClass.MyClass()' is obsolete: 'This constructor is obsolete, please use other constructor.'

+0

So da questa stessa classe che la domanda riguarda semplicemente il fatto che mettere semplicemente obsoleto offre all'utente solo avvertimento. Se si utilizza l'attributo sovraccarico per visualizzare l'errore, viene visualizzato l'errore, ma voglio solo assicurarmi che ciò non influisca sui nostri utenti che utilizzano codice preesistente. – IWriteApps

+0

Per la precisione, solo quando il secondo parametro di ObsoleteAttribute è true, il compilatore emetterà un errore. Altrimenti e per impostazione predefinita, il compilatore emetterà solo un avviso (a meno che non si compili anche con gli avvisi-come-errori abilitati). –

+1

Non si tratta di un avviso quando si utilizza il sovraccarico del costruttore che accetta l'argomento 'bool error' e si passa' true'. Che è quello che fai Nessun codice esistente è interessato, solo il compilatore verifica l'attributo. –