Start here. This is the direct spoken answer to practice first.
Why this question matters
Several C# features use the same method name but select behavior at different times. Predicting the call requires separating the compile-time candidate from runtime virtual dispatch.
Overloading means several methods share a name but have different parameter lists; the compiler chooses the best applicable overload from the argument expressions and their compile-time types. Overriding replaces a virtual or abstract base implementation, and runtime dispatch selects the most-derived override for the actual object. Declaring new hides a base member instead of participating in that virtual slot, so the chosen member depends on the variable's declared type. I use override for polymorphic behavior and avoid hiding unless the distinction is deliberate and clearly documented.