Método Parse() o los métodos de la clase Convert




Vamos arrojar un poco de luz sobre las diferencias entre utilizar el método Parse() de las estructuras de tipos de .NET o utilizar los métodos de la clase System.Convert. En realidad parece que hacen lo mismo pero existe una gran diferencia.Supongamos que dejamos que un usuario introduzca un valor numérico por pantalla y queremos realizar cálculos con ese valor. Por lo tanto, el valor introducido por el usuario será del tipo System.String y deberemos convertirlo a un tipo de valor numérico, por ejemplo System.Int32.
En definitiva queremos saber que diferencia hay entre ejecutar estas dos lineas de código:
int valorA Convert.ToInt32(valorUsuario);
int valorB Int32.Parse(valorUsuario);
Cuando utilizamos la segunda opción, el método Parse(), si el usuario no ha introducido ningún valor (null) recibiremos una excepción del tipo System.FormatException. Lo que indica que el formato del argumento no cumple las especificaciones del parámetro del método invocado.
En cambio, cuando utilizamos la primera opción, los métodos de la clase System.Convert, si el valor pasado al método es null, el método ConovertToInt32() devolverá un valor numérico, devolverá cero en todos los casos que el valor de entrada sea null.
Utilizando la herramienta Reflector podemos ver las diferencias de código que hay entre estas dos formas de convertir los tipos de .NET.

     
    Convert.ToInt32();

public static int ToInt32(string value)
{
     if (value == null)
     {
          return 0;
     }
     return int.Parse(value, CultureInfo.CurrentCulture);
}
 

    Int32.Parse();

public static int Parse(string s)
{
     return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}
Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...

String Cuidado con ese tipo!


El tipo System.String, que como todos sabemos representa una cadena, es un tipo algo especial con el que hay que tener un poco de cuidado a la hora de menejarlo. Veamos en primer lugar una definición más o menos formal del tipo System.String:
"El tipo System.String es un tipo por referencia e inmutable (de solo lectura) que representa una cadena de texto como una colección secuencial de caracteres Unicode (objetos System.Char)".
 Para este artículo nos centraremos en la primera parte de la definición, es decir, en "El tipo System.String es un tipo por referencia e inmutable (de solo lectura) ...".

¿Que quiere decir que es inmutable?
Un objeto inmutable es un objeto que no se puede modificar. Cuando creas, o cargas en menoria un objeto de este tipo, permanece con el mismo valor durente toda la vida del objeto. Veamos el siguiente fragmento de código:
            string miCadena "Un saludo";
            
miCadena +" para el lector";
Quizás pueda parecer que en la segunda linea de este fragmento estamos modificando el literal "Un saludo" pero esto no es así. Como ya dijimos antes, el objeto "Un saludo" es inmutable, por lo tanto, despúes de la concatenación, lo que se devuelve es un nuevo objeto de tipo System.String que contiene la modificación: "Un saludo para el lector".
Por lo tanto, cuando concatenamos cadenas de esta forma, tenemos en la memoria dos objetos, uno con el valor original y otro con la modificación. Es evidente, que sí esta operación la realizamos miles de veces, por ejemplo leyendo de una base de datos, el rendimiento de la aplicación se verá gravemente afectado. Por otro lado, si la operación solo se realiza una o dos veces (incluso tres o cuatro) no tiene tanta importancia.
Supongamos que tenemos una base de datos con todos los nombre de los lectores de este blog, y supongamos que son miles los nombres guardados (¡ojalá!...jeje). Ahora queremos leer de la base de datos todos los nombres y saludarles por pantalla. Creamos un método al que le pasamos cada nombre leido en un bucle.
        static void Saludar(string Nombre)
        {
            StringBuilder sb 
= new StringBuilder("Hola para ");
            
sb.Append(Nombre);
            
Console.WriteLine(sb.ToString());
        
}
Esta es la manera correcta de proceder, creando un objeto System.Text.StringBuilder y añadiendo cada nueva cadena por medio de su método Append(). Si queréis podéis descargaros un pequeño programilla que calcula el tiempo que se tarda en realizar concatenaciones con System.String y System.Text.StringBuilder en función de un número de iteraciones introducidas por el usuario.
String_vs_StringBuilder.rar (21,95 kb)

Más cosas a tener en cuenta.
¿Más cosas a tener en cuenta?. Ya dijimos que eran...¡unos tipos de cuidado!.
Cuando inicializamos variables de tipo Sytem.String y queremos darles un valor por defecto de cadena vacia es muy frecuente hacerlo con las comillas "".
    class Lector
    {
        
public string Nombre;
        public string 
Apellidos;
        public string 
Direccion;
        public string 
Telefono;
        public string 
Comentario;
        public string 
FechaComentario;

        public 
Lector()
        {
            Nombre 
"";
            
Apellidos "";
            
Direccion "";
            
Telefono "";
            
Comentario "";
            
FechaComentario "";
        
}

        
//...............

        //Aquí el resto de mienbros de la clase.

        //...............
    
}
No es recomendable hacerlo de esta forma. En este caso hemos creado (cargado en la menoria) 6 objetos diferentes de tipo cadena. Y seguramente luego "intentaremos" modificarlos al asignarles un valor determinado. Lo correcto, o por lo menos más recomendable, es hacerlo así:

        public Lector()
        {
            Nombre 
String.Empty;
            
Apellidos String.Empty;
            
Direccion String.Empty;
            
Telefono String.Empty;
            
Comentario String.Empty;
            
FechaComentario String.Empty;
        
}
Al utilizar el campo String.Empty que representa una cadena vacía, estamos apuntando todas las variables a un mismo objeto. De esta forma solo reservamos memoria para un único objeto gracias a que los tipos System.String son tipos por refencia.
Bueno...ya saben...¡cuidado con estos "tipos"!.



Espero que lo disfruten, compartan y comenten. ;)

Visita: http://rubitcorp.co/

"Si se puede imaginar... se puede programar."
Leer más...

Manejo de strings en C SHARP .NET


Hola csharpedianos, En este post veremos varios metodos aplicados al manejo de caracteres con la clase string.
Un string es una cadena de caracteres, y hay que saber dominar todos estos caracteres y hacer con ellos lo que nos venga en gana.
Es por eso que les traigo este post donde veremos algunas cosas interesantes que podemos hacer con esta clase string.

 Código en C# 

public static bool Contiene(string palabra, string cadena)
{
 for (int i = 0; i <= palabra.Length-cadena.Length; i++)
  //Si encontramos dos letras iguales
  if(palabra[i]==cadena[0])
  {
   bool contenida = true;
   //Recorremos la cadena desde la posición 1
   //y comparamos con la palabra a partir de 
   //la posición donde las dos letras iguales
   for (int j = 1; j < cadena.Length; j++)
    if (palabra[i + j] != cadena[j])
     contenida = false;
   //Si esta contenida
   if(contenida) 
    return true;
  }
 //Si no está contenida
 return false;
}

    public static bool EsPalindromo(string s)
      {
          //Si s está vacio o tiene longitud 1 retornamos true
          //Este es el caso base o condicion de parada recursiva
          if (s.Length == 0 || s.Length == 1) return true;

          //Quitamos las esquinas para ver si lo que queda
          //es palíndromo.
          string result = s.Substring(1, s.Length - 2);

          //Retornamos si los dos extremos de s son iguales 
          //y volvemos a llamar al metodo EsPalindromo
          return s[0] == s[s.Length - 1] && EsPalindromo(result);
      }

 public static string Invertir(string s)
      {
          string result = "";
          //Recorremos la cadena desde el final
          for (int k = s.Length - 1; k >= 0; k--)
              //Guardamos cada caracter en un nuevo string
              result = result + s[k];
          return result;
      }

public static string Reemplazar(string cadena, string x, string y)
      {
          string resp = cadena;
          for (int i = 0; i < cadena.Length; i++)
          {
              if (resp[i] == x[0])
              {
                  bool igual = true;
                  for (int j = 1; j < x.Length; j++)
                  {
                      if (resp[i + j] != x[j])
                          igual = false;
                  }
                  if (igual)
                  {
                      string alante = resp.Substring(0, i);
                      string atras = resp.Substring(i + x.Length);
                      resp = alante + y + atras;
                  }
              }
          }
          return resp;
      }
Es importante notar que aunque String, es una clase en C#, se puede tratar como un array de caracteres, y que el for se hace hasta palabra.Length-subcadena.Length, para que no de excepción.  También hay que decir que este ejercicio se puede hacer de otra forma más eficiente usando String Matching y algoritmos como KMP, pero no es el objetivo de este post.

Creo que el código está bien comentado, pero cualquier pregunta en los comentarios

Descarga aquí el código.



Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."

Leer más...

Diferencias entre Char, Varchar, NChar y NVarchar en SQL Server


¿Cuál es la diferencia entre estos, y cuán importante es la diferencia?

Char y NChar 

Cuando se configura un campo de tipo Char o NChar estamos indicando campos de tamaño fijo. Es Decir, si configuramos una tabla de la siguiente forma

Campo1 Char(10),
Campo2 NChar(10)
 
La diferencia entre Char y NChar es el soporte a carácteres Unicode (los carácteres Unicode ocupan más de 1 byte). Por este motivo a la hora de almacenar algún valor, en el Campo1 siempre ocupará 10 bytes y en el Campo2 20 Bytes.

Varchar y Nvarchar

VARCHAR es la abreviación de variable-length character string.   Es una cadena de caracteres de texto que puede ser tan grande como el tamaño de página para la tabla de la base de datos. Los campos de tipo Varchar o NVarchar son de almacenamiento variable

El tamaño almacenado dependerá del valor que se quiere guardar, el número de caracteres sólo configura el tamaño máximo que este campo puede almacenar. 

Configuramos una tabla de la siguiente forma:

CampoVariable1 Varchar(10),
CampoVariable2 NVarchar(10)

El tamaño almacenado dependerá del valor que se quiere guardar, el número de caracteres sólo configura el tamaño máximo que este campo puede almacenar. En el caso del CampoVariable1 el tamaño máximo será de 10 bytes, y en el caso del CampoVariable2 el tamaño máximo será de 20 bytes.

El tamaño de una página de tabla es 8.196 bytes, y no hay una fila de una tabla puede ser tener de 8.060 caracteres. Esto a su vez limita el tamaño máximo de un VARCHAR a 8000 caracateres

La "N" en NVARCHAR significa uNicode. Esencialmente, NVARCHAR no es más que un VARCHAR que soporta caracteres de dos bytes.  Lo que representara una longitud máxima de 4000 caracteres. Lo que significa tener la capacidad de almacenar caracteres especiales en este tipo de datos.
Y para que sirve Unicode? Si la columna donde almacenamos el texto es Unicode quiere decir que no tendremos problemas para guardar y recuperar caracteres que se usan en otros idiomas como el español (á é í ó ú ñ), pero con el español los problemas de visualización no son muy frecuentes, con el resto de idiomas es el problema (como el chino o japonés).

3
Unicode o No Unicode
Dependiendo de la información que queremos almacenar en nuestra base de datos, tendremos que definir si permitimos o no valores Unicode (Por ejemplo diferentes idiomas como el Ruso, Japonés, chino, …). Existen tablas de codificación de caracteres (Encodings) que poseen carácteres específicos de Doble Byte. Esto puede afectarnos a la hora de utilizar campos de tipo Char o Varchar, ya que un texto de 10 carácteres podría superar los 10 bytes, haciendo imposible la insercción del valor a la base de datos.


Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."


Leer más...

Monitorear el rendimiento de SQL SERVER



SQL Server Profiler
·         Muestra como SQL Server resuelve las queries internamente
·         Permite a los administradores ver como se ven las sentencias T-SQL  y como el servidor regresa los resultados.
·         Se puede:
o   Crear una traza basado en Templates
o   Verificar los resultados de la traza
o   Almacenar los resultados de la traza en un archivo o tabla
·         Capturar datos enviados al servidor que permite al programador verificar errores o datos incorrectos.

Windows System Monitor
·         Monitorear el uso de recursos.
·         System Monitor también llamado Performance Monitor.
·         Comparando SQL Server Profiler,  este monitorea eventos del motor de base de datos,  System Monitor monitorea el uso de recursos asociados con los procesos del servidor.
·         Se encuentra en el Panel de Control , Herramientas Administrativas, Monitor de rendimiento (en Español)   o bien Performance Monitor.

Activity Monitor
       Secciones:
1.       Vista General -  Muestra gráficamente el comportamiento del resto de secciones.
2.       Procesos – Muestra las actividades de los usuarios.  Que usuario esta impactando en que base.
3.       Recursos en Espera -  Espera el estado de la información. Que proceso está esperando un recurso.
4.       Data File  I/O -  Archivos de Data y Log  con información I/O
5.       Queries utilizadas -  Muestra las queries mas utilizadas recientemente.

Transact-SQL
·         sp_who 
·         sp_lock
·         sp_spaceused
·         sp_monitor

Windows Logs
·         Aplicación Externa a SQL Server
·         Podremos ver advertencias o errores ocurridos en los procesos de SQL Server.
·         Se encuentra en el Panel de Control , Herramientas Administrativas, Visor de Eventos(en Español)   o bien Events Log.

Default Trace
·         SQL Server “Caja Negra”
·         Para habilitarlo:
sp_configure 'default trace enabled', 1
RECONFIGURE
·         El trace que se creara por defecto será en la ruta donde esté instalado SQL Server. 
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log
·         Buscamos el archivo de traza  con extension .trc generado.

Fuente:
Blog de Bernardo Robelo


Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...

Verificar url o archivos remotos




 Trabajando en uno de los proyectos para la empresa donde laboro, me surgió la necesidad de verificar si un archivo existía teniendo solo su url, fue aquí donde comencé a investigar junto con mi amigo Edwin Rincon y encontramos una solución muy buena la cual les voy a compartir a continuación.

Pueden utilizar este método para comprobar que sus paginas web están funcionando de forma correcta o usarlo para comprobar links suministrados por otros usuarios, en fin, lo pueden usar para lo que necesiten.

Este método recibe 2 parámetros:

El primero es la url que se desea comprobar y el segundo es la cantidad de tiempo máximo que queremos que espere por una respuesta, vale aclarar que el tiempo lo damos en milisegundos, quiere decir que un segundo equivale a 1000 milisegundos, en este caso he colocado que espere solo 3 segundos, si en ese tiempo no recibo una respuesta por parte del servidor remoto entonces asumo que la url no existe, ustedes pueden poner el tiempo que quieran.


public static bool RemoteFileExists(string url, int timeout)
    {
        try
        {            
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
           
            // El timeout es en milisegundos
            request.Timeout = timeout;
            // ************

            //Configurando el Request method HEAD, puede ser GET tambien.
            request.Method = "HEAD";
            //Obteniendo la respuesta
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //Regresa TRUE si el codigo de esdado es == 200
            return (response.StatusCode == HttpStatusCode.OK);
        }
        catch
        {
            //Si ocurre una excepcion devuelve false
            return false;
        }
    }
Esto nos sirve para verificar si un website esta funcionando o una pagina existe o para verificar archivos remotos, en mi caso la he usado para saber si una foto existe en un website.

Les dejo un proyecto de ejemplo para verificar paginas o archivos remotos:
Descargar Aquí.


Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."

Leer más...

Visual studio 2012: Lanzamiento


El miércoles 12 de septiembre de 2012 Microsoft lanzo la nueva versión de la herramienta de desarrollo mas robusta, fácil y útil que puede existir, se trata de visual studio 2012 el cual ha cambiado un poco su apariencia física y su logo, ya no es el azul que estábamos acostumbrados a ver en la versión de visual studio 2010, ahora tiene un gris pálido (un poco feo en mi opinión) el cual regulan con azul que se deja ver de vez en cuando, aunque para aquellos desarrolladores medio góticos o emos, si van [Herramientas - Opciones] pueden cambiar por un tema Dark.

Pero mas allá de los cambios en la apariencia visual studio ha sufrido cambios importantes ya que ha agregado mejoras para linq, expresiones lambda, aplicaciones para WIN8 y el nuevo Framework 4.5.


Lo que mas me ha gustado es que es muy rápido y con solo dar clic sobre un aspx se mostrara estilo de un preview donde puedes ver todo el código html y editarlo.
A Continuación listare algunas de las mejoras de VS 2012:



Características de Visual Studio 2012 : 
1 – Desarrollo innovador de aplicaciones
2 – Gestión moderna del ciclo de vida de las aplicaciones
3 – Posee herramientas para una planificación y gestión de proyectos ágil, que mantienen a los equipos alineados e informados.
4 – También tiene herramientas y flujos de trabajo para romper las barreras en la integración funcional y de equipos de trabajo.


Características .NET Framework 4.5:

- Proporciona a los desarrolladores una forma rica y productiva de crear aplicaciones en el cliente (Windows Forms, WPF, Windows 8 Store Apps), on premise (Windows Server) y en la nube (Windows Azure).

- Sus nuevas capacidades incluyen mejoras de rendimiento y la posibilidad de hacer más sencilla la programación asincrónica y paralela. Además, ofrece funcionalidad de .NET y XAML para Windows 8 Store Apps.

- .NET Framework 4.5 en el servidor también proporciona ASP.NET, WIF (Windows Identity Foundation), Entity Framework y WCF (Windows Communication Foundation). Asimismo, para la nube, Windows Azure proporciona soporte completo para desarrollo .NET con Windows Azure SDK para .NET.


Muy pronto les estare hablando mas de mi experiencia con este nuevo VIsual Studio.



Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...

Formatos con String.Format en C#



formatos en c sharp
Todas las aplicaciones que desarrollamos en algún momento necesitan formatear algún tipo de datos, y no se a ustedes pero a mi siempre se me olvidan los formatos y como obtener los resultados de una u otra forma, es por eso que decidí hacer este post, y recopilar la mayor cantidad de formatos posibles, para buscarlos cuando necesite y ustedes puedan copiarlos ;=).

Para formatear cadenas existe una clase especializada en el manejo de cadenas, esta clase se llama String, su nombre completo es System.String, ya que se encuentra en el namespace System.
En esta clase vamos a encontrar una función llamada Format que se encargará de reemplazar el valor de un dato (entero, real, una cadena, un carácter, hasta de un objeto), por el formato que se especifique en el parámetro.

En forma general, y aunque tiene varias sobrecargas, String.Format tiene la siguiente sintaxis:

Formatos para números:
  Tipo   Ejemplo   Resultado
Currency
 String.Format('{0:c}',2.5); 
2.5
Decimal (Numero Entero)
 String.Format('{0:d}',200); 
200
Scientific
 String.Format('{0:e}',254325.22); 
254325.22
General
 String.Format('{0:g}',20.50); 
20.50
Number (Número con comas para los miles)
 String.Format('{0:n}',2548241.50); 
2548241.50
Hexadecimal
 String.Format('{0:x}',2548241); 
2548241
Cantidad de decimales
 String.Format('{0:0.000}',254.623645); 
254.623645


Formato para Cadenas
  Tipo   Ejemplo   Resultado
Alineacion a la derecha
 String.Format('{0,30}',Identado a la derecha); 
Identado a la derecha
Alineacion a la izquierda
 String.Format('{0,-5}',Identado a la izquierda); 
Identado a la izquierda


Formato para Fechas
  Tipo   Ejemplo   Resultado
Día
 String.Format('{0:dd}', DateTime.Now ); 
12
Nombre del Día acortado
 String.Format('{0:ddd}', DateTime.Now ); 
Wed
Nombre del Día – largo
 String.Format('{0:dddd}', DateTime.Now ); 
Wednesday
Era
 String.Format('{0:gg}', DateTime.Now ); 
A.D.
Hora
 String.Format('{0:hh}', DateTime.Now ); 
09
Hora en formato de 24h.
 String.Format('{0:HH}', DateTime.Now ); 
09
Minutos
 String.Format('{0:mm}', DateTime.Now ); 
21
Meses
 String.Format('{0:MM}', DateTime.Now ); 
09
Abreviación del Mes
 String.Format('{0:MMM}', DateTime.Now ); 
Sep
Nombre Completo del Mes
 String.Format('{0:MMMM}', DateTime.Now ); 
September
Segundos
 String.Format('{0:ss}', DateTime.Now ); 
29
AM o PM
 String.Format('{0:tt}', DateTime.Now ); 
AM
Año en dos dígitos
 String.Format('{0:yy}', DateTime.Now ); 
12
Año en formato largo
 String.Format('{0:yyyy}', DateTime.Now ); 
2012
Short Date
 String.Format('{0:d}', DateTime.Now ); 
9/12/2012
Long Date
 String.Format('{0:D}', DateTime.Now ); 
Wednesday, September 12, 2012
Hora y Fecha en formato corto
 String.Format('{0:f}', DateTime.Now ); 
Wednesday, September 12, 2012 9:21 AM
Hora y Fecha en formato largo
 String.Format('{0:F}', DateTime.Now ); 
Wednesday, September 12, 2012 9:21:29 AM
Hora Universal
 String.Format('{0:u}', DateTime.Now ); 
2012-09-12 09:21:29Z



Si me hizo falta alguno por fa comentenlo y lo agrego.

Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...
Google