2009-08-14 26 views
8

的語法可能錯C#什麼是靜態類和非靜態之間的不同(我說的是類本身不是字段)

public static class Storage 
     { 
       public static string filePath { get; set; } 
     } 

而且

public class Storage 
    { 
     private void Storage() {}; 
     public static string filePath { get; set; } 
    } 

我得到這個從互聯網上的一個例子。 第二個的用途是什麼?

+0

@Tuzo - 相關不重複..這個問題是一個比較 – Gishu 2009-08-14 07:07:37

+0

@OP - 我認爲你的第二個代碼片段應該是私人無效存儲(){}; ...在私人ctor – Gishu 2009-08-14 07:08:43

+0

@Gishu對不起。你是對的:)但仍然知道它,編輯它。 – 2009-08-17 08:39:13

回答

12

如果你看看IL代碼,靜態類將abstractsealed它給出了兩個重要的特質:

  • 您不能創建情況下,它
  • 它不能被繼承

第一點的後果是靜態類不能包含非靜態成員。非靜態類中可能會有很多靜態成員的用法。一個常見的用途是有一個類工廠:當你聲明一個類爲靜態

public class SomeClass 
{ 
    public int SomeInt { get; set; } 

    public static SomeClass Create(int defaultValue) 
    { 
     SomeClass result = new SomeClass(); 
     result.SomeInt = defaultValue; 
     return result; 
    } 
} 
+1

呃?你的例子不是一個靜態類? – Thorarin 2009-08-14 06:57:02

+0

雖然這不是一個靜態類嗎? – Svish 2009-08-14 06:57:34

+4

@Thorarin和@Svish:這是正確的。它正在回答靜態成員在非靜態類型中使用的最後一個問題(正如我在原始文章中解釋過去的問題) – 2009-08-14 07:06:56

3

很多類都有實例方法和靜態方法。字符串,例如有:

String.Format(string, arg0, arg1, arg2) // static method 

而且

String myString = " Hello world!"; 
myString = myString.Substring(4);  // instance method 

如果你問爲什麼這兩個類和方法需要static關鍵字它只是設計的。我明白你在問什麼,如果這個類是靜態的,那麼當然所有的方法都是靜態的,如果把它放在那裏看起來似乎是多餘的。我不知道是否有充分的理由。

2

  • 它允許有只有靜態成員
  • 不能被實例化(它沒有公共構造函數)和
  • 不能被繼承(密封)。

任何未聲明爲靜態的類都可以實例化,繼承,並且可以有非靜態成員。

5

下面是官方/ MSDN熱點,瞭解static classes

靜態類 的主要特點是:
*它們只包含靜態成員。
*它們不能實例化。
*密封。
*他們不能包含實例構造

基本上是一個靜態類是相同的,其僅具有靜態方法和私人構造函數「正常」 /非靜止類。將其標記爲靜態有助於闡明意圖,並幫助編譯器執行一些編譯時檢查以禁止某些事情,例如不允許實例化。

現實世界使用我能想到的:使用它可以容納或者作爲一種組織

  • 實用方法(methods不是一個類型的任何實例相關聯的),例如用於最小和最大方法的數學
  • 擴展方法例如StopWatch上的Reset方法的StopWatchExtensions
3

靜態類只能從C#2向上使用。在C#1中,你將不得不封閉你的類,並通過添加一個私有構造函數來獲得這種行爲來指定它不是可實例化的。

1

靜態類與非靜態類基本相同,但有一點不同:靜態類無法實例化。換句話說,您不能使用new關鍵字來創建類類型的變量。由於沒有實例變量,因此可以使用類名稱本身訪問靜態類的成員。

public static class Storage 
     { 
       public static string filePath { get; set; } 
     } 

在這裏,類不需要實例化。因此與文件路徑相同,它將爲所有對象佔用類Storage的唯一值。

public class Storage 
    { 
     private void Storage {}; 
     public static string filePath { get; set; } 
    } 
在此

,類是非靜態的,必須實例

0

正如我們所知道的變量和函數有兩種類型,實例和類的。

靜態類 - 只有類變量沒有實例變量。

因此無法實例化,只能通過Classname.method()訪問。

它只包含私有構造函數沒有公共構造函數。

靜態類只包含靜態成員。

相關問題