tipos - parametros dinamicos c#
¿Por qué el tipo dinámico de C#estático? (2)
Esto es tipeo estático:
string foo = "bar";
foo
ahora es una cadena, por lo que provocará un error de tiempo de compilación:
foo = 1;
Incluso si usa var
, todavía está tipado estáticamente:
var foo = "bar"; // foo is now a string
foo = 1; // still a compile time error
El uso de la palabra clave dinámica significa que el tipo no será estático y puede modificarse, por lo que ahora puede hacer esto:
dynamic foo = "bar";
foo = 1; // this is now fine.
Ahora, por qué dice "el tipo es estático" es porque en muchos lenguajes dinámicos (como Javascript), puedes hacer algo como esto:
var foo = { bar: 1 };
Lo cual crea un objeto con una propiedad llamada "barra", y luego puedes hacer esto:
foo.la = 2;
Lo cual agrega una nueva propiedad al objeto en foo
. Pero si prueba el mismo truco en C #
dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2; // runtime error
Tampoco puedes eliminar una propiedad. Puede asignar cualquier tipo a una variable dinámica, pero no puede cambiar esos tipos por sí mismo.
Si necesita ese tipo de funcionalidad, entonces querrá ver ExpandoObject
Como dice su descripción, dynamic
funciones dynamic
son como un objeto en muchos casos. Podrías hacer esto:
dynamic foo = new Foo();
foo = new Bar();
Tan bien como esto:
object foo = new Foo();
foo = new Bar();
Pero la diferencia aparece cuando quieres usar propiedades o métodos. Con dinámica, puedo hacer esto:
dynamic foo = new Foo();
foo.FooMethod(); // Note: You WILL get a runtime exception if foo doesn''t have a FooMethod
Pero con un objeto, tendría que hacer esto:
object foo = new Foo();
((Foo)foo).FooMethod(); // Note: I HAVE to know the type at compile time here
Lo cual solo puedo hacer si ya sé que puedo convertir el tipo en foo
a un tipo de Foo
en tiempo de compilación , y si ya lo sabía, podría usar Foo
como mi tipo en lugar de object
.
Mientras leía y exploraba la palabra clave dinámica encontré la siguiente línea en [MSDN] (en Using Type dynamic (C # Programming Guide) ):
El tipo es un tipo estático, pero un objeto de tipo dinámico omite la verificación de tipo estático. En la mayoría de los casos, funciona como si tuviera un objeto tipo.
¿Cuál es el significado de estática en la línea anterior y cómo elude la verificación de tipo estático?
Significa que una variable declarada como dinámica se mantendrá de tipo dinámico y no se puede cambiar a una variable de tipo int por ejemplo. Sin embargo, se omite este concepto, porque puede cambiar los tipos de objetos que contiene la variable.
C # se considera un lenguaje fuertemente tipado porque las variables están tipadas estáticamente. Eso significa que cada variable se tipea y el compilador de C # puede verificar si se usan los tipos correctos en el código. En lenguaje débilmente tipado como la mayoría de los lenguajes de script, el tipo de variables es dinámico. Pueden contener cualquier valor.