-2

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

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

我来自 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. 

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

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

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

编辑:我的实际代码

4

4 回答 4

3

为了完整起见,我建议您尽量远离传统意义上的“全局变量”,并远离staticASP.NET 应用程序中的成员。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语句)。

于 2012-06-12T11:41:27.537 回答
1

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

Globals.Lang = //some int value;

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

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

在您的示例中,您可以这样做

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

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

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

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

于 2012-06-12T11:39:23.917 回答
0

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

Globals.Lang = Some_INT_Value; // or "EN" if the property is of string type
于 2012-06-12T11:40:10.790 回答
0

首先,您的Lang属性是一个int但您试图设置为字符串,所以首先改变它。

然后你可以这样设置变量:

Globals.Lang = 5; //assuming it was meant to be an int not string
于 2012-06-12T11:40:23.247 回答