轉載:C#中的全域變數及其一點延伸

來源:互聯網
上載者:User

剛學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的功能就是用來儲存全域的資料,更本不需要自己寫類。現在回想起來都覺得有點多餘,但對我理解這些東西來說還是大有協助的,希望大家也會受益。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.