靜態成員屬於類而不是實例。靜態成員的應用范圍很廣,比如,可在應用程序的全局內獲取或設置公共的靜態成員的值,這類似C++的全局變量,但是使用不當也會有麻煩。
class Test
{
private static string strStaticName = "Hello";
//無參構造器
public Test()
{
}
//有參構造器
public Test(string strName)
{
strStaticName = strName;
}
public string GetName()
{
return strStaticName;
}
}
static void Main(string[] args)
{
Console.WriteLine("創建t1實例時,名稱設置為東方");
//創建實例t1
Test t1 = new Test("東方");
Console.WriteLine("所以使用GetName方法獲取的名稱為:{0}",t1.GetName());
Console.WriteLine("");
//創建實例t2
Console.WriteLine("創建t2實例時,名稱未設置");
Test t2 = new Test();
string strName = t2.GetName();
Console.WriteLine("但通過GetName方法獲取的名稱卻為:{0}",strName);
Console.Read();
}
調試後:
分析:在一個應用程序中,無論創建了一個類的多少實例,該類的靜態字段都只被初始化一次。
解決:1)取消靜態關鍵字static
2)都使用有參的構造器
3)在無參構造器中,給靜態字段賦值
public Test()
{
strStaticName="Hello";
}
一定要的.系統不會自動初始化.
因為,在聲明,定義類的時候並沒有實際對象產生,而靜態成員必須存在,所以在外面初始化,告訴編譯器已經准備好了,可以產生對象了!
1. 在類中,只是聲明了靜態變量,並沒有定義。2. 聲明只是表明了變量的數據類型和屬性,並不分配內存;定義則是需要分配內存的。注意:如果在類裡面這麼寫int a; 那麼是既聲明了變量,也定義了變量,兩者合在一起了。3. 靜態成員是“類級別”的,也就是它和類的地位等同,而普通成員是“對象(實例)級別”的。類級別的成員,先於該類任何對象的存在而存在,它被該類所有的對象共享。4. 現在,咱們假定要實例化該類的一個對象,那麼會發生什麼事情呢?靜態成員肯定要出現在這個對象裡面的,對吧?這時候才去定義那個靜態成員嗎?這顯然是不合適的。因為,比如有另外一個線程也要創建該類的對象,那麼也要按照這個方式去定義那個靜態成員。這會產生兩種可能的情況:1. 重復定義;2. 就算不產生重復定義的情況,也會產生競爭,從而造成死鎖的問題,以至於對象無法創建。很顯然,編譯器不能這麼干。那麼很合理的解決辦法,就是事先在類的外部把它定義好,然後再供所有的對象共享。注意:類的靜態常量成員可以類內初始化。