2012-05-29 45 views
77

我已經在C#中搜索了靜態變量,但我仍然沒有得到它的用途。另外,如果我嘗試在方法內聲明變量,它不會授予我執行此操作的權限。爲什麼?C#中靜態變量的用法是什麼?何時使用它?爲什麼我不能在方法中聲明靜態變量?

我見過一些關於靜態變量的例子。我已經看到,我們不需要創建類的實例來訪問變量,但這不足以理解它的用途以及何時使用它。

第二件事時,只需要一個變量的副本

class Book 
{ 
    public static int myInt = 0; 
} 

public class Exercise 
{ 
    static void Main() 
    { 
     Book book = new Book(); 

     Console.WriteLine(book.myInt); // Shows error why does it show me error? 
             // Can't I access the static variable 
             // by making the instance of a class? 

     Console.ReadKey(); 
    } 
} 
+3

可能是你的意思是「靜態字段」? – Dennis

+0

就像我們在類中聲明的那樣static int i = 5 –

+3

VB.NET支持本地靜態變量。他們必須實現它才能與vb保持兼容。它產生的代碼量是巨大的*,本地靜態是困難的,因爲它們不是線程安全的。字段也不是線程安全的,但每個人都期望這一點。 –

回答

128

A static變量在類的所有實例中共享它的值。

例不聲明爲靜態:

public class Variable 
{ 
    public int i = 5; 
    public void test() 
    { 
     i = i + 5; 
     Console.WriteLine(i); 
    } 
} 


public class Exercise 
{ 
    static void Main() 
    { 
     Variable var = new Variable(); 
     var.test(); 
     Variable var1 = new Variable(); 
     var1.test(); 
     Console.ReadKey(); 
    } 
} 

解釋:如果你看一下上面的例子,我剛剛宣佈int變量。當我運行此代碼時,輸​​出將是1010。這很簡單。

現在讓我們看看這裏的靜態變量;我宣佈變量爲static

實施例與靜態變量:

public class Variable 
{ 
    public static int i = 5; 
    public void test() 
    { 
     i = i + 5; 
     Console.WriteLine(i); 
    } 
} 


public class Exercise 
{ 
    static void Main() 
    { 
     Variable var = new Variable(); 
     var.test(); 
     Variable var1 = new Variable(); 
     var1.test(); 
     Console.ReadKey(); 
    } 
} 

現在,當我運行上面的代碼,輸出將是1015。所以靜態變量值在該類的所有實例中共享。

+0

,我已經在我的答案中提到....... –

+7

@Pranay:是多數民衆贊成在更好,但如果你告訴我的例子,我表現出超過它,以及對我和其他人更好....無論如何努力.. .. –

+1

它對於類是靜態的,即它的值仍然忠實於類,其值存儲在其中...等待它... class – chwi

12

靜態變量使用。因此,如果你聲明的方法中的變量有沒有用這樣的變量,它已經成爲當地唯一的功能..靜態的

例子是

class myclass 
{ 
    public static int a = 0; 
} 

變量聲明爲靜態的跨類的所有實例被共享。

聲明爲靜態的變量通常在類的所有實例中共享。當你創建VariableTest類的多個實例時,這個變量永久是在所有這些實例之間共享的。因此,在任何給定的時間點,永久變量中只會包含一個字符串值。

由於只有一個變量可用於所有實例,代碼this.permament將導致編譯錯誤,因爲可以回想起this.variablename引用實例變量名稱。因此,靜態變量將被直接訪問,如代碼所示。

+0

可以請你解釋一下嗎? –

+0

但如果我做一個類的實例,那麼我無法訪問靜態變量。爲什麼?我可以通過classname.variable訪問靜態變量,而不是通過創建一個類的實例......... ....... –

+0

@Kartik Patel因爲你必須使用類名訪問靜態myInt。爲什麼它是這樣的,我不知道。但是我會說它更清晰,因爲你想訪問類的靜態部分,如果你需要一個實例來訪問它,它不是靜態的。 – dowhilefor

8

靜態變量的一些「現實世界」的例子:

構建一個類,你可以爲你的應用程序達到硬編碼值。與枚舉類似,但在數據類型上具有更多的靈活性。

public static class Enemies 
{ 
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}"); 
} 

廣爲人知的單,這允許控制以有一個類中的恰好一個實例。如果你想在你的整個應用程序中訪問它,這是非常有用的,但是不要將它傳遞給每個類,以便讓這個類使用它。

public sealed class TextureManager 
    { 
     private TextureManager() {} 
     public string LoadTexture(string aPath); 

     private static TextureManager sInstance = new TextureManager(); 

     public static TextureManager Instance 
     { 
      get { return sInstance; } 
     } 
    } 

,這是你將如何調用texturemanager

TextureManager.Instance.LoadTexture("myImage.png"); 

關於你的最後一個問題: 你是指的編譯器錯誤CS0176。我試圖找到更多的Infor公司,但只能找到在MSDN不得不說一下吧:

靜態方法,字段,屬性或事件是一類可贖回即使 在沒有實例類已創建。如果創建該類的任何實例爲 ,則不能用它們訪問靜態的 成員。只有一個靜態字段和事件副本存在,而靜態方法和屬性只能訪問靜態字段和靜態的事件。

26

C#並非靜態的變量。您可以通過C#在特定類型定義中聲明靜態字段。靜態字段是一個狀態,與特定類型的所有實例共享。因此,靜態字段的範圍是整個類型。這就是爲什麼你不能在方法中聲明靜態字段 - 方法本身是一個作用域,並且方法中聲明的項必須在方法的邊界上不可訪問。

+1

很好的解釋。 – User

+0

感謝您的回答。 –

+2

那麼,在文檔中它被聲明爲「使用靜態修飾符聲明的域被稱爲靜態變量」。 https://msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx但你說得對其餘的解釋。 –

1

操作類型爲 的實例的數據成員和函數成員被稱爲實例成員。 int的ToString方法(例如)是實例成員的示例。默認情況下,成員是實例成員。 不對類型實例進行操作,而是對類型本身進行操作的數據成員和函數成員必須標記爲靜態。 Test.Main和Console.WriteLine方法是靜態方法。 Console類實際上是一個靜態類,這意味着它的所有成員都是靜態的。您從來沒有真正創建控制檯實例 - 一個控制檯在整個應用程序中共享。

-1

嘗試直接與類名調用它Book.myInt

1

靜態類不要求你創建一個類的對象/實例化它們,你可以前綴C#關鍵字在類名的前面靜電,使它是靜態的。

記住:我們沒有實例化Console類,String類,Array類。

class Book 
{ 
    public static int myInt = 0; 
} 

public class Exercise 
{ 
    static void Main() 
    { 
     Book book = new Book(); 
     //Use the class name directly to call the property myInt, 
     //don't use the object to access the value of property myInt 

     Console.WriteLine(Book.myInt); 

     Console.ReadKey(); 

    } 
} 
-1

靜態變量保持它之前的值,直到程序退出。通過直接調用class_Name.Method()或class_Name.Property來使用靜態。不需要對象引用。最流行使用靜態的是C#的數學課。 Math.Sin(),Math.Cos(),Math.Sqrt()。

0

迴應「何時使用它?」問題:

我經常使用一個靜態(類),變量爲一個唯一的實例ID分配到一個類的每個實例。我使用相同的代碼在每一個類,它是非常簡單的:

//Instance ID ---------------------------------------- 
    // Class variable holding the last assigned IID 
    private static int xID = 0; 
    // Lock to make threadsafe (can omit if single-threaded) 
    private static object xIDLock = new object(); 
    // Private class method to return the next unique IID 
    // - accessible only to instances of the class 
    private static int NextIID()      
    { 
     lock (xIDLock) { return ++xID; } 
    } 
    // Public class method to report the last IID used 
    // (i.e. the number of instances created) 
    public static int LastIID() { return xID; } 
    // Instance readonly property containing the unique instance ID 
    public readonly int IID = NextIID(); 
//----------------------------------------------------- 

這說明了幾個有關靜態變量和方法要點:與類相關

  1. 靜態變量和方法,不該類的任何特定實例。
  2. 靜態方法可以在實例的構造函數中調用 - 在這種情況下,靜態方法NextIID用於初始化只讀屬性IID,它是此實例的唯一ID。

我覺得這很有用,因爲我開發的應用程序中使用了對象羣,並且能夠跟蹤已創建的數量以及跟蹤/查詢單個實例是很好的選擇。

我還使用類變量來跟蹤可以實時報告的實例的屬性總和和平均值。我認爲這個班級是保存有關班級所有實例的摘要信息的好地方。

相關問題