【问题标题】:Creating global variables in asp.net using C#使用 C# 在 asp.net 中创建全局变量
【发布时间】:2009-11-25 14:40:14
【问题描述】:

我以前在窗口应用程序上工作,我曾经在 vb.net 中使用模块创建全局变量,但我发现在 C# 中没有模块的概念。那么如何在 C# 中创建全局变量

【问题讨论】:

  • 基本上我有一些类,如数据层、业务层,我在 Windows 应用程序中使用。现在我想使用这些类。在 vb.net 中,我创建了这些类的公共对象并在整个应用程序中使用。但我不知道如何创建全局对象。对所有这些类对象使用会话是否很好
  • @Shantanu:这些对象有什么状态?它们实际上只是单例吗?
  • 我认为将其视为两个单独的问题可能会有所帮助:1)是否将全局变量用于特定目的,以及 2)如果您确实使用它们,什么是最合适的怎么办?

标签: c# .net asp.net vb.net


【解决方案1】:

嗯,你可以在公共类中使用公共静态变量...但我真的敦促你不要这样做。

这些变量的值会改变吗?它们代表什么?不要忘记所有用户都将使用相同的变量集。

【讨论】:

  • 但如果他们将其设为公共静态,那么任何人都可以使用该变量!我想不出比这更方便的了。
  • @ChaosPandion 那么什么是更好的选择呢?
  • +1。在 Web 应用程序中,全局对象通常意味着糟糕的设计,但服务层中的某些情况除外,例如缓存。
  • @James:这取决于用例。
【解决方案2】:

您正在谈论一个 Web 应用程序,因此如果您的变量仅在一个会话中使用,我建议您使用 Session State。我会建议您使用Application State 来处理应用程序范围的变量。

【讨论】:

  • 使用 Cache 对象优于使用 Application 对象。原因是如果 ASP.Net 工作进程的内存利用率接近其极限,会释放一些 Cache 以释放内存,但 Application 不会。因此,使用 Application 对象可以导致回收工作进程,而使用 Cache 将避免这种不良行为。
【解决方案3】:

静态类的静态成员?

在 Google 上快速搜索 C# 教程产生了以下结果:

http://www.csharp-station.com/tutorial.aspx

您应该从头开始,并尝试学习 OO 编程的基础知识。

祝你好运。

【讨论】:

  • 为什么投反对票?这与我上面发布的评论相同。大声笑
【解决方案4】:

VB 模块基本上是 C# 中的公共静态类。但就像 Jon 说的那样,你真的必须想出充分的理由来使用全局变量。

【讨论】:

    【解决方案5】:

    在 ASP.Net 中,您可以使用 Cache 对象创建等效的全局变量。

    Cache["someName"] = "some value";
    

    使用缓存的一个好处是您可以将对象放入其中。

    另一个好处是您可以更改代码中的值。

    您也可以使用 Application 对象,但由于内存管理,Cache 是首选。

    与往常一样,您应该避免过度使用这些全局变量,并尽量减少它们的大小。

    【讨论】:

    • 缓存值可能会过期,留下一个 NULL 引用。
    • 如果您正确编写代码,您可以检查 NULL 并根据需要重新创建缓存值。如果值永远不会改变,它可以是 web.config 中的一个 appSetting。
    【解决方案6】:

    全局变量?拒绝吧。应不惜一切代价避免使用全局变量。如果是配置数据,请使用应用程序配置的东西。

    【讨论】:

      【解决方案7】:

      或者根据您的需要使用应用程序、会话或视图状态对象。但正如“Jon Skeet”所说,应该避免使用全局变量。但如果你坚持看看这个链接:Microsoft KB Article

      【讨论】:

        【解决方案8】:

        可以使用 global.aspx 文件,并在其中设置属性。 但是如上所述...为什么需要全局变量? 如果您尝试保存连接字符串和系统范围的静态变量.. 把它放在 web.config 中。

        抱歉,误读了。这是针对 Web 应用程序的。

        【讨论】:

        • 我的连接字符串仅在网络配置中。大约有 40-50 个函数管理所有与数据库相关的任务。我需要使用这些类,这样我的工作就会变得更容易。
        • 啊,我明白了...我认为您需要查看分层架构,将所有 dbase 类放入一个单独的项目中,将其称为 DAL 左右,然后在您的主项目中导入DAL 项目命名空间并从那里引用您的所有类。或者更酷...看看 SOA ...将您的类转换为 Web 服务并使用它们传递数据(尽管确保您传递的对象没有深度继承。(希望这有意义?)
        【解决方案9】:

        如果您使用的是 ASP.NET,我会考虑使用会话和应用程序状态,因为 ASP.NET 是无状态的。这是假设您正在谈论跨请求存储“全局”信息,而不仅仅是拥有一个容器来保存多个对象在一个请求期间可以访问的值。如果我的假设是错误的,我会看看 Jon 的答案。

        http://msdn.microsoft.com/en-us/library/ms972429.aspx

        根据下面的 cmets,您将要了解如何创建单例模式。

        http://www.dofactory.com/patterns/PatternSingleton.aspx

        不过,在这样做之前,我真的想看看为什么要在 ASP.NET 应用程序中使用它,因为如果实施不正确,它会严重影响性能。

        既然你想做的事情围绕着 db 的东西,我也想看看:

        http://www.15seconds.com/Issue/040830.htmhttp://msdn.microsoft.com/en-us/magazine/cc163854.aspx

        【讨论】:

        • 会话是每个用户,而不是每个应用程序。所以它并不是真正的全球性。
        • 两者都可以,我只是没有明确说明应用状态。
        • 我正在尝试使用一个类的单个对象来处理我的所有数据库处理。
        猜你喜欢
        • 1970-01-01
        • 2016-10-25
        • 2015-03-24
        • 2013-03-23
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多