2013-05-23 9 views
16

Immagino che si tratti più di una domanda di progetto di struttura. Recentemente mi sono chiesto perché la maggior parte dei metodi in System.Array sono statici. La mia reazione istintiva è sempre quella di usare per es. IndexOf (oggetto) nell'istanza Array, non come System.Array.IndexOf (array, object). C'è un principio fondamentale dietro la decisione, se rendere un metodo statico o no?Perché la maggior parte dei metodi di System.Array è statico?

Ho trovato questa domanda: When is it best to use Static Functions in ASP.NET

Ma non mi soddisfaceva: -/

+2

(Ho rimosso il tag ASP.NET, perché la progettazione di 'Array' ecc non è correlata a ASP.NET) –

+0

Vorrei stabilire che la maggior parte di essi sono statici perché sono pensati solo per gli array e i metodi di estensione non erano inventato al momento. – Romoku

+1

@Romoku potrebbero ancora essere metodi di istanza, anche se –

risposta

1

La maggior parte del tempo si eredita di System.Array sta usando un'array monodimensionale. come:

int[] a1 = new int[2]; 

Quando si definisce int[] questo modo implicito derivato da System.Array tipo come @Sergey Rybalkin dice. In questo caso il metodo IndexOf sarà sicuramente implementato al meglio come metodo di istanza e non come metodo statico.

Ma esiste un altro tipo che eredita da System.Array come matrici a più dimensioni. In questo caso (mult dimensione) il metodo IndexOf non ha senso.

Verifica questo:

int[,] arr = new int[2, 2]; 

arr[0, 0] = 3; arr[1, 0] = 4; 
arr[0, 1] = 5; arr[1, 1] = 6; 

Array.IndexOf(arr, 4); 

L'ultimo come lancia un RankException con il messaggio "Only single dimension arrays are supported here."

Forse, e molto probabilmente, a causa di che questo metodo è implementato come statica.

...

proposito il commento Is there a main principle behind the decision, whether to make a method static or not?

c'è, e il principio è abbastanza semplice. Il metodo di istanza rappresenta un'azione o un comportamento di un oggetto. Il metodo statico è una funzione del sistema che è legata alla logica della classe o, in alcuni casi, un metodo che si desidera chiamare senza creare un'istanza della classe.

Pensa al System.Math classe come sarà il caos se hai bisogno di matematica di istanze ogni volta che vuoi chiamare un metodo come Sqrt o Pow?

L'ultimo esempio che vi darò è la classe System.Text.RegularExpressions.Regex. Questa classe ha un metodo Match implementato come istanza e un sovraccarico implementato come statico.

Ognuno viene utilizzato in un contesto diverso. L'istanza viene utilizzata quando si utilizza lo stesso pattern più volte. La statica quando si utilizza il modello un tempo unico nel codice.

+4

"Se la risposta è illuminante, per favore segna ..."? :-P No no .. Segna come risposta corretta * se questa è la risposta corretta *. – Patrick

+0

Non penso che i tuoi esempi aggiuntivi siano abbastanza adatti. Non avrebbe senso creare funzioni come i metodi di istanza 'Sqrt' o' Pow' di 'System.Math' perché quelle funzioni * non richiedono un'istanza' System.Math' *. D'altro canto, sarebbe possibile concepirli con metodi di istanza dei vari tipi di numeri come 'double' ecc. Per quanto riguarda le espressioni regolari, il metodo statico non * funziona meglio * per invocazioni univoche IMO; aiuta solo ad accorciare il codice. –

+0

@O. R. Mapper il giusto metodo di istanza ha un rendimento migliore. Ho corretto il testo. –