2009-12-07 15 views
39

Muchas listas de preguntas de entrevistas de .Net (including the good ones) contienen la pregunta: "¿Qué es la reflexión?". Recientemente me pidieron que respondiera esto en el contexto de una prueba técnica de 5 preguntas diseñada para completarse en 15 minutos en una hoja de papel en blanco que me entregó en una cafetería. Mi respuesta fue a lo largo de las líneas de "Reflexión le permite descubrir los métodos, propiedades y campos de cualquier objeto en tiempo de ejecución". En retrospectiva, mi respuesta explica cómo puedes usar la reflexión, pero no explica qué es el reflejo. En mi opinión, mi respuesta fue suficiente para transmitir que entiendo lo que la reflexión es para pero no ir tan lejos como para explicar lo que es la reflexión .En 3 minutos, ¿qué es la reflexión?

Así que por favor, en el contexto de .Net, en sus propias palabras concisas, definir lo que es la reflexión . No pases más de tres minutos respondiendo. No se refiera a the .Net documentation, todos lo hemos visto.

+1

"No gastar mo Re de 3 minutos, no consulte la documentación ". . . no hagas preguntas como esta. Votando para cerrar. –

+6

Puede cerrarlo si lo desea. Ya obtuve algunas buenas respuestas y es por eso que hice la pregunta. – grenade

+0

@Binary Worrier, puede haber sido engañoso con mi declaración de no referirme. Quiero decir que la respuesta no debería ser "leer los documentos en alguna URL" en lugar de no usar la documentación para hacer una buena respuesta. – grenade

Respuesta

42

La reflexión es la capacidad de consultar e interactuar con el sistema de tipo de una manera dinámica.

+0

¡Eso es bueno! Muy conciso y "dinámico" dice mucho. – grenade

+3

Pero entonces, ¿el código de un método forma parte del sistema de tipo? Me parece que usted interactúa con algo más que el sistema de tipo –

+1

@Vinko: los métodos se definen en el contexto de los tipos, entonces yo diría que sí, pero veo su punto. Para ser honesto, no esperaba cubrir todos los detalles de la reflexión en una sola oración. –

9

La reflexión es la conciencia de los objetos a nivel de código esos nombres genéricos, métodos, etc., que se expone a través de una API, a saber System.Reflection, que permite a los desarrolladores aprovechar conocimiento del tiempo de ejecución de esta información en su código de CLR.

Infracción de regla: He editado esta respuesta desde su forma original por razones de precisión.

+0

La reflexión no requiere el compilador en tiempo de ejecución. – Guge

+0

¿Es consciente del compilador o conciencia de CLR? –

+2

De hecho, me gusta esta respuesta que cambia el compilador por el tiempo de ejecución. –

6

La reflexión es como la mirada naval para el código.

+4

¿incluso quiero saber qué es el naval-gazzing? – Pondidum

+3

algo que involucra el reabastecimiento de combustible de buques de la Armada. –

+0

oh naval cuando viajo ... lo único que podía pensar era en ombligos ... – Pondidum

11

una forma de introspección es decir, la capacidad de escribir código que consulta el código

+4

+1 respuesta más comprensible de IMO - ahora veo por qué se llama 'reflexión', como mirar en un espejo. – jacknad

4

me gusta tu respuesta, pero también quisiera mencionar que la reflexión es también una forma de obtener/establecer/campos protegidos/propiedades privadas, que de otro modo no estará disponible en tiempo de ejecución.

+0

La reflexión sí lo permite, pero esa no es una de las cualidades redentoras de Reflection IMO. Los campos se configuran como privados por una razón: está violando la encapsulación usando Reflection como tal, por lo que debe evitarse si es posible. Además, esta respuesta es cómo usar la reflexión, no qué es el reflejo. – antik

+0

Por lo general, estoy de acuerdo con su razonamiento, pero también pienso en la situación en la que está trabajando con un componente de un tercero al que no tiene otro acceso sino pirateando con Reflection. Y sí, tienes razón, solo quería mencionar algo que no se ha dicho en las 5 respuestas anteriores. Prefiero agregar algo no dicho al hilo en lugar de repeatingm, incluso si esto significa divergir un poco de la pregunta ... siempre y cuando pueda agregar valor a la discusión :) – tzup

+1

Estoy de acuerdo en que no es bonita, pero a veces realmente necesita algo de un control de terceros. Encontré una fuga de memoria en uno y no lo parcharon durante meses, así que usé la reflexión para hacerlo yo mismo temporalmente. – PeteT

5

Durante la compilación de un lenguaje .Net, el compilador pone la información sobre el programa en el archivo de programa. Esta información puede ser utilizada por el programa mismo o por otros programas para averiguar qué clases contiene el programa, cuáles son sus métodos, propiedades, campos y eventos. Las clases y sus métodos, propiedades, etc. también se pueden usar a través de la reflexión, incluso si el otro programa no sabe nada sobre ellos antes de ejecutarlos. Esto permite que diferentes programas se acoplen de manera flexible y hace posible todo tipo de programación interesante. Reflection también se puede utilizar para crear clases adicionales en programas en ejecución o en archivos de programa.

+0

-1: en realidad no explica la reflexión. Claro, es posible obtener las clases, los métodos, etcétera, a través de la reflexión, pero es difícil hacerlo. Es mucho más simple usarlos estáticamente. La reflexión, sin embargo, se puede usar para el tiempo de ejecución, en lugar de compilar el descubrimiento de tiempo de los tipos y sus métodos. – Arafangion

+0

Arafangion, mi respuesta contiene qué es la reflexión, cómo funciona, cómo se puede usar y creo que mi respuesta en realidad incluye lo que sugiere en su comentario. Le sugiero que lea las respuestas antes de rechazarlas. – Guge

+0

Guge: Estrictamente hablando, sí, sin embargo, no señala realmente las implicaciones prácticas ni la diferencia entre el tiempo de compilación y la reflexión en tiempo de ejecución, y no estoy de acuerdo en cómo permite el acoplamiento flexible. (En el contexto de .NET, no hay diferencia con respecto al acoplamiento). De hecho, gran parte de lo que señala podría hacerse con C y el enlazador dinámico. (Tienes razón, sin embargo, esta fue realmente una respuesta exigente ... Probablemente no valga la pena el voto negativo, sin embargo, los votos bajos apenas afectan la reputación) – Arafangion

2

Reflection es el currículum del código.

+1

Quieres decir _résumé_, pero me pareció demasiado el significado de 'En Error Resume Next'. Necesito aclarar mi mente de los VB-ismos. –

8

La reflexión es la capacidad de un programa para manejarse como datos.

+0

Por favor, elabore – graumanoz

0

La reflexión es tanto los metadatos como lenguaje intermedio de Microsoft (MSIL) junto envuelta en un archivo portátil excutable (PE) y esto se puede acceder en tiempo de ejecución por un mecanismo.

0

La reflexión es otra cosa que la capacidad de acceder método de otros DLL que no se han incluido en su proyecto (puede ser su propio sistema o creado) en el tiempo de ejecución de forma dinámica. También es útil para evitar problemas de dependencia circular.

0

La reflexión es la capacidad de actuar como un DIOS (G eneralO peracionesD irector ;-)) - se puede 'ver' la parte interna de una asamblea y hacer varias leyes (Sistema. Reflection), especialmente diseñado para el tiempo de ejecución, como consultar los tipos y sus miembros, buscar interfaces o atributos, crear instancias de tipos desconocidos en tiempo de compilación e incluso crear nuevos tipos (System.Reflection.Emit).

0

Al usar Reflection en C#, uno puede descubrir detalles de un objeto, método y crear objetos e invocar métodos en tiempo de ejecución.

using System; 
using System.Reflection; 

public class MyClass 
{ 
    public virtual int AddNumb(int numb1,int numb2) 
    { 
    int result = numb1 + numb2; 
    return result; 
    } 

} 

class MyMainClass 
{ 
    public static int Main() 
    { 
    // Create MyClass object 
    MyClass myClassObj = new MyClass(); 
    // Get the Type information. 
    Type myTypeObj = myClassObj.GetType(); 
    // Get Method Information. 
    MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 
    object[] mParam = new object[] {5, 10}; 
    // Get and display the Invoke method. 
    Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " + 
         myMethodInfo.Invoke(myClassObj, mParam) + "\n"); 
    return 0; 
    } 
} 

continuación Código obtendrá la información del tipo:

Type myTypeObj = Type.GetType("MyClass"); 

El siguiente fragmento de código obtendrá la información del método

Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 

El siguiente fragmento de código, se invocará el método AddNumb:

myMethodInfo.Invoke(myClassObj, mParam); 
Cuestiones relacionadas