【问题标题】:New to C# and trying to use a global variableC# 新手并尝试使用全局变量
【发布时间】:2010-03-11 16:15:26
【问题描述】:

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

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

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

编辑:这是我正在尝试做的一些代码 sn-ps:

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


【解决方案1】:

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

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

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

【讨论】:

  • 只是添加到@Andrew Bezzub 的答案 - 公共静态类通常用于声明全局常量,而不是保持全局状态。如果您需要全局状态,请使用单例。
【解决方案2】:

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

当我需要一些全局变量时,我会这样做,但我会尽量避免使用它们。

【讨论】:

    【解决方案3】:

    如果Page 继承自MasterPage,则将User 属性设置在MasterPage 中,它对Page 可见。

    【讨论】:

      【解决方案4】:

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

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

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

      我可能会建议您将 User 类添加到项目的 /AppCode 目录中的新类文件 (User.cs) 中。这将使您可以从您的页面访问它,而无需使用 MasterType。

      【讨论】:

      • 是的,我在 /App_Code 中有 User.cs(建议我把它放在那里,所以我想为什么不这样做)——但我需要在某处定义它(我认为在 MasterPage 中)为 @ 987654322@ 然后尝试从所有实际页面访问current_user
      【解决方案5】:

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

      使用我在链接中显示的“会话”属性。

      【讨论】:

        【解决方案6】:

        您的问题是从您的页面获取存储在母版页中的数据吗(假设我们在这里讨论的是 ASP.Net MasterPage 机制)?

        如果是这样,您应该查看strongly-typed access to masterpages。基本上,您所做的是在 MasterPage 类中创建一个公共属性。然后,在您的 Page 中声明 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 触发 before Page.Init 和 MasterPage.Load 触发 before Page.Load。您可以使用 MP.Init 或 MP.Load 来确保页面事件触发时数据准备就绪,但首选 Init。

        【讨论】:

        • Peter 我在我的问题中添加了一堆代码 sn-ps,有什么想法吗?我想你最接近知道我想做什么
        • 你在正确的轨道上。但是CodeFile="logout.aspx.cs" Inherits="logout" 看起来不适合名为_Default 的页面。剪切粘贴错误?
        【解决方案7】:

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

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

        2. 使用static classes - 这是创建单例的另一种选择。

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多