Академический Документы
Профессиональный Документы
Культура Документы
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).
.. . 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
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() ;
Solucin esttica. Tenemos la clase LocalA que implementa la interface y debe estar en el proyecto a compilar
C311
C312
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
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
Qu pasa?
Expando Object
Usamos cualquier nombre como propiedad Usamos la propiedad segn lo que pusimos Qu da esto? Y esto?
jemplo de aplicacin
Calcular el n-simo trmino de la sucesin de
13
21
34
55
89 ...
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
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
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
VB.NET
Otros
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#
Decorando un mtodo. El __init__ del decorador se ejecutar cuando se ejecute la definicin a continuacin
DEM
Decorando un mtodo. El __init__ del decorador se ejecutar cuando se ejecute la definicin a continuacin
DEM