I have a set of extension methods that I regularly use for various UI tasks. I typically define them to run off of type object, even though inside of them I’m typically converting them to string types.
public static string FormatSomething(this object o)
{
if( o != null )
{
string s = o.ToString();
/// do the work and return something.
}
// return something else or empty string.
}
The main reason I use type object and not string is to save myself in the UI from having to do <%#Eval("Phone").ToString().FormatSomething()%> when I can do <%#Eval("Phone").FormatSomething()%> instead.
So, is it fine from performance standpoint to create all the extension methods on object, or should I convert them to be string (or relevant) types based on what the extension method is doing?
Yes. If you pass a value type in then the value type will be boxed. That creates a performance penalty of allocating the box and doing the copy, plus of course later having to garbage collect the box.
Instead of
I would write
That has the same effect, but avoids the boxing penalty. Or rather, it trades a per call boxing penalty for a first call jitting cost penalty.
We cannot answer the question. Try it! Measure the performance, compare that against the desired performance, and see if you met your goal. If you did, great. If not, use a profiler, find the slowest thing, and fix it.
But neither question is the question you should be asking. The question you should have asked is:
No. It is almost never a good idea. In most cases where people want to do that, they are abusing the extension method mechanism. Typically there is some more specific type that could be extended. If you do this a lot then you end up with lots of extension methods on every type, and coding becomes confusing and error-prone.
For example, suppose you want to have an extension method that answers the question “does this sequence contain this value?” You could write:
and then say
But it is much better to say:
and then say
If you do it the first way then you’re typing along in the IDE and every single time you type “.”, you get prompted with
IsContainedInas an option because maybe you’re about to write code that determines if this object is in a collection. But 99% of the time, you’re not going to do that. Doing this adds noise to the tooling and makes it harder to find what you really want.