Perché i metodi di array non sono integrati in un'istanza di array?
Domanda
Scusami per quella che è probabilmente una domanda sciocca ma mi sta infastidendo ...
int[] i = {3, 2, 1};
//why
Array.Sort(i);
//instead of
i.Sort();
char c = 'c';
//why
char.IsLetter(c);
//instead of
c.Isletter();
Soluzione
Grazie a Pedro d'Aquino per aver identificato queste altre domande che forniscono risposte.
Il punto di base è che i metodi di istanza sulle strutture non sono thread-safe ma i metodi statici lo sono.
Vedi queste domande:
Altri suggerimenti
Questi sono metodi utility che non devono appartenere a queste classi. Ciò rafforza il Principio di responsabilità unica
(modifica) Ero confuso con Java
( Informazioni sui membri statici ):
È possibile utilizzare i membri di classe statici dati e comportamenti separati indipendente da qualsiasi identità di oggetto: i dati e le funzioni non cambiano indipendentemente da ciò che accade al oggetto. Le classi statiche possono essere utilizzate quando non ci sono dati o comportamenti in la classe che dipende dall'oggetto identità.
Il punto di vista thread-safe è anche una buona ragione.
Puoi farlo da solo se usi .NET 3.0, usando i metodi di estensione:
public static class Extensions
{
public static bool IsLetter(this chr)
{
return char.IsLetter(chr);
}
}
quindi chiamalo come: c.IsLetter ()
O fai come vuoi tu. Lo stesso all'ordinamento
È una decisione di implementazione. Non so cosa stesse succedendo nelle teste del progettista del framework, ma credo che uno dei motivi sia quello di consentire di ordinare la matrice di tipi personalizzati con il minimo sforzo.
Qualsiasi classe che implementa iComparable può essere inserita in un array e ordinata. Se fosse un metodo dell'array, allora dovrei scrivere un nuovo tipo di array per il mio tipo personalizzato.
Inoltre, come altri hanno notato, i tipi primitivi richiedono questo design di un array.