Uhh.. esa me la dejaste dificil, la verdad que no uso VB.
Hasta hace unos minutos creia que era solamente por ser ordenado, pero me
genere un ejemplo en C# y uno en VB.NET para ver el IL generado
El codigo era esto:
C#
VB.NET
Codigo SIN Compilar
Class1 test = new Class1();
test.a = "hola";
test.b = "mundo";
test.c = "feliz";
Dim Test As Class1 = New Class1
With Test
.a = "hola"
.b = "mundo"
.c = "feliz"
End With
IL (codigo compilado)
.maxstack 2
.locals init ( [0] class Test_VB_CS.Class1 test)
L_0000: newobj instance void Test_VB_CS.Class1::.ctor()
L_0005: stloc.0
L_0006: ldloc.0
L_0007: ldstr "hola"
L_000c: stfld string Test_VB_CS.Class1::a
L_0011: ldloc.0
L_0012: ldstr "mundo"
L_0017: stfld string Test_VB_CS.Class1::b
L_001c: ldloc.0
L_001d: ldstr "feliz"
L_0022: stfld string Test_VB_CS.Class1::c
L_0027: ret
.maxstack 2
.locals init (
[0] class Test_VB.Class1 Test,
[1] class Test_VB.Class1 VB$t_ref$L0)
L_0000: newobj instance void Test_VB.Class1::.ctor()
L_0005: stloc.0
L_0006: ldloc.0
L_0007: stloc.1
L_0008: ldloc.1
L_0009: ldstr "hola"
L_000e: stfld string Test_VB.Class1::a
L_0013: ldloc.1
L_0014: ldstr "mundo"
L_0019: stfld string Test_VB.Class1::b
L_001e: ldloc.1
L_001f: ldstr "feliz"
L_0024: stfld string Test_VB.Class1::c
L_0029: ldnull
L_002a: stloc.1
L_002b: ret
Y si el codigo de VB.NET lo traducimos a C# (o incluso vemos una
descompilación en VB.NET), vemos esto:
Class1 Test = new Class1();
Class1 VB$t_ref$L0 = Test;
VB$t_ref$L0.a = "hola";
VB$t_ref$L0.b = "mundo";
VB$t_ref$L0.c = "feliz";
VB$t_ref$L0 = null;
Bueno, vaya uno a saber lo que intentaron hacer ahí. Pero mis conclusiones
son:
1- Si podes usar C#, usalo porque genera menos IL, por lo tanto es mas
rapido :-)
2- Si vas a usar VB.NET te conviene usar (a nivel performance), algo
asi:
Variable.Text = asdasd
Variable.Tag = 0
Variable.Hola = Mundo
etc
3- El WITH conviene usarlo cuando obtener la variable requiere
procesamiento. En cambio de usar esto:
(Supongamos que el metodo ObtenerVariable devuelva siempre una referencia a
la misma instancia, porque sino el codigo no tiene el mismo comportamiento)
ObtenerVariable().Text = asdasd
ObtenerVariable().Tag = 0
ObtenerVariable().Hola = Mundo
etc
U otra forma de hacer lo mismo (Que es como se haria en C# o C++):
Variable = ObtenerVariable()
Variable.Text = asdasd
Variable.Tag = 0
Variable.Hola = Mundo
etc
Saludos!,
Diego
_____
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Gastón
Dorigo
Sent: Viernes, 07 de Septiembre de 2007 06:36 p.m.
To: [email protected]
Subject: [puntonet] Proclama para salvar instancias
Muy buena la idea de la proclama, me sumo con una consulta:
Hace un tiempo en un evento en el Hotel Sheraton, Daniel Seara explicaba las
ventajas de utilizar el bloque with / end with, por ejemplo
WITH textbox1
.text = texto
.tag = 0
. etc
END WITH
La consulta es porque no recuerdo ni puedo deducir cuales son los motivos
que validan esta afirmación, si alguien recuerda o me puede ayudar a deducir
una justificación válida se lo agradecería porque varios alumnos me lo han
consultado y todavía estoy buscando una respuesta razonable.
Saludos.
_____
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Damián
Herrera
Enviado el: Viernes, 07 de Septiembre de 2007 06:01 p.m.
Para: [email protected]
Asunto: [puntonet] Proclama para salvar instancias
Ya que estamos, yo también me sumo a la proclama!!!
Por todos los medios posibles evitar la siguiente estructura de código:
Try
...
...
Catch ex As Exception
Throw(ex)
...
End try
Esto es lo mismo que no capturar el error, en lugar de hacer esto no hagan
nada! Se van a ahorrar tiempo de procesamiento :) Si no, asegurense de hacer
los rollbacks o cancelar la operación antes de la línea "Throw(ex)".
Feliz fin de semana!
Damián Herrera
_____
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Diego
Jancic
Sent: Friday, September 07, 2007 5:44 PM
To: [email protected]
Subject: [puntonet] Proclama para salvar instancias
Hola gente!,
Estoy modificando un programa que hicieron muchos programadores (incluidos
semi-seniors y seniors), y me canse de ver algunas cosas sin sentido.
Por ese motivo estoy realizando esta proclama general, para que si alguien
lo hace, lo evite la proxima vez. ;-)
Cuando tenemos un codigo de este estilo:
MiClase instancia = new MiClase();
instancia = UnServicio.ObtenerDesdeBD(
);
En ese caso, se estan creando 2 objetos cuando se deberia crear uno
Fijense
que la 2da linea sobrescribe completamente la primera!!
Y para agravar el problema, el metodo UnServicio.ObtenerDesdeBD hace algo
con el parecido pero llamando a la base de datos o a un WS o a donde sea.
Entonces se termina creando una instancia por capa, cuando en realidad se
necesita una sola (o ninguna si el metodo devuelve null)
Espero haberles ahorrado aunque sea 1 segundo de procesamiento en todo el
tiempo de vida de su aplicación.
Bueno, esto fue una pequeña contribución a todos ellos que por costumbre
repiten estas cosas desde hace mucho tiempo (ojo, hace bastante yo tambien
lo hacia!).
Saludos y Happy Programming!,
Diego
__________ Información de NOD32, revisión 2513 (20070907) __________
Este mensaje ha sido analizado con NOD32 antivirus system
http://www.nod32.com