C# 为什么可以';我不能像初始化其他变量一样初始化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) {

我在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)
    {
        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;
    }
}`