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

本文关键字:设置 全局变量 获取 | 更新日期: 2023-09-27 18:36:58

首先,我想说我知道这可能是一个简单的问题,但是我在Google和这个论坛上找到的内容无法帮助我理解C#中的getters和setters;

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

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

我做了一个类 globalvars,并想在那里设置一个 var,这是 im 尝试的简化版本

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. 

我认为我的错误在于初始化设置器/变量,但是正确的方法是什么?

编辑:我的考试中的错误已修复

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

编辑:我的实际代码

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

为了完整起见,我建议您尽量远离传统意义上的"全局变量",并在 ASP.NET 应用程序中远离static成员。 static成员的作用域为 AppDomain,IIS 在管理工作进程时会无意中回收该 AppDomain。这意味着您在其中设置的任何值都将丢失,并且它将在下次访问时恢复为默认值。


你写的(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 语句需要的)。

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

Globals.Lang = //some int value;

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

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

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

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

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

我仍然建议您不要这样做,而是至少从某些存储中加载值

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

而不是setLang("EN");试试这个

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

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

然后,您将按如下方式设置变量:

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