I want to redefine the ToString() function in one of my classes.
I wrote
public string ToString()
... and it's working fine. But ReSharper is telling me to change this to either
public new string ToString()
or
public override string ToString()
What's the difference? Why does C# requires something like this?
C# doesn't require it; Resharper does. It requires it because the two keywords represent significantly different behavior, and if you don't specify, someone reading your code might not be entirely clear on which the default behavior is (it's
new
.)In this case you clearly want to override.
ToString is a virtual method in base class. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.
You want to override. There's really no advantage to hiding in your case (using "new").
Here's an article on the differences between overriding and hiding.
If you use
public string ToString()
it is unclear what you intended to do. If you mean to change the behaviour ofToString
via polymorphism, thenoverride
. You could add anew ToString()
, but that would be silly. Don't do that!The difference is what happens when you do:
If you
override
, both will output your new version. If younew
, only the first will use your new version; the second will use the original implementation.I don't think I've ever seen anybody use method hiding (aka
new
) onToString()
.A personal recommendation from me would be to not use hiding; it causes many ambiguities and solves few.
What you do all depends on the behaviour you want. This article explains how the behaviour of ToString works depending on how you defined the method and what level in a class hierarchy you call ToString on.