Dovresti dichiarare metodi usando sovraccarichi o parametri facoltativi in ​​C # 4.0?

Stavo guardando il discorso di Anders su C # 4.0 e un’anteprima di C # 5.0 , e mi ha fatto pensare a quando i parametri opzionali sono disponibili in C # quale sarà il modo consigliato di dichiarare metodi che non hanno bisogno di tutti i parametri specificati?

Ad esempio qualcosa come la class FileStream ha circa quindici diversi costruttori che possono essere suddivisi in “famiglie” logiche, ad esempio quelle sottostanti da una stringa, quelle di un IntPtr e quelle di un SafeFileHandle .

 FileStream(string,FileMode); FileStream(string,FileMode,FileAccess); FileStream(string,FileMode,FileAccess,FileShare); FileStream(string,FileMode,FileAccess,FileShare,int); FileStream(string,FileMode,FileAccess,FileShare,int,bool); 

Mi sembra che questo tipo di pattern possa essere semplificato avendo invece tre costruttori, e usando parametri opzionali per quelli che possono essere predefiniti, il che renderebbe le diverse famiglie di costruttori più distinte [nota: so che questo cambiamento non sarà fatto nel BCL, sto parlando ipoteticamente per questo tipo di situazione].

Cosa ne pensi? Da C # 4.0 avrà più senso creare gruppi di costruttori e metodi strettamente correlati con un singolo metodo con parametri opzionali, o c’è una buona ragione per attenersi al tradizionale meccanismo a molti sovraccarichi?