首先,我想说我知道这可能是一个简单的问题,但是我在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;只能在方法中使用??????
编辑:我的实际代码
为了完整起见,我建议您尽量远离传统意义上的"全局变量",并在 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