+2  A: 

A confusing API is the eternal bane of library consumers. Make it easy, even trivial, for people to decide exactly what they want to do given the interface you provide. If they must pick from a lengthy list of overloaded functions, that's probably too much cognitive overhead. Also, it's worth noting that C# 4 will have support for optional and named parameters, so your System.Missing problem will go away by itself.

Is it frowned upon in terms of OOP?

OOP favors the Single Responsibility Principle, or SRP. If you have a single class with many of these functions, each having many overloads, that suggests that it may be doing too much.

Does it decrease in efficiency?

If you have a lot of overloads for the same method, it takes longer to statically resolve each function call (i.e., "which method with this name is the right one?"). But that's not going to have a runtime impact on performance if they're nonvirtual calls -- that is, where the compiler can statically know exactly what type something is going to be. Either way, though, I don't think that should be your motivating factor here.

John Feminella
+1  A: 

If you have a lot of parameters and need to be extensible consider using a class that contains your parameters.

E.g.

public class FileOptions
{
  public bool Indented { get; set; }
  public string Namespace { get; set; }
  public System.Text.Encoding Encoding { get; set; }
}

public void Save(string fileName, FileOptions options) { ... }

// usage:

obj.Save("a.xml", new FileOptions { Indented=true });
obj.Save("b.xml", new FileOptions { Namespace="urn:foo", Encoding=System.Text.Encoding.UTF8 });
chris
I like this approach but the only problem I have with it is that I want an overrided method from the base class to initiate in the constructor or on initialization of the object.
Ayo