Events instead of function pointers – The C# event pattern replaces the message registration mechanism of the MMessage derived classes (for example, MSceneMessage, MNodeMessage, and so forth). Therefore, you can register or unregister your callbacks by simply adding or removing them to/from the corresponding event handler of the MMessage derived class.
For instance, do MDagMessage.ParentAddedEvent += callback instead of MDagMessage::addParentAddedCallback(callback).
For the MSceneMessage class, each message identified by a value of the enum Message now has an independent event handler; therefore, the enum is no longer meaningful. For instance, do MSceneMessage.SceneUpdate += callback instead of MSceneMessage::addCallback( MSceneMessage::kSceneUpdate, callback ).
For callbacks related to an instance of an object (MDagPath, MPlug, and so forth), the event handler can be found directly in the class of that object. For instance, do obj.NodeAddedToModel += callback (with obj of type MObject) instead of MModelMessage::addNodeAddedToModelCallback(obj, callback).
To avoid memory leaks, you must deregister your callbacks (by removing them from the corresponding event handler) when the callbacks are no longer needed. A new mechanism has been added to automatically deregister the callbacks when the plug-in is unloaded from Maya.
To see how events are used, refer to the pluginCallbacks example in the <...>\devkit\dotnet\examples folder. For more information on C# events see C# events in MSDN.