2012-05-30 14 views
9

Nota: Ya he comprobado msdn, no aborda mi pregunta real, consulte a continuación.Usos para el atributo [Obsoleto (cadena, bool)] para .NET

Estoy tratando de usar el atributo obsoleto en un constructor (obviamente obsoleto) en una de mis clases. Aquí está el escenario:

Quiero forzar al desarrollador a actualizarse al nuevo constructor sin afectar el código ya existente y desplegado. De esta forma puedo implementar mi código en la producción muy bien, pero desde la perspectiva de los desarrolladores, cada vez que entran en su código, en lugar de simplemente recibir una "advertencia" que estoy seguro ignorarán, quiero que obtengan un compila el error porque el status quo ya no está bien.

Así que mi pregunta es, ¿afectará esto solo a los desarrolladores, o a todas las aplicaciones que llaman, o tengo todo el problema? código

muestra:

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 
    } 
} 

Todas y podrá apreciar toda la ayuda, gracias de antemano!

+1

Eso en realidad es una buena pregunta. Pero francamente, ¿por qué no simplemente lo intentas? Una prueba no parece ser tan difícil. Sin ánimo de ofender. –

+0

Creo que afectará a cualquier persona que compile contra la referencia de ensamblado. –

+0

La única razón por la que no estoy tratando de probarlo porque estoy extremadamente abatido por el tiempo y pensé que si alguien ya sabía que haría trampa :) – IWriteApps

Respuesta

11

Sí, esto afecta principalmente al compilador, cualquier código preconstruido no se verá afectado ... a menos que este código compruebe explícitamente este atributo. Por ejemplo, algún código de serialización (XmlSerializer, IIRC) comprueba esto, por lo que podría no ser completamente sin efectos secundarios ... pero en el código principal normalmente no se verá afectado hasta que intenten compilarse a continuación.

Por supuesto, si está utilizando este código de algo que utiliza la compilación dinámica (por ejemplo, ASP.NET sin precompilación), entonces todas las apuestas están desactivadas.

3

El atributo es solo una instrucción para el compilador. Los binarios existentes pueden seguir usando el constructor.

2

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

Esto solo se utilizará en tiempo de compilación, por el compilador. No afectará a las aplicaciones que ya se han implementado.

Como tal, este tendrá el comportamiento que está tratando de lograr.

2

Esto es lo que [Obsoleto] ya hace, no se necesita ayuda adicional. No es una advertencia de tiempo de compilación, genera un error:

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

+0

Sé de esta misma clase que la pregunta es que simplemente poner obsoleto solo le da al usuario un advertencia. Si usa el atributo sobrecargado para mostrar el error, aparece un error, solo quiero asegurarme de que esto no afecte a nuestros usuarios que usan código preexistente. – IWriteApps

+0

Para ser precisos, solo cuando el segundo parámetro de ObsoleteAttribute sea verdadero, el compilador emitirá un error. De lo contrario y de forma predeterminada, el compilador solo emitirá una advertencia (a menos que también compile con warnings-as-errors habilitados). –

+1

No es una advertencia cuando usa la sobrecarga del constructor que toma el argumento 'bool error' y pasa' true'. Que es lo que haces. Ningún código existente se ve afectado, solo el compilador verifica el atributo. –

Cuestiones relacionadas