Implementación Implícita/Explícita de Interfaz

08/05/2008 - 17:31 por Quim | Informe spam
Hola.

Tengo la siguiente duda.

He declarado un Interfaz, la cual implementaré en varias clases. El caso es
que esta interfaz contiene métodos que deberían ser privados en la clase que
la implementa.

¿¿¿Lo que detallo a continuación puede afectar al rendimiento de la
aplicación????.
Como en el caso de Boxing/Unboxing

public IInterface
{
void Metodo1();
void Metodo2();
}

public partial class Clase xx : IInterface
{

public Clase()
{
InitializeComponent()

this.Metodo0();

((IInterface)this).Metodo1();
((IInterface)this).Metodo2();

}

public void Metodo0()
{
...
}
void IInterface.Metodo1()
{

}

void IInterface.Metodo2()
{

}

}


Saludos
Gracias.

Preguntas similare

Leer las respuestas

#1 Eugenio Serrano
09/05/2008 - 04:15 | Informe spam
En ese caso no tiene ningun costo, ya que es el compilador quien lo
resuelve.

Saludos,
Eugenio Serrano
MVP ASP.Net
Solid Quality Mentors




"Quim" wrote in message
news:%
Hola.

Tengo la siguiente duda.

He declarado un Interfaz, la cual implementaré en varias clases. El caso
es que esta interfaz contiene métodos que deberían ser privados en la
clase que la implementa.

¿¿¿Lo que detallo a continuación puede afectar al rendimiento de la
aplicación????.
Como en el caso de Boxing/Unboxing

public IInterface
{
void Metodo1();
void Metodo2();
}

public partial class Clase xx : IInterface
{

public Clase()
{
InitializeComponent()

this.Metodo0();

((IInterface)this).Metodo1();
((IInterface)this).Metodo2();

}

public void Metodo0()
{
...
}
void IInterface.Metodo1()
{

}

void IInterface.Metodo2()
{

}

}


Saludos
Gracias.


Respuesta Responder a este mensaje
#2 Eugenio Serrano
09/05/2008 - 04:36 | Informe spam
Bueno un costo tiene, pero es minimo: Te paso los resultados de una prueba
que hice porque me quede pensando luego que respondi..

Vamos a intanciar 100.000.000 de veces la clase ImplementacionExplicita
Tiempo necesario: 00:00:02.0877570

Vamos a intanciar 100.000.000 de veces la clase ImplementacionNormal
Tiempo necesario: 00:00:01.8885510


Aqui esta el codigo que use:

namespace Interfaces
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Vamos a intanciar 100.000.000 de veces la
clase ImplementacionExplicita");
DateTime startTime = DateTime.Now;
for (int i = 0; i < 100000000; i++)
{
ImplementacionExplicita instance = new
ImplementacionExplicita();
}
TimeSpan t = DateTime.Now - startTime;
Console.WriteLine("Tiempo necesario: " + t.ToString());


Console.WriteLine("Vamos a intanciar 100.000.000 de veces la
clase ImplementacionNormal");
startTime = DateTime.Now;
for (int i = 0; i < 100000000; i++)
{
ImplementacionNormal instance = new ImplementacionNormal();
}
t = DateTime.Now - startTime;
Console.WriteLine("Tiempo necesario: " + t.ToString());

Console.ReadKey();
}
}
}

public interface IAccion
{
void Metodo1();
string Metodo2();
}

public class ImplementacionExplicita : IAccion
{
public ImplementacionExplicita()
{
((IAccion)this).Metodo1();
}
void IAccion.Metodo1()
{
int a = 1;
}
string IAccion.Metodo2()
{
return "";
}
}


public class ImplementacionNormal: IAccion
{
public ImplementacionNormal()
{
this.Metodo1();
}
public void Metodo1()
{
int a = 1;
}
public string Metodo2()
{
return "";
}
}



Saludos,
Eugenio Serrano
MVP ASP.Net
Solid Quality Mentors
Respuesta Responder a este mensaje
#3 Eugenio Serrano
09/05/2008 - 04:47 | Informe spam
En release se nota menos aun:


Vamos a intanciar 100.000.000 de veces la clase ImplementacionExplicita
Tiempo necesario: 00:00:01.2235545

Vamos a intanciar 100.000.000 de veces la clase ImplementacionNormal
Tiempo necesario: 00:00:00.8485785


Y aqui esta el codigo IL de los contructores de cada clase, como se ve, en
la linea 7 el casting debe hacerse en tiempo de ejecucion y no es que lo
resuelve el compilador como yo habia dicho en el primer mensaje... Pero el
costo es muy pequeño.

.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: callvirt instance void IAccion::Metodo1()
IL_000c: ret
} // end of method ImplementacionExplicita::.ctor


.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: call instance void ImplementacionNormal::Metodo1()
IL_000c: ret
} // end of method ImplementacionNormal::.ctor
Respuesta Responder a este mensaje
#4 Quim
09/05/2008 - 09:36 | Informe spam
Hola,

Muchas gracias por tu ayuda.

Un saludo
Quim.


"Eugenio Serrano" escribió en el mensaje
news:
En release se nota menos aun:


Vamos a intanciar 100.000.000 de veces la clase ImplementacionExplicita
Tiempo necesario: 00:00:01.2235545

Vamos a intanciar 100.000.000 de veces la clase ImplementacionNormal
Tiempo necesario: 00:00:00.8485785


Y aqui esta el codigo IL de los contructores de cada clase, como se ve, en
la linea 7 el casting debe hacerse en tiempo de ejecucion y no es que lo
resuelve el compilador como yo habia dicho en el primer mensaje... Pero el
costo es muy pequeño.

.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: callvirt instance void IAccion::Metodo1()
IL_000c: ret
} // end of method ImplementacionExplicita::.ctor


.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: call instance void ImplementacionNormal::Metodo1()
IL_000c: ret
} // end of method ImplementacionNormal::.ctor


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida