静态与公共财产
问题描述:
我在MVC中编写代码,我不明白我项目中的行为公共属性!我的代码非常简单,增量属性。当我按下按钮时,属性被覆盖。它的工作只有当我有STATIC属性,但是当我有PUBLIC时,增量不起作用。公共资产是短暂的?你能帮我明白这一点, 其我的控制器:静态与公共财产
public class DatsController : Controller
{
// GET: Dats
Dats dats;
static public int _Var
{
get; set;
}
public DatsController()
{
dats = new Dats();
}
public ActionResult Index()
{
if (Request.HttpMethod == "post")
{
ViewBag.zmienna = _Var;
dats.dayToday = DateTime.Now.Date;
}
else
{
// var = var + 5;
ViewBag.zmienna = _Var;
}
return View();
}
public ActionResult Next()
{
_Var = _Var + 5;
//dats.firstDayWeek = data.firstDayWeek.AddDays(7);
return RedirectToAction("Index", "Dats");
}
}
你的答案确定THX!我读过了,我写了另一个代码,仍然没有工作....我知道问题在哪里,但我不知道如何解决它们; /如果你能帮助我,我会很好:)
我的模型:
public class Dats
{
static private DateTime _dataToday;
static private DateTime _firstDayWeek;
static private DateTime _lastDayWeek;
static public DateTime DayToday { get { return _dataToday = DateTime.Now.Date; } }
static public DateTime FirstDayWeek { get { return _firstDayWeek = Dats.pierwszyDzienTygodnia(_dataToday); } set { _firstDayWeek = value; } }
static public DateTime LastDayWeek { get { return _lastDayWeek = Dats.ostatniDzienTygodnia(_dataToday); } set { _lastDayWeek = value; } }
static public DateTime pierwszyDzienTygodnia(DateTime data)
{
int dzien = DayOfWeek.Monday - data.DayOfWeek;
if (dzien > 0)
{
dzien -= 7;
}
return data.Date.AddDays(dzien);
}
static public DateTime ostatniDzienTygodnia(DateTime data)
{
DateTime ostatniDzien = pierwszyDzienTygodnia(data.Date);
return ostatniDzien.Date.AddDays(6);
}
}
我的控制器:
public class DatsController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Next()
{
Dats.FirstDayWeek = Dats.FirstDayWeek.AddDays(7);
return RedirectToAction("Index", "Dats");
}
}
我的观点:
@using (Html.BeginForm("Next", "Dats", FormMethod.Post))
{
<button type="submit">Next</button>
@*@Html.ActionLink("dalej","Next", "Visits",new {data =7})*@
<dl class="dl-horizontal">
@Dats.DayToday
<dd>@Dats.FirstDayWeek</dd>
<dd>@Dats.LastDayWeek</dd>
</dl>
}
,我想来增大日期在我的财产第一天DayWeek。
答
每当你写一个函数或声明一个变量,它不会在内存中创建实例,直到你创建了类的对象。但是,如果使用静态修饰符声明任何函数或变量,它会直接在内存中创建实例并在全局范围内执行操作。静态修饰符不会引用任何对象。 所以它们就像内存中的单个副本,被所有人共享。 您应该仅为应用程序的硬编码值使用静态变量。 请参阅此处以获得更多说明 What is the use of static variable in C#? When to use it? Why can't I declare the static variable inside method?
答
变量的静态限定符表示变量定义一次。如果没有静态限定符,则每次创建类的实例时都会定义该变量。 例如:
class A{
public static int c;
};
class B{
public int c;
}
A a = new A();
a.c =0;
a.c++;//1
A aa = new A();
aa.c++;//2
B b= new B();
b.c++;//1;
B bb = new B();
bb.c++;//1
答
问题应该是静态与实例属性。功能是两者之间的基本区别。静态属性在类的所有对象之间共享。所以,无论何时发出新的请求,都会创建一个新的控制器类实例。由于该属性是静态的,因此可用于控制器的新实例来获取和设置它。但是,在实例变量的情况下,该属性也是新建的,并且在创建控制器的新实例时进行初始化。
不要像*不要*那样在控制器中使用静态属性。控制器不是*线程安全的,因此不仅要在特定用户的多个请求之间共享静态属性,还要共享所有用户的所有请求。换句话说,你在不同的客户端之间泄露数据。 – 2014-09-03 14:09:22