Delegates are type-safe function pointers — they hold a reference to a method and allow you to pass methods around as variables, store them, and invoke them later. Events build on delegates to create a publisher/subscriber pattern where one object broadcasts a signal and many others can listen for it.