Yay, activity on the forum!
In the past, I had assumed languages like C# eliminated memory leaks through automatic disposal of unreferenced memory allocations (garbage collector).
It does. You didn't explain what was happening in your particular situation, but...
There a couple things to consider:
First, you can cause memory to balloon if you keep references but forget to remove them. The event handler is one such situation because the dispatcher will hold a reference to the object (so that it can call the listener!). When the listener is called, you will have the opportunity to unregister it, so it hasn't technically leaked.
You could also have a situation with something like a list or dictionary where you keep adding objects, but forget to remove them.
Second, the GC doesn't collect every time memory loses all references. There is an algorithm that determines when it should collect.
So, let's say you have an update loop that is called every frame with a memory allocation of some sort. In most cases, the allocation is small enough or localized in scope that you won't have any memory issues, but for larger allocations, you will see memory slowly grow with each frame. What is happening is that the unreferenced memory has not yet been garbage collected. The result is you will see memory "spikes" in the graph as it collects every once in a while. For performance sensitive / real-time applications (like games), the large collection can cause intermittent pauses. In this case, you will want to cut back on such large and frequent allocations. The recommended practice would be to cache a reference and clear the data rather than allocate every frame. DotNetMissionSDK does this for the StateSnapshot class, which includes a huge allocation for the TileMap.
Traditionally, I wouldn't call any of these things memory "leaks" as that usually refers to memory that is allocated but no longer accessible. Since you have lost all references, you can't use or free the memory - it has leaked out of the program!
Memory management in C# is easier, but you still have to know what you are doing. Keep track of those references and minimize allocations!