- Posted by Shay Friedman on July 25, 2011
I love C#, I really do. Of course is has its little annoying quirks here and there, but in general it is, IMHO, one of the best static programming languages out there. Having said that, one thing that makes me wonder “WHAT THE HELL WERE THEY THINKNING?!?$?!?” every single time is the feature known as “Method Hiding”.
What is Method Hiding?
Method hiding, in short, is the crippled, mentally-ill brother of method overriding. For example, look at the next code:
class A
{
public string GetName()
{
return "A";
}
}
class B : A
{
public new string GetName()
{
return "B";
}
}
Class A has a GetName method; class B inherits from class A and implements the GetName method as well.
Look carefully at the GetName method signature in class B – do you see the new keyword there? this means that the method doesn’t override the implementation in class A, it just hides it. What does that mean? read on.
So What’s the Big Deal? Hide, Override… Who Cares?
There is a huge difference in the behavior of method hiding and overriding. Look at the next two samples:

The left part is a method hiding example, and the right part is a method overriding example. Now let’s go through the use cases.
First – using the father classes:
FatherHidden fh = new FatherHidden();
fh.GetName(); // = "A"
FatherVirtual fv = new FatherVirtual();
fv.GetName(); // = "A"
Both are available and return the same result. Good.
Second – using the son classes:
SonHiding sh = new SonHiding();
sh.GetName(); // = "B"
SonOverriding so = new SonOverriding();
so.GetName(); // = "B"
Again, both methods return the expected result. Swell!
Third – using polymorphism – storing an instance of the son classes in a father class variable and calling the GetName method:
FatherHidden fh = new SonHiding();
fh.GetName(); // = "A"
FatherVirtual fv = new SonOverriding();
fv.GetName(); // = "B"
See that? the hidden method (FatherHidden.GetName) had suddenly woken up, took over and returned “A” instead of the expected “B”! kicking polymorphism out the door while doing it!
Is It a Problem?
Yes, it is. I’ve never found any reason to use method hiding and I can’t think of a good reason start using it in the future. OOP is great and I can’t understand why we need ways to screw it up. In my opinion, if you get to a situation where you need to use method hiding, re-think your design and start over.
This is not just a cute code smell. It can lead to nasty bugs along the way. For instance, I came across something like the next piece of code when doing a code-review lately:
class Base
{
public bool IsAuthenticated { get { return false; } }
}
class SomeAuthClass : Base
{
public new bool IsAuthenticated { get { return CheckAuthentication(); } }
}
Now, as long as they use SomeAuthClass variable types on their system, everything will work fine. But once a developer comes and wants to use some OOP magic, all users will immediately become unauthenticated. And this is no fun. No fun at all.
One of my major problems with method hiding is that it is C#’s default behavior – you don’t even need to write the new keyword. And even if the method on the base class is marked as virtual, and you forget to mark the method on the inheriting class with override – you fall back to method hiding…
#sadpanda
What I Am Suggesting
I know this feature isn’t going to disappear. Ever. I’m sure some people have found a reason to use it like there’s no tomorrow and Microsoft is one of the best in keeping their products backwards-compatible.
However, I would like:
- To get a compilation error if a method is going to hide another method and is not marked with the new keyword.
- To make the method hiding feature obsolete (yes, obsolete!) and get a compilation warning when using this feature in future versions of the framework.
- You to stop using method hiding.
- Everyone to recycle more and save the planet!
All the best,
Shay.