.net - net - attribute usage c#
Notificar al desarrollador de un método "NO USAR" (12)
OK, sé lo que estás pensando, "¿por qué escribir un método que no quieres que la gente use?" ¿Derecha?
Bueno, en resumen, tengo una clase que necesita ser serializada a XML. Para que el XmlSerializer
haga su magia, la clase debe tener un constructor vacío predeterminado:
public class MyClass
{
public MyClass()
{
// required for xml serialization
}
}
Entonces, necesito tenerlo, pero no quiero que la gente lo use , entonces ¿hay algún atributo que pueda utilizarse para marcar el método como "NO USAR"?
Estaba pensando en usar el atributo Obsoleto (ya que esto puede detener la compilación), pero eso simplemente parece un poco "incorrecto", ¿hay alguna otra forma de hacerlo, o tengo que seguir adelante y morder la bala? :)
Actualizar
De acuerdo, acepté la respuesta de Keith, ya que supongo que en lo más profundo de mi corazón, estoy totalmente de acuerdo. Es por eso que hice la pregunta en primer lugar, no me gusta la noción de tener el atributo Obsoleto .
Sin embargo...
Todavía hay un problema, mientras se nos notifica en intellisense, idealmente, nos gustaría romper la construcción, entonces ¿hay alguna manera de hacer esto? Tal vez crear un atributo personalizado?
Se ha creado una pregunta más específica aquí .
De hecho, me inclinaría a estar en desacuerdo con todos los que defienden el uso de ObsoleteAttribute
ya que la documentación de MSDN dice que:
Al marcar un elemento como obsoleto se informa a los usuarios que el elemento se eliminará en futuras versiones del producto.
Dado que los constructores genéricos para la serialización de XML no deberían eliminarse de la aplicación, no se aplicaría solo en caso de que un desarrollador de mantenimiento no esté familiarizado con el funcionamiento de la serialización XML.
De hecho, he estado usando el método de Keith de simplemente señalar que el constructor se usa para la serialización en la documentación XML para que aparezca en Intellisense.
Estoy usando ObsoleteAttribute
.
Pero también puedes tener algunos comentarios por supuesto.
Y finalmente elimínalo completamente si puedes (no tienes que mantener la compatibilidad con algo viejo). Esa es la mejor manera.
Leí el encabezado e inmediatamente pensé en "atributo obsoleto". Qué tal si
/// <summary>
/// do not use
/// </summary>
/// <param name="item">don''t pass it anything -- you shouldn''t use it.</param>
/// <returns>nothing - you shouldn''t use it</returns>
public bool Include(T item) {
....
Lo que estás buscando es la clase ObsoleteAttribute
:
using System;
public sealed class App {
static void Main() {
// The line below causes the compiler to issue a warning:
// ''App.SomeDeprecatedMethod()'' is obsolete: ''Do not call this method.''
SomeDeprecatedMethod();
}
// The method below is marked with the ObsoleteAttribute.
// Any code that attempts to call this method will get a warning.
[Obsolete("Do not call this method.")]
private static void SomeDeprecatedMethod() { }
}
Puede construir su propia clase derivada de Attribute
, decir NonCallableAttribute
para calificar los métodos, y luego agregar a su tarea de análisis de código de construcción / CI la verificación para monitorear si algún código está usando esos métodos.
En mi opinión, no puedes forzar a los desarrolladores a no usar el método, pero podrías detectar cuándo alguien viola la regla lo más pronto posible y solucionarlo.
Puedes usar:
[ System.ComponentModel.EditorBrowsable ( System.ComponentModel.EditorBrowsableState.Never )]
para que no aparezca en Intellisence. Si el consumidor todavía quiere usarlo, puede, pero no será tan reconocible.
Sin embargo, el punto de Keith sobre la ingeniería sigue en pie.
Sí, lo hay.
Escribí esta publicación sobre eso. Trabajando con el diseñador .
Y aquí está el código:
public class MyClass
{
[Obsolete("reason", true)]
public MyClass()
{
// required for xml serialization
}
}
Separe su objeto serializable de su objeto de dominio.
Si una clase es [Serialisable]
(es decir, puede copiarse en el lugar según sea necesario) se necesita deserializar el constructor param-less.
Supongo que quiere forzar el acceso de su código para pasar los valores predeterminados de sus propiedades a un constructor parametrizado.
Básicamente, estás diciendo que está bien que el XmlSerializer
haga una copia y luego establezca las propiedades, pero no quieres tu propio código.
Hasta cierto punto, creo que esto es un exceso de diseño.
Simplemente agregue comentarios XML que detallen qué propiedades necesitan inicialización (y qué hacer).
No use [Obsolete]
, porque no lo es. Reserve eso para los métodos realmente obsoletos.
Wow, ese problema también me está molestando.
También necesita constructores por defecto para NHibernate, pero quiero obligar a las personas a NO usar inicializadores de objetos C # 3.0 para que las clases pasen por el código de constructor.
ObsoleteAttribute
probablemente funcione en su situación: incluso puede provocar que la compilación se rompa si se usa ese método.
Como las advertencias obsoletas ocurren en tiempo de compilación, y dado que la reflexión necesaria para la serialización ocurre en tiempo de ejecución, marcar ese método como obsoleto no romperá la serialización, pero advertirá a los desarrolladores que el método no está allí para ser utilizado.
throw new ISaidDoNotUseException();