Const Vs ReadOnly y Clases definidas como Static April 30, 2009
Posted by xdcarp in .NET, coding.Tags: c#, dotnet
add a comment
Constantes
Una constante es un valor invariable durante toda la ejecución de la aplicación (web, consola, de escritorio). En C# se declaran anteponiendo la palabra const y el tipo debe ser uno de los tipos integrados del lenguaje (int, string, bool, byte, char, decimal, entre otros http://msdn.microsoft.com/es-ar/library/ya5y69ds.aspx) excluyendo System.Object.
Si tratamos de cambiar el valor de una constante obtendremos el siguiente error de compilación.
const int T = 0;
T = T + 1;
“The left-hand side of an assignment must be a variable, property or indexer”
No se puede crear una variable de un tipo definido por el usuario ya que obtendremos el siguiente error de compilación:
public const TipoParaPrueba NOCONSTANTE = new TipoParaPrueba(1, 2);
‘ConstVsStaticVsReadOnly.Program.NOCONSTANTE’ is of type ‘ConstVsStaticVsReadOnly.TipoParaPrueba’. A const field of a reference type other than string can only be initialized with null.
Una constante puede ser declarada como public, private, protected, internal o protectedinternal pero no puede ser declarada como static porque se obtiene el siguiente error de compilación:
static public const int NUM = 9;
The constant ‘ConstVsStaticVsReadOnly.Program.NUM’ cannot be marked static
Si definimos la clase del ejemplo, la constante HOY mantendrá el valor 30 durante toda la ejecución del programa.
class Program
{
const int HOY = 30;
static void Main(string[] args)
{
Console.WriteLine(“Hoy = “ + HOY);
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Hoy + 1 = “ + (HOY+1));
Console.WriteLine(“Presione cualquier tecla para salir…”);
Console.ReadKey();
}
}
Cuando el compilador encuentra un identificador de constante en el código fuente de C# sustituye directamente el valor literal en el código de lenguaje intermedio (IL) que genera. Dado que no hay ninguna dirección de variable asociada a una constante en tiempo de ejecución, los campos const no se pueden pasar mediante referencia y no pueden aparecer como un valor literal en una expresión.
Si se quiere usar una constante definida en una clase distinta de aquella en la que fue definida se debe seguir la forma ClaseEnLaQueFueDefinida.Constante.
ReadOnly
A diferencia de una constante, un valor definido como readOnly puede ser inicializado al declararse y el valor no cambia durante la ejecución del programa, o puede ser inicializado una sola vez dentro del o de los constructores de una clase y su valor no varia durante toda la ejecución del programa. El siguiente ejemplo muestra lo descrito anteriormente:
class Program
{
static void Main(string[] args)
{
Prueba prueba1 = new Prueba();
Prueba prueba2 = new Prueba(20);
Prueba prueba3 = new Prueba(1,1);
Console.WriteLine(“Si creo una instancia de Prueba y muestro Var tiene el valor 10 = “ + prueba1.VAR);
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Si creo un objeto con el constructor numero 2 Var tiene el valor pasado por parametro(20): “ + prueba2.VAR);
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Si creo un objeto con el constructor numero 3 Var tiene como valor la suma de los parametros(1,1): “ + prueba3.VAR);
Console.WriteLine(“Presione cualquier tecla para salir…”);
Console.ReadKey();
}
}
class Prueba
{
public readonly int VAR = 10;
public int A { get; set; }
public int B { get; set; }
//constructor 1
public Prueba()
{
}
//constructor 2
public Prueba(int prueba)
{
this.VAR = prueba;
this.A = 1;
this.B = 2;
}
//constructor 3
public Prueba(int a, int b)
{
this.A = a;
this.B = b;
this.VAR = a + b;
}
public int Sumar()
{
return this.A + this.B;
}
}
Como las constantes, no se puede cambiar el valor de una variable declarada como readonly porque se obtiene el error de compilación:
public readonly int VAR = 10;
VAR = 15;
The left-hand side of an assignment must be an l-value
A diferencia de una constante, el tipo de una variable readonly puede ser una clase, struct o array y ser inicializado una vez en tiempo de ejecución (en un constructor) pero no una puede ser una enumeración.
Clases Static
Si definimos una clase como static, no podemos crear instacias suyas, es decir, no se puede usar la palabra reservada new para crear una instancia. Para hacer referencia a sus métodos, es necesario usar el nombre de la clase, como en el siguiente ejemplo:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“Valor del campo A: “ + Prueba.A);
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Valor del campo B: “ + Prueba.B);
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Suma 5 y 2: “ + Prueba.SumarDosNumeros(5,2));
Console.WriteLine(“Presione cualquier tecla para continuar…”);
Console.ReadKey();
Console.WriteLine(“Resta 7 menos 2: “ + Prueba.RestarDosNumeros(7, 2));
Console.WriteLine(“Presione cualquier tecla para salir…”);
Console.ReadKey();
}
}
static class Prueba
{
public static int A = 20;
public static int B
{
get
{
return 15;
}
}
public static int SumarDosNumeros(int a, int b)
{
return a + b;
}
public static int RestarDosNumeros(int a, int b)
{
return a – b;
}
}
Como podemos observar todos los miembros de la clase Prueba son estáticos, una clase estática no puede tener constructores de instancia pero si constructores estáticos si posee campos que deben ser inicializados con valores no triviales, no se instacia y está sellada (no se puede heredar de esta clase).
Evento Run09 de Microsoft March 27, 2009
Posted by xdcarp in .NET, evento.Tags: dotnet, evento
add a comment
Buenas, les escribo para contarles un poquito que tal fue el evento del que participamos el día de ayer 25/03/09.
En gral. los contenidos fueron pobres al igual que las exposiciones aunque los títulos de las distintas disertaciones eran prometedores.
En particular les quería contar un punto de la charla de jquery y Ajax template, asignar a la propiedad “class” del elemento a bindear con el valor “sys-template” se hace por la siguiente razón: ocultar el binding del elemento seleccionado durante el rendering de la página. Para que el estilo “sys-template” esté disponible, debemos crear un archivo css al que podemos nombrar de cualquier forma e incluirlo en nuestra página. Luego, abrir el archivo que creamos y agregar esta línea:
.sys-template { display: none; }
Con esto se logra el efecto. Prueben ponerlo y sacarlo para comprobarlo.
Un buen blog para aprender un poquito más y ahondar en los contenidos que mostraron ayer con respecto a este tema es el de Bertrand Le Roy (http://weblogs.asp.net/bleroy/default.aspx). Tiene muy buenos ejemplos y si le hacen una pregunta les contesta bastante rápidamente, lo único si, van a tener que hacerla en inglés.
Por último en la página del proyecto en Codeplex, agregaron una actualización de las librerías con su correspondiente documentación. Obviamente, todavía se sigue trabajando en el proyecto por lo que la documentación quizá no es la final. La dirección es: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24645.
Saludos.
Gabriela Gutierrez
Deploying SQL Server 2005 Express Edition by Using a Wrapper August 20, 2008
Posted by mlopezamador in .NET.Tags: dotnet, sqlserver
add a comment
La idea es poder incluir la instalación de Sql Express en una aplicación. Se define un wrapper y se lo llama desde el main del program de un winform o en el load del formulario en una aplicación web).
A continuación adjunto zip con wrapper y el código que lo llama para descargar
http://www.codeplex.com/snoop/SourceControl/PatchList.aspx
Curso IIS 7, AJAX.Net, ASP.Net MVC, Silverlight (Día 3) August 15, 2008
Posted by cpaez in .NET, ASP.NET, evento.Tags: dotnet, evento, opinion
add a comment
Como corolario del curso de las novedades de Visual Studio 2008, se hizo hincapié en los siguientes temas:
Primero se habló acerca de las mejoras en la integración con IIS7, se mostró el nuevo modelo de ejecución (Pipeline) integrado de ASP.NET con IIS7.
Otro de los temas vistos fue la facilidad para crear módulos adicionales a IIS7, y su facilidad de mantenimiento.
También se mostró la nueva Interfaz de administración totalmente renovada, que nos ofrece un mayor control.
Luego se hizo un recorrido por el framework de AJAX de ASP.NET, mostrando su arquitectura, y tanto la opción de utilizar la librería Javascript que nos ofrece, como el paquete de controles (Toolkit) para extender los tradicionales de ASP.NET.
Más tarde se hizo un recorrido por Silverlight y sus diferentes versiones (1.0 y 2.0 Beta), utilizamos las herramientas Expression para crear la UI (código XAML) y luego dentro de Visual Studio, poniendo el foco en la ventaja que nos ofrece la versión 2.0 de codificar nuestra funcionalidad en lenguajes .Net (C# y VB.Net).
Por último hicimos un recorrido por el nuevo Framework desarrollado por MS para la creación de aplicaciones web basadas en el patrón MVC, todavía en desarrollo. Que introduce un nuevo paradigma dentro del desarrollo sobre la plataforma .NET.
Habiendo visto estos temas se hizo un pantallazo por todas las novedades que esta introduciendo MS en el ámbito de los developers, dentro del contexto de Visual Studio 2008.
SP1 para VS2008 & .NET 3.5 August 12, 2008
Posted by npaez in .NET, Tools, noticia.Tags: dotnet, Visual Studio, vs
add a comment
Ayer se hicieron públicos los mencionados Service Packs, para más información ver aquí.
Enjoy it!.
Curso Linq, Sql 2008, Parallel FX (Día 2) August 7, 2008
Posted by Leandro Romero in evento.Tags: dotnet, noticia, opinion
add a comment
Ayer asistí al workshop del Mug en el día “manejo de datos” y vimos Linq, Parallel FX y un chiquitín de SQL 2008.
LINQ
Para empezar vimos Linq, no voy a contar todo lo que dijo, pero básicamente es una linda manera de utilizar sintaxis “parecida” a sql para manejar colecciones. Entonces podemos tener algo asi:
public void Linq6() {
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };var numsPlusOne =
from n in numbers where n > 2
select n;
En este ejemplo se ve que podemos “consultar” sobre una colección.
Bien, Linq es re lindo, nos da un lenguaje copado, con intellisense, tipado y además parece útil, pero lo que lo hacen más útil son sus implementaciones: Linq To Objects, Linq To Sql, Linq To Entity, Linq To DataSets… etc.
Un ejemplo de Linq To Objects (la más fácil de entender):
ArrayList arrList = new ArrayList();
arrList.Add(new Student
{
FirstName = "Svetlana",
LastName = "Omelchenko",
Scores = new int[] { 98, 92, 81, 60 }
});
arrList.Add(new Student
{
FirstName = "Claire",
LastName = "O’Donnell",
Scores = new int[] { 75, 84, 91, 39 }
});
arrList.Add(new Student
{
FirstName = "Sven",
LastName = "Mortensen",
Scores = new int[] { 88, 94, 65, 91 }
});
arrList.Add(new Student
{
FirstName = "Cesar",
LastName = "Garcia",
Scores = new int[] { 97, 89, 85, 82 }
});
var query = from Student student in arrList
where student.Scores[0] > 95
select student;
Copado no?
Ahora sobre lo que mas me voy a explayar: Linq To Sql (Solo SQL Server). Vamos por partes como dijo Jack: Primero hay que tener en cuenta que hay que tener un contexto, esto es una clase que encapsula las tablas y las relaciones de esas tablas (algo MUY parecido a un dataset, pero en realidad es un .dbml). Una vez que se tiene un contexto podemos hacer cosas como esto:
DataContext db = new DataContext
(@“c:\linqtest5\northwnd.mdf”);
Table<Customer> Customers =
db.GetTable<Customer>();db.Log = Console.Out;
IQueryable<Customer> custQuery =
from cust in Customers
where cust.City = “London”
select cust;foreach (Customer cust in custQuery)
{
Console.WriteLine(“ID={0}, City={1}”,
cust.CustomerID,
cust.City);
}
Podemos ver que tiene un contexto (en el ejemplo se muestra una manera rapida de crear contextos sin el .dbml), se trae la tabla Customers (la tabla esta mapeada a una clase Customer) y ejecuta una búsqueda simple. La sentencia “db.Log = Console.Out;” Hace que muestre la sentencia sql que genera nuestra búsqueda. Bien, un dato importante es que la consulta no es ejecutada en el instante, sino que es “diferida” la ejecución, esto significa que recién al recorrer esa colección con el for each, ahi va a ejectuar la consulta en la base, esto es importante porque si surge alguna excepción va a saltar en la ejecución del for each y no en la creación de la consulta en si. Algunos datos para tener en cuenta: NO es un ORM (Como nhibernate), NO soporta complejas estructuras de tablas (lo de complejas es subjetivo, pero como métrica si tienen 30 tablas y tienen 90 relaciones, eso es complejo
) y lo mas importante de todo: las sentencias LIKE no estan soportadas, leyeron bien, no se puede hacer una consulta sobre un campo texto con un LIKE.
Ustedes dirán, y que tiene de bueno esto? Bueno, en principio si tenemos una aplicacion que no tiene una gran complejidad de relaciones, no hay que hacer busquedas de texto con like y nuestro dominio esta excelentemente modelado como para que cada atributo es una columna de una tabla y no hay muchas mas vueltas que eso aca tenemos la solución, en todos los proyectos por los que pasé, esto se me presentó en… mmmm bue.. nunca, pero bueno.. para hacer demos queda RE Lindo!!!
Sin embargo no crean que esto es algo malo, para solucionar esto es que existe Linq To Entities, en criollo es Linq con Entity Framework, ahora si tenemos un ORM, y podemos jugar lo que querramos con esto. Esta implementación es la que le pongo mas fichas, pero no seria Linq la solucion principal, el mayor poder reside en Entity Framework, que les dejo de tarea revisar que es
Parallel FX
Yo me acuerdo cuando empece la secundaria técnica en la vieja y querida Kennedy de Lanus en el 2000. Para esa época AMD e Intel peleaban cuerpo a cuerpo a ver quien era el que lograba el procesador con mayor cantidad de Ghz posible. Hoy por hoy, AMD e Intel pelean por ver quien pone mas procesadores en una pc. Ya sabemos que la mayoria de los procesadores tienen 2Ghz, un poco mas o un poco menos, pero todos andan por ahi. Esto es asi porque a mas Ghz nuestra pc pasaría a la categoría estufa (se calculaba que si esa tendencia de aumentar la velocidad se extendía por un par de años mas, los procesadores iban a alcanzar la temperatura del sol), por suerte a Roberto Intel, que estaba perdiendo mercado con AMD64, se le prendió la lamparita y sorprendio a todos con el Dual-Core, un procesador con 2 nucleos. A estas alturas ya existe el Quad-Core para escritorios y multiples Quad-Cores para servidores (los servidores grosos siempre soportaron muchos procesadores, pero ahora aceptan muchos procesadores que se componen de muchos nucleos). Y las aplicaciones? Bien, gracias, hagan la prueba los que tienen múltiples nucleos en su pc, agarren un archivo pesado de texto (1GB mas o menos) y abranlo con el notepad, vayan al administrador de tareas y van a ver como un procesador esta trabajando a full y el otro esta durmiendo la siesta, un claro ejemplo de una aplicación no está pensada para esta nueva tecnología (convengamos que es el notepad, no le pidan peras al olmo). Como hacemos nosotros para seguir a la tecnología? Simple, Parallel FX y que el framework se arregle como pueda. Ejemplo:
A la antigua el manejo de threads era asi:
for (int i = 0; i < 20; i++)
{
//Dormir 100 milisegundos
Thread.Sleep(100);
}
Ahora para aprovechar los procesadores hacemos asi:
System.Threading.Parallel.For(0, 20, delegate(int i)
{
//Dormir 100 milisegundos
Thread.Sleep(100);
});
Como funciona esto? Bueno, el framework se fija cuantos procesadores tiene a su disposición y ejecuta los threads en paralelo. Miren como es el for de Parallel, muy parecido al viejo for no?
SQL 2008
Por ultimo un chiquitín de SQL 2008: Cuando salga va a salir conjuntamente el release de Entity Framework, como el equipo de desarrollo de SQL se atrasó, el equipo de Entity Framework (muy unidos ellos) decidieron retrasarse también.
Bueno, como dirían los filósofos contemporáneos: Espero que les haya gustado.
Curso VS2008 – Framework 3.5 (Día 1) August 6, 2008
Posted by mlopezamador in evento.Tags: dotnet, noticia, opinion
add a comment
Al inicio del curso se presentaron las novedades de Visual Studio 2008. Las que mas me llamaron la atención fueron: Lambda expressions, variables de tipo anónimo y la posibilidad de hacer debug y seguimiento sobre funciones javascript. El instructor mostró algunos ejemplos prácticos (código) para afianzar los conocimientos. Luego se vieron algunas cuestiones sobre Framework 3.5: Garbage Collector,CLR Security entre otros. Finalmente vimos WorkFlow Foundation (WF) y Windows Communication Foundation (WCF) pero con poco detalle. La última media hora del curso la utilizamos para hacer un ejercio práctico sobre WCF.
El primer día del curso estuvo bueno ya que vimos de manera global lo nuevo de Visual Studio 2008. Lo ideal hubiera sido hacer algunos ejercicios más, pero no daban los tiempos.
WebGet operations July 7, 2008
Posted by npaez in .NET.Tags: dotnet, wcf
add a comment
En ocasiones puede que tengamos un servicio WCF con operaciones del tipo webget (sobre webHttpBinding), pero que a pesar de ser de tipo GET, las mismas no devuelvan ningun dato (void). En estos casos, por default WCF nos devolverá un objeto JSON vacio. Para evitar dicho objeto y especificar que la operación no devuelva nada podemos utilizar la siguiente línea de código:
WebOperationContext.Current.OutgoingResponse.SupprressEntityBody = true;
Espero les resulte útil.
Encripción del web.config June 29, 2008
Posted by npaez in .NET.Tags: dotnet, seguridad
add a comment
Es una práctica muy común el guardar información de configuración de la aplicación el correspondiente archivo de configuración provisto por .NET (app.config o web.config).
También es común que ciertas polítcas de seguridad prohiban que ciertos datos sensibles de la aplicación como cadenas de conexión a base de datos, sean almacenados en forma plana dentro de los archivos de configuración.
Es por eso que a partir de la versión 2.0 la plataforma .net nos brinda soporte nativo para encriptar la información almacenada en los archivos de configuración. Este link de MSDN brinda detalles al respecto.
Si bien el uso de funcionalidad debiera ser una práctica común, me parece que muchos programadores la desconocen.
Espero que les resulte útil.
RAF 08 June 6, 2008
Posted by npaez in evento.Tags: dotnet, evento
add a comment
Los días 27 y 28 de mayo participamos del cuarto Foro Regional de Arquitectos, organizado por Microsoft Cono Sur. En el contexto del mismo dictamos una sesión sobre aplicaciones desconectadas (el título de la sesión fue “On-off Applications”) en la cual hicimos incapié en la problemática de sincronización y en el framework provisto por Microsoft como solución a dicha problemática.
El slide deck y el ejemplo de código utilizados pueden descargarse de nuestro workspace. (http://www.codeplex.com/snoop/Release/ProjectReleases.aspx?ReleaseId=13927, http://www.codeplex.com/snoop/Release/ProjectReleases.aspx?ReleaseId=13894)
En total hubo 25 sesiones, las cuales fueron grabadas y proximamente estarán disponibles para acceso al público en general.
De las sesiones que vimos:
- la mejor: “Interoperabilidad gubernamental”, excelentemente presentada, pareció algo aplicable en nuestro contexto (sudamérica) , lo cual ya es mucho considerando que muchas veces Microsoft propone cosas demasido lejanas a nuestra realidad.
- la peor: “La batalla de las plataformas de desarrollo web”, no aportó nada, se intentó comparar la plataforma ofrecida por Microsoft con la competencia (PHP y Java) pero sin tener el suficiente conocimiento y exponiendo opiniones más que hechos. Una lástima.
En cuanto a organización, impecable y la evalución general del evento, 10 puntos.
Gracias al grupo de arquitectura de Microsoft Cono Sur por la invitación, felicitaciones y esperamos que nos inviten el año próximo.

