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

Responder a