C# 为什么可以';我不能像初始化其他变量一样初始化ViewState变量吗?
我在asp.net c#中使用ViewSate变量测试一些代码 我试图初始化一个ViewState变量,很明显我在编译器中有一个错误,请给我一个错误的理论解释C# 为什么可以';我不能像初始化其他变量一样初始化ViewState变量吗?,c#,asp.net,variables,viewstate,C#,Asp.net,Variables,Viewstate,我在asp.net c#中使用ViewSate变量测试一些代码 我试图初始化一个ViewState变量,很明显我在编译器中有一个错误,请给我一个错误的理论解释 public partial class _Default : System.Web.UI.Page { int value = 0; ViewState["vsValue"]=value; protected void Page_Load(object sender, EventArgs e) {
public partial class _Default : System.Web.UI.Page
{
int value = 0;
ViewState["vsValue"]=value;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack==false)
{
Label1.Text = value.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
ViewState["vsValue2"]=value;
value++;
Label1.Text = value.ToString();
}
}
您只能将变量的定义放在类范围内。任何其他代码(如在您的示例中初始化数组/字典元素)都需要在方法或构造函数中 最有可能等同于您尝试执行的操作是将初始化添加到
Page\u Load
(因为构造函数在Page的生命周期中可能太早了)
对于常规类,此类代码将转到构造函数:
class Foo
{
Dictionary<string,string> map = new Dictionary<string,string>();
public Foo()
{
map["One"] = "1";
}
class-Foo
{
字典映射=新字典();
公共食物(
{
地图[“一”]=“1”;
}
在代码中,您不是在初始化ViewState变量,而是在包含ViewState的字典中放入一个值。这些是不同的操作
如果要指定ViewState,它看起来像
ViewState = new Dictionary<>;
ViewState=新字典;
除了类型和泛型表达式中的错误之外,这可能是不允许的,因为ViewState属性设置器很可能是私有的
但是,您正在使用索引器设置键为“vsValue”的键/值对的值。这根本不是有效的c#
如果您能够将任何内容分配给ViewState,则可以使用字典初始化,如
ViewState = new Dictionary <string, object>
{{"vsValue", 1}, {"vsValue2", 2}};
ViewState=新字典
{{“vsValue”,1},{“vsValue2”,2};
您所调用的变量不是变量
ViewState
是一个特殊的字典,可用于页面。当您在页面中引用ViewState
时,实际上是指page.ViewState
可以使用索引器访问ViewState
中的单个条目:
这不是一个变量,正如“会话变量”是变量一样:
Session["MyInteger"] = 123;
int myInteger = (int) Session["MyInteger"];
与.NET中的其他任何地方一样,赋值语句只能在方法或属性内部使用-它不能用作声明。我想您之所以要这样做,是因为您希望将其声明为变量一次,然后在页面的方法中使用它。您可以通过在页面如下: 试试这个:
`protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack==false)///First time the page loads initialise variable value
{
ViewState["vsValue"]=value;
}
}`
是的,在load方法中移动statevariable的初始化不会给我带来任何错误。但是如果问题是初始化它,那么如果我不初始化ViewState变量,只在load方法的外部和上方声明它,只需键入:ViewState[“vsValue”];我仍然会得到一个错误。@Luther
ViewState[“vsValue3”]
不是ViewState
的“声明”,而不是使用vsValue3
中的元素,ViewState
在一个基类中声明。(另外,您个人对“声明”的定义可能不一样,我建议在提问时阅读并与语言规范保持一致)。只需在代码上添加一个小注释,IsPostBack==false
块外部的设置ViewState[“vsValue”]
将导致所有回发都覆盖ViewState值-这意味着您永远无法在后续回发中读取它。
Session["MyInteger"] = 123;
int myInteger = (int) Session["MyInteger"];
private string MyValue
{
get { return (string)(ViewState["vsValue"] ?? (object)null); }
set { ViewState["vsValue"] = value; }
}
//as an example you may have two click event buttons as below
protected void Button1_Click(object sender, EventArgs e)
{
MyValue = "value1";
value++;
Label1.Text = value.ToString();
}
protected void Button2_Click(object sender, EventArgs e)
{
Label2.Text = MyValue; //e.g. set the previous value first
MyValue = "value2"; //e.g. change this value now
...
}
`protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack==false)///First time the page loads initialise variable value
{
ViewState["vsValue"]=value;
}
}`