剛學JAVA和C#時,對於用慣了C++中的全域變數的我來說,很是不習慣:所有的東西都在類裡面,沒有可以現成的存放全域變數的地方。但有位大蝦教我說可以通過定義類實現全域變數的功能,我嘗試了,記錄下我的學習心得。
public class GlobalVariable
{
//******************************************************************
//*Hashtable用於存放全域變數,由key和value成對實現。
//******************************************************************
private static Hashtable table = new Hashtable();
//******************************************************************
//*由於是私人建構函式,不能由new產生執行個體,所以只有一個執行個體,
//*保證了該類在程式中是唯一的。
//******************************************************************
private GlobalVariable()
{
}
public static object GetValue(object akey)
{
return table[akey];
}
public static void SetValue(object akey,object avalue)
{
table[akey] = avalue;
}
public static void Remove(object akey)
{
table.Remove(akey);
}
}
在該類中,我們通過SetValue來把需要存放的全域變數通過key來存入Hashtable中。當需要讀取全域變數的時候,可以通過GetValue來讀出。當然,我們也可以通過Remove來刪除一個變數。
需要注意的是,這個類通過GetValue取出的值要做轉型的工作。必須要非常小心,否則會出現Exception,所以最好在調用此處的時候,把它放在try塊中。
關於變數全域化的一點點延伸:
通過這種類,我們可以在C#的Windows編程中,非常容易的實現多視窗的變換顯示。下面構造的類就能實現此功能:
public class FormManager
{
private FormManager()
{
//
// TODO: 在此處添加建構函式邏輯
//
}
private static Form forMain = null;
private static Form frmLogon = null;
public static Form FrmMain{
get{ return frmMain;}
}
/**//// <summary>
/// 顯示首頁面
/// </summary>
/// <returns></returns>
public static Form ShowMain(){
if (frmMain == null || frmMain.IsDisposed)
frmMain = new FrmMain();
frmMain.Show();
return frmMain;
}
/**//// <summary>
/// 顯示登入頁面
/// </summary>
/// <param name="isMode">如為true,則表單顯示為強制回應對話方塊</param>
/// <returns></returns>
public static Form ShowLogon(bool isMode){
if (frmLogon == null || frmLogon.IsDisposed)
frmLogon = new FrmLogon();
frmLogon.StartPosition = FormStartPosition.CenterScreen;
if (isMode)
frmLogon.ShowDialog();
else
frmLogon.Show();
return frmLogon;
}
/**//// <summary>
/// 程式啟動入口
/// </summary>
public static void Main(){
Application.Run(ShowLogon());
}
}
在C#中,處處是類,要實現如C語言或C++中的全域變數和全域函數的話,需要構造靜態類。該靜態類中,最明顯的特徵是:建構函式是私人的,而其他所有的函數都是靜態。
下面的靜態類就可以作為全域變數用:
該程式實現了頁面的靜態調用。在C#的Windows Forms編程中,程式的入口要從Application.Run()開始。因此,在該程式中,開始顯示頁面為登入頁面。
當然,還有一種最簡單的只存放常量的類,姑且稱為常量類。構造如下:
public class Constants
{
private Constants()
{
}
public const double PI = 3.14159265;
public const string DATABASE_SCHEMA = "MANULI.";
public const string APP_DATABASE_CONNECT_STR = "ConnectionString";
public const string DATE_FORMAT_SHORT = "yyyy-MM-dd";
}
通過這樣的定義,我們在程式中可以不用構造執行個體變數,直接通過Constants.PI這樣的格式調用。
NOTE:
那時我剛學C#WinForm編程,後來學了Web編程,知道還有Session,Application的功能就是用來儲存全域的資料,更本不需要自己寫類。現在回想起來都覺得有點多餘,但對我理解這些東西來說還是大有協助的,希望大家也會受益。