新手学习C#,尝试使用全局变量

3
在C#中使用全局变量是否可行?我主要是从PHP背景下来的,所以变量要么是无处不在,要么只需要一个global定义就可以了。
我的主要问题是我有一个User类,它是我自己创建的,用于包装公司数据库中的当前用户表。我在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;
    }
}

1
可以按照下面不同的建议(和警告)来实现。如果你选择使用全局变量,我建议尽快将它们重构出去,只是为了推动进展而使用它们。 - Paul Sasik
不要认为你的问题是全局变量与否,而是如何从页面实例中访问主页面中的数据。 - Peter Lillevold
7个回答

4
不,这是不可能的。可以创建单例或公共静态类,但这是不好的实践。
C# 是为面向对象编程而设计的。如果您以前没有使用过面向对象范式编写程序,那么在开始时可能有点困难。面向对象编程(http://en.wikipedia.org/wiki/Object-oriented_programming)建立在三个主要概念上:继承、多态和封装。
您可以定义除了页面/主页面之外的类,将它们定义在 App_Code 文件夹中是很好的实践。

1
仅仅是为了补充@Andrew Bezzub的回答——public static类通常用来声明全局常量,而不是用来保留全局状态。如果你需要全局状态,请使用单例模式。 - Franci Penov

2

主页面类可以通过在您的 .aspx 页面中设置 MasterPageClass ,使使用它的页面可以访问它,如下所示:

<%@ MasterType TypeName="MyTypeName" VirtualPath="~/MasterPageName.master" %>

听起来,您可能只需要将代码放在稍微不同的位置。 一个典型的用户类将通过独立的类(而不是捆绑到主页或主类型中)对您的项目进行访问。

我建议您将User类添加到项目的/AppCode目录中的新类文件中(User.cs)。 这将使您能够在不必改动MasterType的情况下从页面访问它。


是的,我在 /App_Code 中有 User.cs(vs 建议我把它放在那里,所以我想为什么不呢)-- 但我需要在某个地方定义它(我认为是在 MasterPage 中)为 User current_user = new User(); 然后尝试从所有实际页面访问 current_user - Andrew G. Johnson

2

声明一个公共静态类并声明公共静态成员变量。

当我需要一些全局变量时,这就是我的做法,尽管我尽量避免使用它们。


2
如果Page继承自MasterPage,那么在MasterPage中将User属性设置为protected,就可以让Page访问到该属性。

1
你的问题是从页面中获取存储在主页中的数据(假设我们在这里谈论的是ASP.Net MasterPage机制)吗?
如果是这样,你应该查看强类型访问主页。基本上,你需要在MasterPage类中创建一个公共属性。然后,在你的页面中,声明MasterPageFile和MasterType,就像这样:
public partial class MasterPage
{
    public User CurrentUser{...}
}

在你的 aspx 页面中,声明使用母版页并指定要使用的母版类型。
<%@ Page  masterPageFile="~/MasterPage.master"%>
<%@ MasterType  virtualPath="~/MasterPage.master"%>

然后,您就可以像这样从页面类中访问该属性:

var user = Master.CurrentUser;

那么,关于在哪里初始化CurrentUser对象的问题,请查看页面生命周期事件列表。正如您所看到的,MasterPage.Init在Page.Init之前触发,而MasterPage.Load在Page.Load之前触发。您可以使用MP.Init或MP.Load确保数据已准备好以便于页面事件的触发,但建议使用Init。


彼得,我在我的问题中添加了许多代码片段,你有什么想法吗?我认为你最接近知道我想做什么。 - Andrew G. Johnson
你走在正确的轨道上。但是 CodeFile="logout.aspx.cs" Inherits="logout" 对于一个名为 _Default 的页面来说看起来不太对。是复制粘贴出错了吗? - Peter Lillevold

1

请查看我对this问题的回答。非静态类级变量在响应发送到浏览器后不会持久化。这是因为每个页面对象都将是该类的新实例,而不是您上次请求的相同实例。

请改用我在链接中展示的“Session”属性。


0

有至少两种不同的方法可以实现你想要的:

  1. 使用应用程序对象 - 它可以用于全局存储,是ASP.Net的一部分。

  2. 使用静态类 - 这是创建单例的另一种选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接