2009-05-06 8 views
8

Estoy muy entusiasmado con las características dinámicas en C# (C#4 dynamic keyword - why not?), especialmente porque en ciertas partes de la Biblioteca de mi código uso mucha reflexión.¿La palabra clave "dinámica" de C# 4.0 hace que los genéricos sean redundantes?

Mi pregunta es doble:

1. ¿ "dinámico" reemplazar los genéricos, como en el caso de abajo? método

Generics:

public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) { 

     //test object is not null, regardless of its Type 
     if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) { 
      //do something 
     } 
    } 

método dinámico (??):

public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) { 

     //test object is not null, regardless of its Type?? but how? 
     if (ObjToTest != null) { 
      //do something 
     } 
    } 

2. hace "dinámico" ahora permitir métodos para volver Los tipos anónimos, como en el caso, por debajo ?:

public static List<dynamic> ReturnAnonymousType() { 
     return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList(); 
    } 

cool, cheers

EDIT:

haber pensado a través de mi pregunta un poco más, ya la luz de las respuestas, veo yo completamente en mal estado la principal pregunta genérica/dinámico. De hecho, son completamente diferentes. Así que sí, gracias por toda la información.

¿Qué pasa con el punto 2?

Respuesta

16

dynamic podría simplificar un número limitado de escenarios de reflexión (donde se sabe el nombre de miembro en la delantera, pero no hay ninguna interfaz) -, en particular, podría ayudar con los operadores genéricos (although other answers exist) - pero aparte de la truco de operadores genéricos, hay poco cruce con genéricos.

Genéricos le permiten saber (en tiempo de compilación) sobre el tipo que está trabajando - por el contrario, no dynamic atención sobre el tipo. En particular, los genéricos le permiten especificar y probar una serie de condiciones acerca de un tipo, es decir, podría implementar alguna interfaz o tener un constructor público sin parámetros. dynamic no ayuda con ninguno: no es compatible con las interfaces, y peor que simplemente no preocuparse por las interfaces, significa que ni siquiera podemos ver implementaciones de interfaz explícita con dynamic.

Además, dynamic es realmente un caso especial de object, por lo que el boxeo entra en juego, pero con una venganza.

En realidad, se debe limitar el uso de dynamic a unos pocos casos:

  • interoperabilidad COM
  • interoperabilidad DLR
  • quizá algunos de pato luz escribir
  • quizá algunos genéricos operadores

Para todos los demás casos, los genéricos y el C# normal son el camino a seguir.

+1

Otro uso sorprendentemente útil para la dinámica: interoperabilidad JSON en situaciones web RESTful, especialmente si el JSON en cuestión fluctúa mucho de llamada a llamada. Hay bibliotecas que serializarán y deserializarán JSON hacia/desde un objeto dinámico. – Randolpho

8

Para responder a su primera pregunta, los genéricos se resuelven en tiempo de compilación, tipos dinámicos en tiempo de ejecución. Entonces, hay una diferencia definitiva en seguridad y velocidad.

+2

Para completar, los genéricos en .NET son proporcionados por el tiempo de ejecución, y puede especificar argumentos genéricos en tiempo de ejecución si es necesario. –

+0

@Peter: gracias peter. Estaba pensando más en términos de implementación. Aunque ahora veo que usar "dinámico" en lugar de Genéricos, como mi ejemplo, sería como usar el Objeto – andy

6

Las clases dinámicas y los genéricos son conceptos completamente diferentes. Con los genéricos, usted define tipos en tiempo de compilación. No cambian, no son dinámicos. Simplemente coloque un "marcador de posición" en alguna clase o método para que el código de llamada defina el tipo.

Los métodos dinámicos se definen en tiempo de ejecución. No tiene seguridad de tipo de tiempo de compilación allí. La clase dinámica es similar, como si tuviera referencias a objetos y métodos de llamada por sus nombres de cadena mediante la reflexión.

3

Respuesta a la segunda pregunta: puede devolver tipos anónimos en C# 3.0. Envía el tipo al objeto, regrésalo y usa la reflexión para acceder a sus miembros. La palabra clave dinámica es solo azúcar sintáctica para eso.

+0

gracias niki. entonces, en C# 4.0, ¿podría regresar dinámica en lugar de objeto y luego no tener que usar la reflexión? – andy

+0

Sí, puedes. Use dynamic como el tipo de devolución para su método que devuelve un tipo anónimo. Luego puedes acceder a los miembros sin usar el reflejo. – Maggie

16

Para responder a su pregunta.

  • Genéricos le da "algoritmo de reutilización" - se escribe código independiente de un tipo de datos. la palabra clave dinámica no hace nada relacionado con esto. Defino List<T> y luego puedo usarlo para List of strings, ints, etc ...
  • Type safety: Todo el tiempo de compilación para verificar el debate. Las variables dinámicas no lo alertarán con advertencias/errores de tiempo de compilación en caso de que se equivoque, explotarán en el tiempo de ejecución si falta el método que intenta invocar. Discusión de tipado estático vs dinámico
  • Rendimiento: genéricos mejora el rendimiento de los algoritmos/código utilizando tipos de valores en un orden de magnitud significativo.Impide todo el ciclo de boxeo-desembalaje que nos costó pre-genéricos. Dynamic no hace nada por esto también.

Lo que la palabra clave dynamic que daría es

  • simple código (cuando se está interoperar con Excel permite decir ..) No es necesario especificar el nombre de la clase o el modelo de objetos . Si invocas los métodos correctos, el tiempo de ejecución se encargará de invocar ese método si existe en el objeto en ese momento. El compilador te permite escapar incluso si el método no está definido. Sin embargo, implica que esto será más lento que realizar una llamada a un método compilado/verificado por estática ya que el CLR tendría que realizar comprobaciones antes de hacer invocar un campo/var var dinámico.
  • La variable dinámica puede contener diferentes tipos de objetos en diferentes momentos: no está limitado a una familia específica o tipo de objeto.
+0

gracias Gishu, gran respuesta. Fue 50/50 entre usted y Marc. SO debería realmente permitir más de una respuesta ¿no? ... vaya figura.gracias de nuevo – andy

Cuestiones relacionadas