Archivo de la categoría: General

Atributos


Existen en .Net clases especiales que agregan indicadores funcionales a distintas partes del código, como Clases, métodos, propiedades, etc.

La intención de los mismos es permitir indicar características especiales a dichos elementos, como por ejemplo, en el caso de propiedades de controles, si son editables en tiempo de diseño, si se permite al usuario modificarlas, entre otras.

Otro ejemplo es la indicación de funcionalidades específicas, como por ejemplo, en un enumerador, cuando éste debe comportarse como “Mapa de bits” (atributo Flags).

Una característica interesante del propio .Net Framework es que es posible definir Atributos personalizados.

Se trata sencillamente de crear una clase que herede de System.Attribute

Los estándares de nomenclatura de .net Framework indican que el nombre de la clase debe terminar con Attribute. (Llamativamente, durante su utilización, esa parte del nombre no es necesaria). Por Ejemplo:

DataFieldAttribute

Por lo demás,al igual que cualquier otra clase, pueden tener propiedades, métodos, constructores, etc. aunque normalmente, no se implementa código ejecutable, si es posible hacer uso de los mismos con propiedades que definan características específicas de aquello a lo cual queremos aplicarle el atributo.

En el siguiente ejemplo, se define un atributo específico para propiedades, que indica que la misma se corresponde con un campo específico de una tabla de base de datos.Inclusive, en forma opcional, se podrá indicar que valor predeterminado utiliza (usando un enumerador).

Veamos el código,y luego analizaremos algunos detalles.

VB

Imports System.Runtime.CompilerServices
 
 
<AttributeUsage(AttributeTargets.[Property] Or AttributeTargets.Field, Inherited:=False, AllowMultiple:=False)> _
Public Class DataFieldAttribute
    Inherits Attribute
    Public Property ColumnName() As String
        Get
            Return m_ColumnName
        
End Get         Set(value As String)
             m_ColumnName
= value
        
End Set     End Property     Private m_ColumnName As String     Public Property DefaultValue() As DefaultValueEnum         Get             Return m_DefaultValue
        
End Get         Set(value As DefaultValueEnum)
             m_DefaultValue
= value
        
End Set     End Property     Private m_DefaultValue As DefaultValueEnum     Public Sub New(<CallerMemberName> Optional columnName As [String] = "", Optional defaultValue As DefaultValueEnum = DefaultValueEnum.None)
        
Me.ColumnName = columnName
        
Me.DefaultValue = defaultValue
    
End Sub End Class Public Enum DefaultValueEnum     Now
    AutoIncrement
    None
End Enum

C#

using System;
using System.Runtime.CompilerServices;
 
namespace DS.Common
{
     [
AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)]     public class DataFieldAttribute : Attribute     {
        
public string ColumnName
         {
            
get { return m_ColumnName; }
            
set { m_ColumnName = value; }
         }
        
private string m_ColumnName;
        
public DefaultValueEnum DefaultValue
         {
            
get { return m_DefaultValue; }
            
set { m_DefaultValue = value; }
         }
        
private DefaultValueEnum m_DefaultValue;
        
public DataFieldAttribute([CallerMemberName()] String columnName = "", DefaultValueEnum defaultValue = DefaultValueEnum.None)
         {
            
this.ColumnName = columnName;
            
this.DefaultValue = defaultValue;
         }
     }
    
public enum DefaultValueEnum     {
         Now,
         AutoIncrement,
         None
     } }

 

Puntos importantes.

  • La clase hereda efectivamente de Attribute. A su vez, tiene asignado un atributo indicando que puede aplicarse a Propiedades y/o Campos.  Además, que sólo puede aplicarse una vez en cada propiedad o campo.
  • Posee propiedades ColumnName y DefaultValue
  • DefaultValue es de un tipo también definido en el código, el enumerador DefaultValueEnum
  • Finalmente,el constructor admite dos argumentos, columnName y defaultValue, respectivamente, para asignar a las propiedades correspondientes.
  • Ambos parámetros son opcionales.  Para el valor predeterminado se asigna None, y para el nombre de la columna, una cadena vacía.
  • Sin embargo, en caso deno indicarse un valor cuando se instancia el atributo, el mismo usa una funcionalidad del compilador, el atributo CallerMemberName, que permite asignar el valor del elemento que lo llama (en este caso, el nombre de la propiedad o el campo), en lugar de la cadena vacía, con lo cual, en ningún caso tendría un valor vacío.

Espero pronto poder, finalmente, combinar distintos elementos que vimos, para crear algo más funcional.

Nos vemos pronto.

Serie de videos en Channel 9–Tipos de variables


Como el amigo Matías se ha tomado el trabajo de grabar vídeos con elementos importantes de .Net, les dejo aqui alguno para que repasen.

Matías Iacono

channel9logo_55552f9b

Otro video de la serie.

En esta oportunidad hablamos sobre los diferentes tipos de variables que podemos encontrar en C# y sus principales diferencias.

http://channel9.msdn.com/Blogs/DevWow/-100devdays-Tipos-y-Variables-en-C-

Ver la entrada original

Comparando valo…


Comparando valores y referencias en varios lenguajes de programación De Eduard Tomás

Del Amigo Eduard Tomás https://twitter.com/eiximenis,  una comparativa de “comparaciones”.. útil para entender mejor las operaciones entre tipos por valor y tipòs por referencia en distintos lenguajes.. Aunque le falte VB 🙂
http://www.campusmvp.es/recursos/post/Comparando-valores-y-referencias-en-varios-lenguajes-de-programacion.aspx 

Rendimiento tempdb mejorado en SQL Server 2014


Rendimiento tempdb mejorado en SQL Server 2014

De nuestro blog de Relacional “El Rincón del DBA”

Desde tiempos inmemoriales, hay un dicho que dice: “Usa siempre que puedas tablas temporales porque esas tablas viven en RAM”. A veces lo he oido con variables de tabla, pero la “esencia” del dicho es que puedes mejorar el rendimiento de lógica de negocio en por ejemplo procedimientos almacenados, creando objetos “temporales”. Nada mas lejos de la realidad 🙂

La realidad es que una tabla temporal o una variable de tabla, finalmente acaba escribiendose en disco…pero en los discos donde residen los ficheros de tempdb. Es decir, que si, que una tabla temporal o variable de tabla SI genera presión de E/S. ¡Sorpresa!
Sigue el vínculo para leer el resto…

[C#] Microsoft Unity I – Introducción a la inyección de dependencias


Sumando buenas publicaciones de colegas. (y ahorrándome el tener que escribir :))

Todo en ASP.NET

Post de la serie:

Hola, inicio una serie de post sobre la inyección de dependencias, la inyección de dependencias conocida por las siglas DI por su nombre en inglés Dependency Inyection, es un patrón de diseño altamente utilizado en aplicaciones medianas/grandes que requieren un ciclo de vida especial durante todo su proceso de desarrollo y mantenimiento, en este primer post no vamos a ver código (al menos no mucho), ya que quiero hablar del por qué DI es importante y que beneficios obtenemos al utilizarla.

Durante el proceso de desarrollo de software y espero que no sea tu caso (a mi si que me ha pasado) es posible que algunos requerimientos cambien o bien que se añadan nuevos, esto puede ser dado no solo por el cliente, dichos cambios pueden venir de…

Ver la entrada original 662 palabras más

Empezando de nuevo.


Hace unos años atrás, (si, si, muchos, ya sé), estábamos hablando de los principios de .Net.

Y las cosas fueron evolucionando, y pasaron ya 4 versiones.

Se agregaron (y desaparecieron algunas también), muchas funcionalidades, y bibliotecas, lenguajes y códigos, sentencias y ejemplos y…

Claro, ahora, por suerte, hay mucha gente publicando muchas cosas. Y da gusto ver cuanta tecnología y cuanta complejidad se publica a diario. Es una ventaja enorme que todos dispongan de tanta información.

Por otra parte, a veces se transforma en una gigantesca aventura entender los principios básicos de todo esto, entre tanta cosa.

Por eso, decidí que lo mejor que podía hacer era… empezar desde el principio.

Algunas cosas podrán parecer demasiado simples… si es así, habré conseguido el objetivo buscado.

Aquí lo que quiero lograr es que encuentres referencia a aquellas cosas que se fueron perdiendo entre tanta especialización.

Por cierto, si echas en falta algo, pues lo pides. Así, sumamos entre todos.

Finalmente, no quiero cerrar esta primera introducción sin agradecer a mi amigo Guille @elGuilleInfo, http://www.elguille.info/ que siempre me insiste en publicar, y me empuja a hacer más.