2010-05-28 15 views
14

Quando dovrei preferire una classe statica o una classe normale? Oppure: qual è la differenza tra loro?Qual è la differenza tra una classe statica e una classe normale?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace staticmethodlar 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SinifA.method1(); 
     } 
    } 

    static class SinifA 
    { 
     public static void method1() 
     { 
      Console.WriteLine("Deneme1"); 
     } 
    } 

    public static class SinifB 
    { 
     public static void method2() 
     { 
      Console.WriteLine("Deneme2"); 
     } 
    } 
    public class sinifC 
    { 
     public void method3() 
     { 
      Console.WriteLine("Deneme3"); 
     } 
    } 

    public class sinifD : sinifC 
    { 
     void method4() 
     { 
      Console.WriteLine("Deneme4"); 
     } 

     sinifC sinifc = new sinifC(); // I need to use it :) 
    } 
} 
+0

Domanda correlata http://stackoverflow.com/questions/1493862/making-methods-all-static-in-class – R0MANARMY

+3

possibile duplicato di [C# - Che cos'è una classe "statica"?] (Http: // stackoverflow .com/questions/695056/c-what-is-a-static-class) –

risposta

24

Le classi statiche contengono oggetti statici che non possono essere istanziati più volte. Solitamente quello che uso per le classi statiche è quello di ospitare metodi statici che forniscono calcoli, schemi di elaborazione generali, formati di output di stringhe, ecc. Le classi statiche sono leggere e non richiedono l'istanziazione.

Ad esempio System.IO.File è una classe statica con metodo statico Exists(). Non si crea un oggetto File per chiamarlo.Si richiama in questo modo

System.IO.File.Exists(filePath)

Piuttosto che fare questo

System.IO.File myFile = new System.IO.File(filePath);

if(myFile.Exists()) { /* do work */ }

Se avete bisogno di più oggetti nel software, quindi si utilizza classi dinamiche. Per esempio, se si dispone di un sistema di inventario si può avere diverse Product oggetti e in questo caso si usa una classe dinamica come questa

public class Product 
{ 

    public int ProductID { get; private set; } 
    public string ProductName { get; private set; } 
    public int Qty   { get; set; } 

    public Product(int productID, string productName, int total) 
    { 
     this.ProductID = productID; 
     this.ProductName = productName; 
     this.Qty = total; 
    }  
} 
3

Dal MSDN documentation on static classes:

Una classe può essere dichiarata static, indicando che essa contiene solo i membri statici. Non è possibile creare istanze di una classe statica utilizzando la nuova parola chiave. Le classi statiche vengono caricate automaticamente dal Common Language Runtime (CLR) di .NET Framework quando viene caricato il programma o lo spazio dei nomi contenente la classe.

+0

ci si chiede a cosa servono tutti quei GB di documenti. –

+0

Il commento "Imparare a leggere la documentazione" era davvero necessario? Certo, risponderò alla tua domanda ma ti mostrerò anche ciò che posso essere intellettualmente superiore. Buon venerdì! – DenaliHardtail

+1

@WaggingSiberian: concedendogli il beneficio del dubbio, questo è il primo risultato di Google per la frase di ricerca ** di classe statica C# **, sì, era necessario. Non ho voglia di fare una ricerca su google prima di pubblicare una domanda è un requisito irragionevole. – R0MANARMY

4

È possibile creare istanze di classi "normali" tramite il costruttore della classe.

var normal = new Normal(); 

Non è possibile creare istanze di classi statiche. Possono avere solo metodi statici.

Vale anche la pena notare che è deve dichiarare extension methods in classi statiche.

+0

ok quando uso la classe statica? – Penguen

+1

Buon punto sui metodi di estensione. – R0MANARMY

0

I membri statici possono essere chiamati senza utilizzare un'istanza della classe. Ad esempio, una classe matematica statica con una chiamata al metodo Area può essere chiamata da Math.Area senza prima istanziare la classe Math.

13
  • classi statiche non possono essere instantiated o inherited.
  • le classi statiche sono contrassegnate come sealed e abstract dal compilatore nell'output MSIL.
  • anche tutti i membri di classi statiche devono essere statici.
  • solo le classi statiche possono ospitare extension methods.
  • Le classi statiche non possono essere utilizzate come argomenti di tipo generico.
+0

potresti dirmi di più su "solo le classi statiche possono ospitare i metodi di estensione". Perché le normali classi non possono ospitare i metodi di esecuzione? Grazie! – Catbuilts

1

In termini semplici:

una classe statica non può essere un'istanza utilizzando la parola chiave new. Tutti i metodi in una classe statica devono essere statici e possono essere chiamati direttamente senza istanziazione.

Una classe "normale" DEVE essere istanziata tuttavia qualsiasi metodo statico in una classe "normale" può essere chiamato senza istanziazione.

I metodi non statici in una classe "normale" non possono essere chiamati senza prima istanziare la classe contenente.

+0

Quindi qual è la differenza tra la classe statica con la funzione Method1() e la classe normale con la funzione statica Method1(). E quale scenario useremo sopra il metodo .. –

0

una classe statica è uno che non può essere un'istanza. Pertanto, non può essere usato come un "modello" per più istanze di un oggetto che si conforma alla definizione della classe come una normale classe può. In una classe normale, i membri dati definiti sono creati per ogni "istanza" della classe, e ogni "istanza" ha il proprio insieme di questi membri dati, quindi queste istanze rappresentano singole "entità" o strutture dati in memoria complesse per alcuni oggetti (che hai codificato per rappresentare la classe)

Quando si definisce (codice) una classe statica, tutti i suoi campi di dati devono anche essere statici, il che significa che non possono essere istanziati una volta per ogni istanza della classe, (non è possibile creare istanze di una classe statica). Le classi statiche sono utili solo quando si bisogno di un contenitore per contenere metodi che non dipendono dallo stato di alcuni oggetti o strutture dati gestiti dall'applicazione (come una funzione di aggiunta, un formattatore di stringhe, ecc.)

0

Una classe normale è quella che è possibile creare un'istanza e può utilizzare con gli oggetti.

Una classe statica è uno che non può essere instansiated e non può essere estesa.

Ciò significa a static class is sealed and abstract per impostazione predefinita, si può guardare al

MSIL di un compilatore classe statica mette sigillati e astratto di fronte a una classe statica.

Quindi, perché una classe statica non può essere istanziato, non si può avere metodi di istanza definite

sulle classi statiche, in modo che tutti i metodi devono essere statico e pubblico naturalmente, come si vorrebbe

usali.

A static class is singleton by default. 

classi statici vengono utilizzati per definire i metodi di estensione, perché non si vuole

instansiate loro.

Le classi statiche sono come provider globali di servizi unici.

spero che senso per te e vi aiuterà a capire le classi statiche.

0

Potrebbe essere utile pensare di "statico" e "istanza" in termini di indirizzamento della memoria.

Un oggetto che è statico esiste in una ed una sola locazione di memoria; non è possibile crearne delle istanze perché per definizione è stato affermato che sarà trovato in una particolare posizione.È "statico" e immutabile. La creazione dell'oggetto è implicita piuttosto che esplicita.

var result = Math.Pow(3, 3); // static - Math class can't be instanced 

Un oggetto non statico può essere istanziato una o più volte; stai dicendo "Crea per me un oggetto di questo tipo" e l'oggetto riceve un indirizzo di memoria. È possibile creare più istanze che esistono tutte in diversi indirizzi di memoria. La creazione dell'oggetto è esplicita utilizzando la parola chiave new.

Qui è dove le persone si mettono nei guai nella programmazione Web ASP .NET; le classi statiche vengono create una volta per dominio applicazione e i relativi costruttori vengono quindi richiamati una sola volta.

Problemi correlati