Вы находитесь на странице: 1из 26

pado esttico

Los tipos estn definidos en el cdigo fuente de nuestros proyectos o forman parte del framework utilizado por estos (built-in, DLLs). El compilador conoce los tipos de las entidades utilizadas en el cdigo, bien porque estn declaradas explcitamente o porque el tipo de stas puede ser deducido a partir del contexto (inferencia de tipos).

En el modelo orientado a objetos T x = ... x est declarado explcitamente


var x =

.. . x. M(...);

o su tipo se infiere a partir de la parte derecha De acuerdo al tipo de x el compilador puede determinar si la invocacin a un mtodo M es correcta y generar un cdigo en consecuencia

pado esttico
Conociendo estticamente el tipo una herramienta nos puede ayudar a seleccionar los mtodos posibles a aplicar

pado esttico
Esttico no significa falta de flexibilidad que podemos obtener por las jerarquas de tipo y el polimorfismo Una variable, propiedad, parmetro est declarada de un tipo esttico (explcitamente o inferido) pero en runtime puede tener asignado un objeto de un tipo derivado del tipo esttico Estticamente se conoce que el f A f

A1

A2

A3

A a; ...a = new A1(); ...a = new A2(); ...a = new A3();

existe y la forma de generar el cdigo permite determinar cul es el f a llamar (tabla de mtodos virtuales A un objeto creado por reflection cuyo nombre no se conozca por el que escribe el cdigo no se le podr invocar un mtodo f aunque sepamos que un mtodo con tal nombre existe a.f() ;

o dinmico usando Reflection

Solucin esttica. Tenemos la clase LocalA que implementa la interface y debe estar en el proyecto a compilar

C311

C312

implementadora est en una DLL


La clase est en una DLL que no hay por qu conocer en tiempo de compilacin y que cargamos en runtime El nombre de la clase que implementa la interface se conoce en runtime. Luego de cargar el ensamblado se crea una instancia de dicha clase.

CreateInstance devuelve object por lo que se aplica un cast para interpretarlo como del tipo que sabemos que es.

pe Discovering

Buscar a alguien (no conozco el nombre) que implemente la interface (type discovering)

Crear una instancia de dicha clase. Castearla segn la interface. E invocar al tal mtodo

s dinmico an
Reflection da todas las capacidades para hacer anlisis en runtime. Pero es algo bizarro Buscando un tipo que implemente un mtodo

Creando una instancia del tipo

Llamando al mtodo a travs de la instancia

o dinmico usando dynamic

Nuevo tipo de especificacin


si d es dynamic el compilador deja pasar esta llamada y genera cdigo para que el DLR determine en runtime si hay un tal mtodo M

Las 4 clases tienen F pero no tienen una base comn ni se dicen implementar una misma interface Dos de las clases tienen un mtodo M que no devuelve lo mismo

Se resuelve en ejecucin Dar excepcin porque no hay nadie con mtodo H

Qu pasa?

Expando Object
Usamos cualquier nombre como propiedad Usamos la propiedad segn lo que pusimos Qu da esto? Y esto?

No da error de compilacin pero da excepcin en ejecucin

ractuar con el comportamiento dinm

amicType por dentro

namicType por dentro

jemplo de aplicacin
Calcular el n-simo trmino de la sucesin de

13

21

34

55

89 ...

Fib(n) = Fib(n-1) + Fib(n-2)

La solucin recursiva es sencilla pero engaosa porque se repiten clculos innecesarios


Fib(9) Fib(8) Fib(7) + + Fib(10 + ) Fib(7) Fib(7) Fib(8) + Fib(6)

Fib(6)

Vamos a definir un tipo de objeto que "memorice" si fue usado como invocacin Tendr internamente un diccionario para memorizar las invocaciones supone que en el constructor se le pasa el mtodo que se quiere memorizar Se crea un diccionario por cada mtodo a memorizar

Si para esos parmetros est en el diccionario es porque ya fue calculado

Se invoca al delegado de la variable _method y se guarda en el diccionario

morizar Fibonacci
Se crea un objeto con su diccionario

Como FibDynamic tiene un objeto de tipo DynamicMemoize que es DynamicObject al invocarlo de esta manera se ejecuta su mtodo TryInvoke

zar mtodo de 2 parmetros

Memorizar una funcin de dos parmetros

Como SlowConcat es dynamic no hay restriccin sintctica para escribir esto, la resolucin la hace dinmicamente el TryInvoke

CP
Definir un tipo MemoizeAll que permita memorizar "todos" los mtodos de un objeto
class A { public int M(int k) {} public string H(string s, int j) {} }
Al construirlo se indica el objeto cuyo comportamiento se quiere memorizar

A a = new A(); dynamic memoized_a = new MemoizeAll(a); Console(memoized_a.M(3)); El objeto memoized_a se comportar como a Console(memoized_a.H("abc", 2); Pero si un mtodo ya fue calculado Console(memoized_a.M(3)); para una combinacin de parmetros
no lo vuelve a calcular

pado dinmico
Podemos tener objetos de diferente tipo que tienen en comn un determinado recurso F y que sin embargo no heredan de una clase base comn. Cmo podemos usar cualquiera de esos objetos en un escenario que slo est interesado en aplicar F ? Podemos cargar dinmicamente un ensamblado, pero y si no sabemos los nombres de los tipos a buscar? Pueden haber situaciones en que un tipo se forma en tiempo de ejecucin (runtime) por lo que las entidades no pueden declararse estticamente como del tal tipo. Queremos lidiar con un contexto externo a nuestro cdigo que produce objetos (que los recibiremos como object ) cuyo tipo esttico no lo conocemos para aplicar un cast a dicho objeto. Queremos obtener rpidamente, y con flexibilidad, prototipos que no podemos pasar por el proceso

mico vs Esttico

Flexibilidad (til cdo el conocimiento es incompleto Tipado o incierto) dinmico Interoperabilidad con otros escenarios Rpidos prototipos y soporte para DSL

Eficiencia al esttico hacerse menos verificaciones en runtime Mejores Herramientas de ayuda

Prevencin temprana de errores Tipado

Dynamic Language IronPython IronRuby C# Runtime (DLR)


Expression Trees Object Binder
JavaScript Binder

VB.NET

Otros

Dynamic Language Runtime (DLR)


Dynamic Dispatch Python Binder Call Site Caching Ruby Binder COM Binder

thon C#4.0 Interoperation


Crear un motor de Python dentro la aplicacin C#

Para ese motor crea un scope (donde estarn las variables y objetos creados en Python) A ese motor se le puede mandar a ejecutar cdigo Python en un scope

Al scope se le puede pedir una variable que tenga el cdigo Python y traerla a evaluar desde cdigo C#

trn Memoized en Python


Un decorador puede ser cualquier objeto que tenga los mtodos __init__ y __call__ El __init__ se ejecuta cdo se hace la accin de decorado El __call__ es la parte del decorador que se ejecuta cdo se invoca al mtodo decorado

Decorando un mtodo. El __init__ del decorador se ejecutar cuando se ejecute la definicin a continuacin

DEM

trn Memoized en Python


Un decorador puede ser cualquier objeto que tenga los mtodos __init__ y __call__ El __init__ se ejecuta cdo se hace la accin de decorado El __call__ es la parte del decorador que se ejecuta cdo se invoca al mtodo decorado

Decorando un mtodo. El __init__ del decorador se ejecutar cuando se ejecute la definicin a continuacin

DEM

Вам также может понравиться