2011-03-09 196 views
33

我有兩個類A級和ClassB:非靜態類中的靜態方法和靜態類中的靜態方法有什麼區別?

static class ClassA 
    { 
     static string SomeMethod() 
     { 
      return "I am a Static Method"; 
     } 
    } 

    class ClassB 
    { 
     static string SomeMethod() 
     { 
      return "I am a Static Method"; 
     } 
    } 

我想知道的是什麼ClassA.SomeMethod();ClassB.SomeMethod();

當他們都可以訪問的區別,而無需創建類的實例,爲什麼我們需要創建一個靜態類,而不是僅使用非靜態類並將這些方法聲明爲靜態?

回答

32

唯一不同的是,在非靜態類靜態方法不能extension methods


換句話說,這是無效的:

class Test 
{ 
    static void getCount(this ICollection<int> collection) 
    { return collection.Count; } 
} 

而這是有效的:

static class Test 
{ 
    static void getCount(this ICollection<int> collection) 
    { return collection.Count; } 
} 
13

靜態類只能包含靜態成員。

靜態方法可確保即使創建多個classB對象,它們也只會使用一個共享的SomeMethod函數。

從技術上講,沒有什麼區別,除了ClassA的SomeMethod 必須是是靜態的。

0

靜態方法屬於類和非靜態方法屬於一個類的一個對象。也就是說,一個非靜態方法只能在它所屬類的一個對象上被調用。靜態方法只能訪問靜態成員。一個非靜態方法可以訪問靜態和非靜態成員,因爲在調用靜態方法時,類可能不會被實例化(如果它是在類本身上調用的話)。在另一種情況下,只有在類已經實例化時才能調用非靜態方法。靜態方法由類的所有實例共享。無論何時在C++/Java/C#中調用某個方法時,都會傳遞一個隱式參數(「this」引用),而不傳遞其他參數。在靜態方法調用的情況下,'this'引用不會被傳遞,因爲靜態方法屬於一個類,因此沒有'this'引用。

+0

我們如何從類的對象中調用靜態方法,請給我一個例子 – Vamsi 2011-03-09 13:37:35

+0

「然而,靜態方法可以在類和類的對象上調用。「我相信這種說法是錯誤的。 – Mahesh 2011-03-26 02:00:50

2

如果您有一個僅包含靜態方法的非靜態類,您可以創建該類的一個實例。但是你不能有意義地使用那個實例。注意:當你沒有定義構造函數時,編譯器會爲你添加一個構造函數。

靜態類沒有構造函數,所以你不能創建它的一個實例。當你向它添加一個實例方法(你的意思是一個靜態方法)時編譯器會給出一個錯誤。

相關問題