在c#中获取和设置全局变量?

时间:2012-06-12 11:36:48

标签: c# global-variables

首先,我想说我知道它可能是一个简单的问题,但我在谷歌和这个论坛上找到的东西无法帮助我理解c#中的getter和setter;

我正在尝试为我的网络应用程序创建全局变量。

我来自Java,我不知道setter和getter是如何工作的。

我创建了一个类globalvars,并希望在那里设置var,这是我尝试的简化版本

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Threading;
using MvcApplication2.Controllers;

namespace MvcApplication2
{
public static class Globals {
public static int Lang { get; set; }
}
public class MvcApplication : System.Web.HttpApplication
{
    Globals.Lang = 5;
    HomeController hc = new HomeController("nl");
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {

        filters.Add(new HandleErrorAttribute());
    }
//more code

instead of setLang I have tried 

MvcApplication2.MvcApplication.Global.setLang(5);
Global.setLang(5);
MvcApplication2.Global.setLang(5);

but they all say the method does not exist in my namespace. 

我认为我的错误在于初始化setter / variable,但是这样做的正确方法是什么?

编辑:我的例子中的错误已修复

编辑:Globals.Lang = 5;只能在方法中使用??????

编辑:我的实际代码

4 个答案:

答案 0 :(得分:3)

下面给出完整性的答案,我建议您尝试远离传统意义上的“全局变量”,并远离ASP.NET应用程序中的static成员。 static成员的范围限定为AppDomain,IIS在管理工作进程时将无意中回收。这意味着您在其中设置的任何值都将丢失,并且在下次访问时将恢复为默认值。

<小时/> 你写的(public static int Lang { get; set; })是一个自动实现属性,它实际上是普通属性的特定样式。它避免了您必须定义字段以及包装属性。旧的手动方式是:

private static int _lang;

public static int Lang
{
    get { return _lang; }
    set { _lang = value; }
}

属性访问语法行为就像C#中的字段一样,所以:

Globals.Lang = 2;

你是如何设置的:

int value = Globals.Lang;

你是怎么得到的。

<小时/> 您的尝试包括尝试完全限定Globals类(必须在线或通过using语句)。

答案 1 :(得分:1)

您设置属性就像设置公共字段一样,所以在您的情况下它将是

Globals.Lang = //some int value;

这应该是真的,我的意思是重新考虑你使用像这样的全局(硬编码)值。在测试和版本控制方面,它们经常成为一场噩梦

你已经把你的长期问题写成了编辑。您无法访问方法范围之外的任何内容。您只能初始化当前类的字段,因此您需要将分配移动到方法(包括构造函数)

在您的示例中,您可以执行此操作

static MvcApplication(){
   Globals.Lang = 5;
}

这将为您的MvcApplication类创建一个静态构造函数并分配给Globals.Lang属性。

我仍然建议你不要这样做,但至少要加载来自某个存储的值

您还评论您希望记住所选语言。使用全局变量时,它会同时针对所有用户进行更改。 AppDomain(即AppPool)只有一个值

答案 2 :(得分:0)

而不是setLang(“EN”);,试试这个

Globals.Lang = Some_INT_Value; // or "EN" if the property is of string type

答案 3 :(得分:0)

首先,您的Lang属性为int,但您尝试设置为字符串,因此请先更改它。

然后你可以设置变量:

Globals.Lang = 5; //assuming it was meant to be an int not string
相关问题