C#的新手和尝试使用全局变量
是否可以在C#中使用全局变量?我主要来自PHP背景,所以变量可以在任何地方访问,或者只需定义一个global
。C#的新手和尝试使用全局变量
我的主要问题是我有一个User
类,我建立自己的环绕在我公司的数据库上的当前users
表。我在MasterPage中定义它,但似乎无法从实际页面访问它(我不知道是否有更好的词来描述它们,但它们是从MasterPage继承样式和格式的页面)
对我来说任何一般的提示或实施做法?
编辑:这里有我想要做一些代码片段:
Site.master.cs
public partial class SiteMaster : System.Web.UI.MasterPage
{
public User user = new User();
}
logout.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="logout.aspx.cs" Inherits="logout" %>
<%@ MasterType virtualPath="~/Site.master"%>
logout.aspx.cs
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
User user = Master.user;
}
}
有一个公共静态类和声明公共静态成员变量。
这就是我当我需要一些全局变量时所做的,虽然我尽量避免使用它们。
不,这是不可能的。可以创建单例或公共静态类,但这是不好的做法。
C#是面向对象编程设计的。如果你没有用面向对象的范例编写程序,那么在开始之前可能有点难以切换到它。 OOP(http://en.wikipedia.org/wiki/Object-oriented_programming)建立在三个主要概念上:继承,多态和封装。
您可以定义分类的页面/主页面,最好在App_Code文件夹中定义它们。
只需添加到@Andrew Bezzub的答案 - 公共静态类通常用于声明全局常量,而不是保持全局状态。如果您需要全局状态,请使用单例。 – 2010-03-11 16:21:43
至少有一对夫妇不同的方式来实现你想要的:
使用Application object - 它可以用来存储全局的东西,是ASP.Net的一部分。
使用static classes - 这是创建单身人士的另一种选择。
如果Page
从MasterPage
继承,然后进行User
财产MasterPage
保护,这将是可见的Page
。
母版页类可以是通过像这样设置MasterPageClass在.aspx页面中使用它的页面访问:
<%@ MasterType TypeName="MyTypeName" VirtualPath="~/MasterPageName.master" %>
这听起来像你对我可能只是需要把你的代码一个稍微不同的地方。一个典型的User类可以通过独立的类访问您的项目,而不是绑定到主页面或主类型。
我可能会建议您将User类添加到项目的/ AppCode目录中的新类文件中,而不是(User.cs)。这将让你可以从你的页面访问它,而无需使用MasterType。
是的我在/ App_Code中有User.cs(vs建议我放在那里,所以我想为什么不这样做) - 但我需要在某处(我认为在MasterPage中)将其定义为'User current_user = new User() ;'然后尝试从所有实际页面获取'current_user' – 2010-03-11 17:12:25
您的问题是从您的页面获取到存储在主页面中的数据(假设我们正在讨论ASP.Net MasterPage机制)?
如果是这样,你应该看看strongly-typed access to masterpages。基本上,你要做的是在你的MasterPage类中创建一个公共属性。然后,在你的页面,声明的MasterPageFile和的MasterType,像这样:
public partial class MasterPage
{
public User CurrentUser{...}
}
在你的页面的aspx,申报使用母版和主类型使用。
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
然后,您将能够将您的页面类内访问属性是这样的:
var user = Master.CurrentUser;
然后,就在哪里初始化CurrentUser
对象的问题,看看the list of page lifecycle events。如您所见,MasterPage.Init在之前触发Page.Init和MasterPage.Load在 Page.Load之前触发。您可以使用MP.Init或MP.Load来确保页面事件触发时数据已准备好,但首选Init。
Peter我添加了一堆代码片段来解决我的问题,有什么想法?我认为你最接近了解我正在尝试做什么 – 2010-03-11 17:19:31
你正走在正确的轨道上。但是'CodeFile =“logout.aspx.cs”Inherits =“logout”'对于名为'_Default'的页面看起来不正确。剪切 - 粘贴错误? – 2010-03-11 17:25:39
下面可能会根据不同的建议(和警告)。如果你确实选择使用全局变量,我建议你这样做只是为了推进,但尽快重构它们。 – 2010-03-11 16:21:01
不要认为你的问题是全局变量或不是。而不是如何从你的页面实例到你的母版页中的数据。 – 2010-03-11 16:32:22
@Peter - 是的你是对的 – 2010-03-11 17:08:21