程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 初始化靜態成員時產生的盲區,初始化靜態盲區

初始化靜態成員時產生的盲區,初始化靜態盲區

編輯:C#入門知識

初始化靜態成員時產生的盲區,初始化靜態盲區


靜態成員屬於類而不是實例。靜態成員的應用范圍很廣,比如,可在應用程序的全局內獲取或設置公共的靜態成員的值,這類似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";

              }


C++靜態成員初始化問題

一定要的.系統不會自動初始化.
因為,在聲明,定義類的時候並沒有實際對象產生,而靜態成員必須存在,所以在外面初始化,告訴編譯器已經准備好了,可以產生對象了!
 

為何類的靜態成員變量要在類外初始化

1. 在類中,只是聲明了靜態變量,並沒有定義。2. 聲明只是表明了變量的數據類型和屬性,並不分配內存;定義則是需要分配內存的。注意:如果在類裡面這麼寫int a; 那麼是既聲明了變量,也定義了變量,兩者合在一起了。3. 靜態成員是“類級別”的,也就是它和類的地位等同,而普通成員是“對象(實例)級別”的。類級別的成員,先於該類任何對象的存在而存在,它被該類所有的對象共享。4. 現在,咱們假定要實例化該類的一個對象,那麼會發生什麼事情呢?靜態成員肯定要出現在這個對象裡面的,對吧?這時候才去定義那個靜態成員嗎?這顯然是不合適的。因為,比如有另外一個線程也要創建該類的對象,那麼也要按照這個方式去定義那個靜態成員。這會產生兩種可能的情況:1. 重復定義;2. 就算不產生重復定義的情況,也會產生競爭,從而造成死鎖的問題,以至於對象無法創建。很顯然,編譯器不能這麼干。那麼很合理的解決辦法,就是事先在類的外部把它定義好,然後再供所有的對象共享。注意:類的靜態常量成員可以類內初始化。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved