首先,我想说我知道它可能是一个简单的问题,但我在谷歌和这个论坛上找到的东西无法帮助我理解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;只能在方法中使用??????编辑:我的实际代码
答案 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