2010-03-15 84 views
40

Làm cách nào để đặt biến toàn cục trong ứng dụng web C#?Biến toàn cục trong C# .net

Điều tôi muốn làm là đặt biến trên trang (có thể là trang chính) và truy cập biến này từ bất kỳ trang nào.

Tôi muốn sử dụng cả bộ nhớ cache lẫn phiên.

Tôi nghĩ rằng tôi phải sử dụng global.asax. Bất kỳ giúp đỡ?

+0

Có một lý do đặc biệt bộ nhớ cache/phiên sẽ không làm việc?Về mặt kỹ thuật, ứng dụng là một đối tượng Session/Cache và vì vậy nếu bạn đang sử dụng nó (theo cách không tĩnh), bạn đã sử dụng Sessions. Nếu phần cụ thể của phiên của nó có thể được giải quyết với bộ nhớ cache cấp ứng dụng. – GrayWizardx

+0

có vì tôi cần lưu trữ một danh sách lớn và bộ nhớ cache chỉ có 16MB nên tôi không muốn lãng phí tài nguyên cahe ... – scatman

+0

Bạn có muốn một đĩa đơn không? Một đối tượng được chia sẻ bởi * tất cả * chủ đề xử lý * tất cả * yêu cầu? Hay bạn chỉ muốn một cách chia sẻ dữ liệu giữa một MasterPage và một ContentPage. Nếu đó là sau đó các biến toàn cầu chắc chắn không phải là một giải pháp tốt. – tarn

Trả lời

95

Sử dụng lớp tĩnh công khai và truy cập lớp đó từ mọi nơi.

public static class MyGlobals { 
    public const string Prefix = "ID_"; // cannot change 
    public static int Total = 5; // can change because not const 
} 

sử dụng như vậy, từ trang chủ hoặc bất cứ nơi nào:

string strStuff = MyGlobals.Prefix + "something"; 
textBox1.Text = "total of " + MyGlobals.Total.ToString(); 

Bạn không cần phải thực hiện một thể hiện của lớp; thực ra bạn không thể vì nó tĩnh. new Chỉ cần sử dụng trực tiếp. Tất cả các thành viên bên trong một lớp tĩnh cũng phải là tĩnh. Tiền tố chuỗi không được đánh dấu tĩnh vì const hoàn toàn tĩnh theo bản chất.

Lớp tĩnh có thể ở bất kỳ đâu trong dự án của bạn. Nó không phải là một phần của Global.asax hoặc bất kỳ trang cụ thể nào vì nó là "toàn cầu" (hoặc ít nhất là gần như chúng ta có thể nhận được khái niệm đó trong các thuật ngữ hướng đối tượng.)

Bạn có thể tạo ra nhiều các lớp tĩnh như bạn thích và đặt tên cho chúng bất cứ điều gì bạn muốn.


Đôi khi, người lập trình muốn nhóm các hằng số của họ bằng cách sử dụng các lớp tĩnh lồng nhau. Ví dụ,

public static class Globals { 
    public static class DbProcedures { 
     public const string Sp_Get_Addresses = "dbo.[Get_Addresses]"; 
     public const string Sp_Get_Names = "dbo.[Get_First_Names]"; 
    } 
    public static class Commands { 
     public const string Go = "go"; 
     public const string SubmitPage = "submit_now"; 
    } 
} 

và truy cập chúng như vậy:

MyDbCommand proc = new MyDbCommand(Globals.DbProcedures.Sp_Get_Addresses); 
proc.Execute(); 
//or 
string strCommand = Globals.Commands.Go; 
+2

+1 cho một giải pháp thanh lịch, hay, tôi thích nó. – SoftwareGeek

4

Tôi trả lời thứ hai jdk của: bất kỳ thành viên public static của bất kỳ lớp ứng dụng của bạn có thể được coi như là một "biến toàn cầu".

Tuy nhiên, lưu ý rằng đây là một ứng dụng ASP.NET, và như vậy, đó là một ngữ cảnh đa luồng đa luồng cho các biến toàn cầu của bạn. Vì vậy, bạn nên sử dụng một số cơ chế khóa khi bạn cập nhật và/hoặc đọc dữ liệu đến/từ các biến này. Nếu không, bạn có thể nhận dữ liệu của mình ở trạng thái bị hỏng.

+0

đây có phải là hạn chế duy nhất cho các biến toàn cầu không? hoặc cho bộ nhớ cache cũng? – scatman

+0

AFAIK, các phương thức công cộng của đối tượng Cache đi kèm với một ứng dụng ASP.NET là luồng an toàn. Nhưng hãy xem tài liệu ... –

3

Bạn có thể tạo một lớp cơ sở trong ứng dụng của bạn được thừa kế từ System.Web.UI.Page. Cho phép tất cả các trang của bạn kế thừa từ lớp cơ sở mới được tạo. Thêm một thuộc tính hoặc một biến vào lớp cơ sở của bạn với công cụ sửa đổi truy cập được bảo vệ, để nó sẽ được truy cập từ tất cả các trang của bạn trong ứng dụng.

-3

Chỉ cần khai báo biến khi bắt đầu lớp học.

ví dụ: cho chuỗi biến:

public partial class Login : System.Web.UI.Page 
{ 
    public string sError; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Page Load Code 
    } 
0
/// <summary> 
/// Contains global variables for project. 
/// </summary> 
public static class GlobalVar 
{ 
/// <summary> 
/// Global variable that is constant. 
/// </summary> 
public const string GlobalString = "Important Text"; 

/// <summary> 
/// Static value protected by access routine. 
/// </summary> 
static int _globalValue; 

/// <summary> 
/// Access routine for global variable. 
/// </summary> 
public static int GlobalValue 
{ 
get 
{ 
    return _globalValue; 
} 
set 
{ 
    _globalValue = value; 
} 
} 

/// <summary> 
/// Global static field. 
/// </summary> 
public static bool GlobalBoolean; 
} 
Các vấn đề liên quan