2011-10-28 68 views
17

可能重複:
When to Use Static Classes in C#C#靜態類爲什麼使用?

設置我的類作爲靜態的很多,但我不知道什麼時候使用靜態或沒有,或什麼是它使得使用它的差異或不。

請問有人能解釋一下嗎?

+1

靜態類/方法,例如有用的實現單例模式和工廠模式... – Yahia

+2

@Yahia:與靜態類的單例模式? [我不這麼認爲](http://stackoverflow.com/questions/3565482/can-singleton-class-be-static/3565496#3565496) – BoltClock

+0

@BoltClock如果你仔細閱讀,然後我寫了「靜態類/方法「,我非常確定靜態方法在實現Singleton模式時是有用的...... – Yahia

回答

26

使一個類靜態只是防止人們嘗試創建它的一個實例。如果你所有的類都是靜態成員,那麼讓這個類本身是靜態的是一個好習慣。

+5

如果我們將所有成員都設置爲靜態,那麼爲什麼將該類設置爲靜態是一種很好的做法?將類本身設爲靜態會有什麼好處? –

+2

它會阻止人們嘗試實例化它 –

+5

但是,爲了這個目的,你可以聲明一個私有的構造函數並使類Singleton成爲可能。據我所知,一個靜態類將始終保留在內存中創建一個開銷,但正常的單身類不會。 –

11

如果一個類被聲明爲靜態的,那麼變量和方法應強制聲明爲靜態的。

一個類可以被聲明爲靜態的,表明它只包含靜態成員。使用new關鍵字創建靜態類的實例是不可能的。當包含該類的程序或名稱空間被加載時,靜態類將由.NET Framework公共語言運行庫(CLR)自動加載。

使用靜態類來包含與特定對象無關的方法。例如,創建一組方法不會影響實例數據,並且不會與代碼中的特定對象關聯,這是一個常見要求。你可以使用靜態類來保存這些方法。

- >靜態類的主要特點是:

  • 它們只包含靜態成員。
  • 它們不能被實例化。
  • 它們是密封的。
  • 它們不能包含實例構造函數或簡單的構造函數,因爲我們知道它們與對象關聯,並在創建對象時對數據進行操作。

static class CollegeRegistration 
{ 
    //All static member variables 
    static int nCollegeId; //College Id will be same for all the students studying 
    static string sCollegeName; //Name will be same 
    static string sColegeAddress; //Address of the college will also same 

    //Member functions 
    public static int GetCollegeId() 
    { 
    nCollegeId = 100; 
    return (nCollegeID); 
    } 
    //similarly implementation of others also. 
} //class end 


public class student 
{ 
    int nRollNo; 
    string sName; 

    public GetRollNo() 
    { 
     nRollNo += 1; 
     return (nRollNo); 
    } 
    //similarly .... 
    public static void Main() 
    { 
    //Not required. 
    //CollegeRegistration objCollReg= new CollegeRegistration(); 

    //<ClassName>.<MethodName> 
    int cid= CollegeRegistration.GetCollegeId(); 
    string sname= CollegeRegistration.GetCollegeName(); 


    } //Main end 
} 
+0

強制強制強迫強制強制 –

3

靜態類可以是在某些情況下是有用的,但有濫用和/或過度使用它們,就像大多數語言特性的電位。

正如Dylan Smith已經提到的那樣,使用靜態類的最明顯的例子是如果你只有一個只有靜態方法的類。讓開發人員實例化這樣的類是沒有意義的。

需要注意的是,過多的靜態方法本身可能表明您的設計策略存在缺陷。我發現當你創建一個靜態函數時,你可以問自己一個問題 - 它是否更適合作爲a)實例方法,或者b)接口的擴展方法。這裏的想法是對象行爲通常與對象狀態相關聯,這意味着行爲應該屬於對象。通過使用靜態函數,您意味着行爲不應該屬於任何特定的對象。

過度使用靜態函數會阻礙多態和接口驅動設計 - 它們不能在派生類中被重寫,也不能被附加到接口。通常通過擴展方法將「輔助」函數綁定到接口上,這樣接口的所有實例都可以訪問共享的「輔助」功能。

在我看來,靜態函數絕對有用的一種情況是創建一個.Create()或.New()方法來實現對象創建的邏輯,例如當您要代理正在創建的對象時,

public class Foo 
{ 
    public static Foo New(string fooString) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 

     return (Foo)generator.CreateClassProxy 
      (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    } 

這可以用在要攔截/注入功能集成到一個對象的基礎上,也就是說,分配給其的方法的某些屬性的代理框架(如城堡動態代理)來使用。總的想法是,您需要一個特殊的構造函數,因爲從技術上講,您正在創建具有特殊添加功能的原始實例的副本。