2012-06-09 92 views
3

我在我的應用程序中使用ASP.NET Web窗體和C#。我有一個名爲Global.cs的類文件,其中我使用setget屬性定義變量。通過實例化該類對象,我可以在任何頁面的任何地方使用這些變量。在ASP.NET中使用C#全局變量的正確方法?

這裏是我的Global.cs文件:

using System; 
using System.Data; 
using System.Linq; 
using System.Web; 

/// <summary> 
/// Contains my site's global variables. 
/// </summary> 
public static class Global 
{ 
    /// <summary> 
    /// Global variable storing important stuff. 
    /// </summary> 
    public static string gDate; 
    public static string gMobLength; 
    public static string gDateFormat; 
    public static string gApplicationNo; 
    public static string gBranchNo; 
    public static string gMemId; 
    public static string gIsEditable="false"; 
    public static string gLoggedInUserName; 


    public static string ImportantData 
    { 
     get 
     { 
      return gDate; 

     } 
     set 
     { 
      gDate = value; 

     } 

    } 
    public static string MobileLength 
    { 
     get 
     { 
      return gMobLength; 
     } 
     set 
     { 
      gMobLength = value; 
     } 
    } 

    public static string DateFormat 
    { 
     get 
     { 
      return gDateFormat; 
     } 
     set 
     { 
      gDateFormat = value; 
     } 
    } 
    public static string ApplicationNo 
    { 
     get 
     { 
      return gApplicationNo; 
     } 
     set 
     { 
      gApplicationNo = value; 
     } 
    } 
    public static string BranchNo 
    { 
     get 
     { 
      return gBranchNo; 
     } 
     set 
     { 
      gBranchNo = value; 
     } 
    } 

} 

這是使用整個項目變量的正確方法?這種方法有什麼優點和缺點,你們會採用什麼方法來使用全局變量?

回答

4

首先,我建議使用自動實現的屬性。

public static string BranchNo { get; set; } 

簡化你的代碼。至於這是否是一個好方法,這取決於。有時候,簡單而直接的做法會更好,這就屬於這一類。如果值應該不會改變,一旦被初始化,您可能需要使用合適的單與初始化:

public class Settings 
{ 
    private static Settings _current; 
    private static readonly object _lock = new object(); 

    public static Settings Current 
    { 
     get 
     { 
     lock(_lock) 
     { 
      if (_current == null) throw new InvalidOperationException("Settings uninitialized"); 
      return _current; 
     } 
     } 
     set 
     { 
      if (value == null) throw new ArgumentNullException(); 
      if (_current != null) throw new InvalidOperationException("Current settings can only be set once."); 

      if (_current == null) 
      { 
       lock(_lock) 
       { 
       if (_current == null) _current = value; 
       } 
      } 
     } 
    } 


    public string ImportantData { get; private set; } 

    // etc. 
} 

初始化設置:

Settings.Current = new Settings{ ImportantData = "blah blah blah"}; 

訪問:

var data = Settings.Current.ImportantData; 
+1

雖然此線程安全嗎? – McGarnagle

+0

@HackedByChinese感謝您的建議,我的方法和您建議的簡化代碼的方法有什麼區別。謝謝。 – freebird

+0

自動實現的屬性自動生成後臺字段,因此您不必將它們包含在源代碼中。 – HackedByChinese

2

以外的bromides「全局變差」和「properties變好」......您的方法沒有任何內在錯誤。去吧!

恕我直言.. PSM

+0

好的感謝您的意見,我可以問什麼是恕我直言,PSM,可能聽起來很愚蠢。謝謝。 – freebird

+0

「PSM」是我的名字:)。 「恕我直言」的意思是「在我的拙見」。我真的沒有注意到你已經在使用屬性了:我以爲你只是有一堆公共靜態變量。其中,恕我直言,可以完全確定。 – paulsm4

+0

:)非常感謝,有新的東西學習。謝謝。 – freebird

1

你之所以在實例化該類對象之後沒有看到該變量是因爲變量聲明爲靜態。靜態變量是由該莊園使用ClassName.variableName或ClassName.PropertyName