InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)
Generar archivos PDF con C#
TransactionScope - Simplificando el trabajo con transacciones.
LinQ To SQL - Un ejemplo sencillo
Cómo activar Intelisense (autocompletado) en el Web.config
Leer un campo XML de SQL Server 2005 con C#
TripleDES - Un ejemplo practico en C#
Mostrar un GridView dentro de un DataList
String.Format

Afiliados
La Web del programador
MundoProgramacion


 

Atributos de compilación

    Aunque la mayoría de los atributos son interpretados en tiempo de ejecución por el CLR u otras aplicaciones, hay una serie de atributos que tienen un significado especial en C# y condicionan el proceso de compilación. Estos son los que se explican a continuación.

Atributo System.AttributeUsage

    Ya hemos visto en este mismo tema que se usa para indicar dónde se pueden colocar los nuevos atributos que el programador defina, por lo que no se hará más hincapié en él.

Atributo System.Obsolete

    Puede preceder a cualquier elemento de un fichero de código fuente para indicar que ha quedado obsoleto. Admite los siguientes dos parámetros sin nombre:

  • Un primer parámetro de tipo string que contenga una cadena con un mensaje a mostrar cuando al compilar se detecte que se ha usado el elemento obsoleto.
  • Un segundo parámetro de tipo bool que indique si se ha de producir un aviso o un error cuando se detecte el uso del elemento obsoleto. Por defecto se muestra un aviso, pero si se da valor true a este parámetro, el mensaje será de error.

El siguiente ejemplo muestra como utilizar este atributo:

 
 using System;
 
 class Obsoleta
 {
  [Obsolete("No usar f(), que está obsoleto.", true)]
  public static void f()
  {}
  
  public static void Main()
  {
   f();
  }
 }

   Cuando se compile este programa, el compilador emitirá el siguiente mensaje de error:


 obsolete.cs(11,17): error CS0619: ‘Obsoleta.f()’ is obsolete: No usar f(), que está obsoleto.

    Si no se hubiese especificado a Obsolete su segundo parámetro, entonces el mensaje sería de aviso en vez de error:


 obsolete.cs(11,17): warning CS0618: ‘Obsoleta.f()’ is obsolete: No usar f(), que está obsoleto.

Atributo System.Diagnostics.Conditional

    Este atributo sólo puede prefijar definiciones de métodos, y permite definir si las llamadas al método prefijado se han de compilar o no. Puede usarse múltiples veces prefijando a un mismo método y toma un parámetro sin nombre de tipo string. Sólo se compilarán aquellas llamadas al método tales que en el momento de hacerlas esté definida alguna directiva de preprocesado con el mismo nombre que el parámetro de alguno de los atributos Conditional que prefijen la definición de ese método.

    Como se ve, este atributo es una buena forma de simplificar la escritura de código que se deba compilar condicionalmente, ya que evita tener varias directivas #if que encierren cada llamada al método cuya ejecución se desea controlar. Sin embargo, Conditional no controla la compilación de ese método, sino sólo las llamadas al mismo.

    El siguiente ejemplo muestra cómo usar Conditional:

 
 using System;
 using System.Diagnostics;
 
 class Condicional
 {
  [Conditional("DEBUG")]
  public static void F()
  {
   Console.WriteLine("F()");
  }
  
  public static void Main()
  {
   F();
  }
 }

    Sólo si compilamos el este código definiendo la constante de preprocesado DEBUG se mostrará por pantalla el mensaje F() En caso contrario, nunca se hará la llamada a F()

    Hay que precisar que en realidad Conditional no puede preceder a cualquier definición de método, sino que en su colocación hay impuestas ciertas restricciones especiales:

  • El método ha de tener un tipo de retorno void. Esto se debe a que si tuviese otro se podría usar su valor de retorno como operando en expresiones, y cuando no fuesen compiladas sus llamadas esas expresiones podrían no tener sentido y producir errores de compilación.

  • Si se aplica a un método virtual todas sus redefiniciones lo heredan, siendo erróneo aplicárselo explícitamente a una de ellas. Esto debe a que en tiempo de compilación puede no saberse cuál es el verdadero tipo de un objeto, y si unas redefiniciones pudiesen ser condicionales y otras no, no podría determinarse al compilar si es condicional la versión del método a la que en cada caso se llame.

  • No puede atribuirse a métodos definidos en interfaces ni a implementaciones de métodos de interfaces, pues son también virtuales y podrían reimplementarse.

Atributo System.ClsCompliant

    Permite especificar que el compilador ha de asegurarse de que el ensamblado, tipo de dato o miembro al que se aplica es compatible con el CLS. Ello se le indica (ya sea por nombre o posicionalmente) a través de su único parámetro bool IsCompliant, tal y como se muestra en el siguiente código ejemplo:


 using System;
 
 [assembly:CLSCompliant(true)]
 public class A
 {
  public void F(uint x)
  {}
  
  public static void Main()
  {}
 }

    Si intenta compilarlo tal cual, obtendrá el siguiente mensaje de error:

 error CS3001: El tipo de argumento 'uint' no es compatible con CLS

    Esto se debe a que el tipo uint no forma parte del CLS, y en el código se está utilizando como parte de un método público aún cuando mediante el atributo CLSCompliant se está indicando que se desea que el código sea compatible con el CLS. Si se le quitase este atributo, o se diese el valor false a su parámetro, o se definiesen la clase A o el método F() como privados, o se cambiase el tipo del parámetro x a un tipo perteneciente al CLS (pe, int), entonces sí que compilaría el código.

    Nótese que cuando el atributo CLSCompliant se aplica a nivel de todo un ensamblado, se comprueba la adecuación al CLS de todos sus tipos de datos, mientras que si solamente se aplica a un tipo de dato, sólo se comprobará la adecuación al CLS del mismo; y si tan sólo se aplica a un miembro, únicamente se comprobará la adecuación al CLS de éste.


Inicio | Tutorial C# Lectura de atributos en tiempo de ejecuciónTutorial C#Pseudoatributos Versión para imprimir Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# Lectura de atributos en tiempo de ejecuciónTutorial C#Pseudoatributos Versión para imprimir

Atributos de compilación
Autor: José Antonio González Seco
Visitas: 4125 Fecha de publicación: 01/12/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 310 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 85 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 206 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 937 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 209 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 675 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista
Visitas: 455 | Comentarios: 0 | Archivo: Articulos
Categorias: Linux|BSD
Visitas: 236 | Comentarios: 0 | Archivo: Articulos
Categorias: Programación|Actualidad
18/08/2008 SQL Server 2008
Visitas: 1135 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 789 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ

Útimos temas recibidos en los foros ...
Coastal Inversiones SAC Coastal Vacations Oportunidad de Negocios por lecasur ... [ASP.NET] 0 11/10/2008
Negocios Rentables desde tu Hogar Coastal Vacations por lecasur ... [Access] 0 11/10/2008
COASTAL VACATIONS OPORTUNIDAD DE NEGOCIOS RENTABLES por lecasur ... [Actualidad] 0 11/10/2008
hacer el nombre de una tabla variable por leicolei ... [SQL Server] 2 10/10/2008
ayuda por yo ... [C#] 2 09/10/2008
Mostar nombre en una sesion de usuario por jhors ... [ASP.NET] 1 10/10/2008
Analista por Rolando ... [SQL Server] 0 10/10/2008
SQL dinámico en TRIGGERS por Alastor ... [ORACLE] 2 03/10/2008
Crystal Reports 8.5 por selvinalberto ... [Visual Basic 6.0] 0 10/10/2008
Agregar Columnas a un datagridview por Tony ... [Visual Basic .NET] 3 20/11/2007
Problema cargando un pl/sql Embebido en Pro*C por ejrivas ... [ORACLE] 0 10/10/2008
Verificar conexion a internet por giraldo ... [Visual Basic .NET] 3 11/12/2006

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Componentes del lenguaje SQL    forma parte de...Tutorial SQL
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL
01/07/2008 LinQ To SQL - Un ejemplo sencillo
03/10/2006 Estrcuturas de control.    forma parte de...Tutorial C#
18/09/2008 Generar archivos PDF con C#
09/05/2006 Como leer XML con C#
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
22/10/2005 Tablas    forma parte de...Tutorial SQL
04/07/2007 ¿Cómo se usa el RSS?    forma parte de...Tutorial RSS
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]