不熟悉 C# 并尝试使用全局变量

New to C# and trying to use a global variable

提问人:Andrew G. Johnson 提问时间:3/12/2010 最后编辑:Andrew G. Johnson 更新时间:3/12/2010 访问量:2533

问:

是否可以在 C# 中使用全局变量?我主要来自PHP背景,因此变量要么可以在任何地方访问,要么只是一个定义。global

我的主要问题是我有一个我自己构建的类,用于包装我公司数据库上的当前表。我在 MasterPage 中定义它,但似乎无法从实际页面访问它(我不知道是否有更好的词来描述它们,但它们是从 MasterPage 继承样式和格式的页面)Userusers

对我有什么一般的提示或实施实践吗?

编辑:这是我尝试执行的一些代码片段:

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# asp.net

评论

1赞 Paul Sasik 3/12/2010
根据下面的不同建议(和警告)是可能的。如果您确实选择使用全局变量,我建议这样做只是为了向前迈进,但要尽快重构它们。
0赞 Peter Lillevold 3/12/2010
不要认为你的问题是不是全局变量。而是如何从页面实例获取母版页中的数据。

答:

2赞 bobber205 3/12/2010 #1

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

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

4赞 Andrew Bezzub 3/12/2010 #2

不,这是不可能的。可以创建单例或公共静态类,但这是不好的做法。

C# 是为面向对象编程而设计的。如果你以前没有使用面向对象范式编写过程序,那么一开始切换到它可能会有点困难。OOP (http://en.wikipedia.org/wiki/Object-oriented_programming) 建立在三个主要概念之上:继承、多态和封装。

您可以对页面/母版页进行分类定义,最好在 App_Code 文件夹中定义它们。

评论

1赞 Franci Penov 3/12/2010
只是为了补充@Andrew Bezzub 的答案 - 公共静态类通常用于声明全局常量,而不是保持全局状态。如果需要全局状态,请使用单例。
0赞 JB King 3/12/2010 #3

至少有几种不同的方法可以实现您想要的目标:

  1. 使用 Application 对象 - 它可用于全局存储内容,并且是 ASP.Net 的一部分。

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

2赞 Kimi 3/12/2010 #4

如果继承自 ,则使属性受保护,并且该属性将对 可见。PageMasterPageUserMasterPagePage

1赞 Mike Marshall 3/12/2010 #5

请看我对这个问题的回答。一旦将响应发送到浏览器,非静态类级变量就不会保留。这是因为每个 Page 对象都将是该类的新实例,而不是上次请求中的同一个实例。

请改用“Session”属性,如我在链接中所示。

2赞 Tj Kellie 3/12/2010 #6

通过在 .aspx 页中设置 MasterPageClass,可以使用母版页类访问母版页类,如下所示:

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

在我看来,您可能只需要将代码放在稍微不同的地方。典型的 User 类可通过独立类访问项目,而不是捆绑到母版页或母版类型中。

我可能会建议您将 User 类添加到项目的 /AppCode 目录中的新类文件中,改为为 (User.cs)。这样一来,你就可以从你的页面访问它,而不必使用MasterType。

评论

0赞 Andrew G. Johnson 3/12/2010
是的,我在 /App_Code 中有 User.cs(vs 建议我把它放在那里,所以我想为什么不呢)——但我需要在某个地方(我在 MasterPage 中思考)将其定义为,然后尝试从所有实际页面中获取User current_user = new User();current_user
1赞 Peter Lillevold 3/12/2010 #7

您的问题是否从您的页面获取存储在母版页中的数据(假设我们在这里谈论的是 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

评论

0赞 Andrew G. Johnson 3/12/2010
彼得,我在我的问题中添加了一堆代码片段,有什么想法吗?我想你最接近知道我想做什么
0赞 Peter Lillevold 3/12/2010
你走在正确的轨道上。但对于名为 .剪切粘贴错误?CodeFile="logout.aspx.cs" Inherits="logout"_Default