代码之家  ›  专栏  ›  技术社区  ›  Andrew G. Johnson

新到C并尝试使用全局变量

  •  3
  • Andrew G. Johnson  · 技术社区  · 15 年前

    是否可以在C_中使用全局变量?我主要来自一个php背景,所以变量可以在任何地方访问,或者只是一个 global 没有定义。

    我的主要问题是 User 我自己建立的课程 users 我公司数据库中的表。我正在母版页中定义它,但似乎无法从实际页面访问它(我不知道是否有更好的词来描述它们,但它们是从母版页继承样式和格式的页面)

    对我有什么一般的建议或实施实践吗?

    编辑 :下面是一些我要做的事情的代码片段:

    站点.master.cs

    public partial class SiteMaster : System.Web.UI.MasterPage
    {
        public User user = new User();
    }
    

    小精灵

    <%@ 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;
        }
    }
    
    7 回复  |  直到 15 年前
        1
  •  4
  •   Andrew Bezzub    15 年前

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

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

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

        2
  •  2
  •   bobber205    15 年前

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

    当我需要一些globals时,我就是这么做的,尽管我尽量避免使用它们。

        3
  •  2
  •   Kimi    15 年前

    如果 Page 继承自 MasterPage 然后制作 User 受保护的财产 母板页 它将对 .

        4
  •  2
  •   Tj Kellie    15 年前

    母版页类可以被使用它的页访问,方法是在.aspx页中设置母版页类,如下所示:

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

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

    我建议您将用户类添加到项目的/appcode目录下的新类文件中(user.cs)。这样你就可以从页面上访问它,而不必弄脏mastertype。

        5
  •  1
  •   Community CDub    8 年前

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

    使用“session”属性代替我在链接中显示的内容。

        6
  •  1
  •   Peter Lillevold Rene    15 年前

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

    如果是,你应该看看 strongly-typed access to masterpages . 基本上,您要做的是在母版页类中创建公共属性。然后,在页面中声明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。

        7
  •  0
  •   JB King    15 年前

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

    1. 使用 Application object -它可以用于全局存储,是asp.net的一部分。

    2. 使用 static classes -这是创建singleton的另一个选项。