2011-11-15 17 views
7

Ci scusiamo per la natura incolta di questa domanda. Se c'è una risposta semplice, solo un link a una spiegazione mi renderà più che felice.Perché i metodi statici devono essere inclusi in una classe?

Dopo 6 mesi di programmazione, trovo che le classi statiche siano in qualche modo utili per memorizzare routine che si applicano a molte classi diverse. Ecco un esempio semplificato di come uso classi statiche, è una classe per l'analisi del testo in varie cose

public static class TextProcessor 
{ 
    public static string[] GetWords(string sentence) 
    { 
     return sentence.Split(' '); 
    } 

    public static int CountLetters(string sentence) 
    { 
     return sentence.Length; 
    } 

    public static int CountWords(string sentence) 
    { 
     return GetWords(sentence).Length; 
    } 
} 

e io uso questo in modi ovvi come

class Program 
{ 
    static void Main(string[] args) 
    { 
     string mysentence = "hello there stackoverflow."; 
     Console.WriteLine("mysentence has {0} words in it, fascinating huh??", TextProcessor.CountWords(mysentence)); 

     Console.ReadLine(); 
    } 
} 

La mia domanda è: Perché è necessario per avvolgere questi metodi statici in una classe statica? Sembra non servire a nulla. C'è un modo in cui posso avere questi metodi da soli non inclusi in una classe? So che l'incapsulamento è vantaggioso, ma non vedo l'uso dei metodi statici racchiusi nella classe statica. C'è qualcosa che mi manca stilisticamente o altrimenti? Sto abbaiando completamente su un albero stupido? Sto pensando troppo?

+0

Grande domanda, ma sospetto che sia solo un noioso "perché Java l'ha fatto". – Jacob

+0

Alla fine si riduce a come è stato progettato il linguaggio. Tutti i metodi devono essere in una classe. Perché? Probabilmente per coerenza. –

+0

controllo questo [post] [1] [1]: http://stackoverflow.com/questions/7933540/c-sharp-static-class-why-use – xgencoder

risposta

6

In C#, qualsiasi metodo deve essere dichiarato all'interno di una classe. Ecco come viene specificata la lingua.

una classe statica è in realtà più akin to a module di una classe, così anche penso che si dovrebbe essere in grado di entrambi:

  • definire una funzione di fuori di una classe o;
  • importare un modulo allo stesso modo si importa un namespace (con using)

VB.NET, C# e Nemerle in realtà consentono di dichiarare i moduli e importarle; cosa ti permette di usare i loro metodi non qualificati.

Questo è Nemerle valida:

using System.Console; // import static methods in the Console class 
class Hello { 
    static Main() : void { 
    WriteLine("Hello, world!"); // unqualified access! 
    } 
} 

Inoltre, dare un'occhiata a extension methods, che potrebbe consentire di "risolvere" questo in un modo diverso. I metodi nel tuo TextProcessor sono che implorano per essere i metodi di estensione string.

+1

Grande, Nemerle sembra interessante. I moduli sarebbero fantastici in C#. –

-3

Un metodo statico è un metodo chiamato in una singola istanza di una classe creata in fase di esecuzione.

1

Sarebbe un po 'imbarazzante avere metodi che penzolano in uno spazio dei nomi casuale.

Sospetto che la risposta sia fornire "ambito". Solo perché un metodo è statico, non significa che non abbia un ambito. Può ancora accedere ad altri metodi statici privati ​​o variabili membro e la classe fornisce una "casa" in cui queste cose possono vivere.

Le classi statiche possono anche avere costruttori statici che vengono richiamati la prima volta che viene utilizzato un metodo statico, quindi questo fornisce la possibilità di impostare le cose come necessario.

È più di un progetto organizzativo che altro a causa di limitazioni tecniche.

+2

"Sarebbe un po 'imbarazzante avere metodi che si aggirano in uno spazio dei nomi casuale." - * La maggior parte delle * lingue ti consente di farlo. – jjnguy

+0

La maggior parte delle lingue orientate agli oggetti? –

+0

Vedo che vedo. Quindi in un linguaggio "ibrido" come C++ puoi avere accesso a funzioni al di fuori di una classe ma in un linguaggio OO rigido come C# devi incapsulare tutto all'interno di una classe? .. ha senso. Rende molto più codice di quello necessario, penso. –

-1

già ci sono molti thread su questo argomento che hanno abbastanza informazioni ...potete trovarne uno here..

2

This post by eric lippert fornisce una spiegazione piuttosto dettagliata. Non sono sicuro che questo ragazzo "eric" sappia di cosa sta parlando o meno ;-)

+0

lol. Grazie. Sì, sono sicuro che Eric è un idiota ^^ –

Problemi correlati