提问人:Andrew G. Johnson 提问时间:3/12/2010 最后编辑:Andrew G. Johnson 更新时间:3/12/2010 访问量:2533
不熟悉 C# 并尝试使用全局变量
New to C# and trying to use a global variable
问:
是否可以在 C# 中使用全局变量?我主要来自PHP背景,因此变量要么可以在任何地方访问,要么只是一个定义。global
我的主要问题是我有一个我自己构建的类,用于包装我公司数据库上的当前表。我在 MasterPage 中定义它,但似乎无法从实际页面访问它(我不知道是否有更好的词来描述它们,但它们是从 MasterPage 继承样式和格式的页面)User
users
对我有什么一般的提示或实施实践吗?
编辑:这是我尝试执行的一些代码片段:
Site.master.cs
public partial class SiteMaster : System.Web.UI.MasterPage
{
public User user = new User();
}
注销.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="logout.aspx.cs" Inherits="logout" %>
<%@ MasterType virtualPath="~/Site.master"%>
注销.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 文件夹中定义它们。
评论
至少有几种不同的方法可以实现您想要的目标:
使用 Application 对象 - 它可用于全局存储内容,并且是 ASP.Net 的一部分。
使用静态类 - 这是创建单例的另一个选项。
如果继承自 ,则使属性受保护,并且该属性将对 可见。Page
MasterPage
User
MasterPage
Page
请看我对这个问题的回答。一旦将响应发送到浏览器,非静态类级变量就不会保留。这是因为每个 Page 对象都将是该类的新实例,而不是上次请求中的同一个实例。
请改用“Session”属性,如我在链接中所示。
通过在 .aspx 页中设置 MasterPageClass,可以使用母版页类访问母版页类,如下所示:
<%@ MasterType TypeName="MyTypeName" VirtualPath="~/MasterPageName.master" %>
在我看来,您可能只需要将代码放在稍微不同的地方。典型的 User 类可通过独立类访问项目,而不是捆绑到母版页或母版类型中。
我可能会建议您将 User 类添加到项目的 /AppCode 目录中的新类文件中,改为为 (User.cs)。这样一来,你就可以从你的页面访问它,而不必使用MasterType。
评论
User current_user = new User();
current_user
您的问题是否从您的页面获取存储在母版页中的数据(假设我们在这里谈论的是 ASP.Net MasterPage 机制)?
如果是这样,您应该查看对母版页的强类型访问。基本上,您要做的是在 MasterPage 类中创建一个公共属性。然后,在 Page 中声明 MasterPageFile 和 MasterType,如下所示:
public partial class MasterPage
{
public User CurrentUser{...}
}
在页面 aspx 中,声明使用母版页以及要使用的母版类型。
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
然后,您将能够从页面类中访问该属性,如下所示:
var user = Master.CurrentUser;
然后,对于在何处初始化对象的问题,请查看页面生命周期事件列表。如您所见,MasterPage.Init 在 Page.Init 之前触发,MasterPage.Load 在 Page.Load 之前触发。您可以使用任一 MP。Init 或 MP。加载以确保数据已准备好在页面事件触发时使用,但首选 Init。CurrentUser
评论
CodeFile="logout.aspx.cs" Inherits="logout"
_Default
上一个:在PHP中无法理解SOAP
评论