2012-05-26 9 views
5

estoy tratando de familiarizarme con los delegados y en http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx, estoy leyendo:delegados en C# y punteros FNC en C++

"A diferencia de los punteros de función en C o C++, los delegados están orientados a objetos, tipo- seguro y a salvo."

una media, tengo fondo C++, y de alguna manera no veo cómo entender la palabra "diferente" allí. ¿Qué quieren decir con delegados que están orientados a objetos y que los punteros C++ fnc no lo son? Lo mismo para tipo seguro y seguro.

¿Alguien podría mostrar algunos ejemplos y contraejemplos?

Gracias.

+1

ver este preguntas ..... [Tipo insegura de C++ punteros de función] [1] [¿Por puntero C# función es mejor que C++ puntero de función] [2] [ 1]: http://stackoverflow.com/questions/10237847/how-are-function-pointers-type-unsafe [2]: http://stackoverflow.com/questions/2535516/how-are-delegates- in-c-sharp-better-than-function-pointers-in-cc –

+0

Posible duplicado: [hay indicadores de función en C#] (http://stackoverflow.com/questions/2738850/are-the re-function-puninters-in-c) –

+0

#MdKamruzzamanPallob desde el primer enlace: "Los punteros de función son de hecho revisados ​​y son de tipo seguro". – smallB

Respuesta

6

Un delegado hace bastante más que un puntero a la función. No solo almacena la dirección de la función, sino que también almacena una referencia al objeto de destino. A diferencia de un puntero de método C++. Por lo tanto, es fácil de usar para llamar a un método de instancia. Eso se ocupa del reclamo "orientado a objetos".

Un poco cuesta abajo desde allí, pero la seguridad de tipo está garantizada por el compilador que verifica que la firma de la función coincide exactamente con el tipo de delegado cuando asigna el delegado. Lo cual no es diferente en C++, pero no hay forma de descartar un desajuste. Otro posible aspecto de seguridad es que la referencia de objeto mantenida por el objeto delegado es visible para el recolector de elementos no utilizados. Por lo tanto, nunca puede llamar a un método de instancia en un objeto eliminado.