关于C#属性的困惑

时间:2010-12-04 09:55:58

标签: c# asp.net

我从网站上获得了一个示例代码。关于如何在ViewState中自动添加值,我还不明白一件事。

代码如下

private Dictionary<Guid, string> Names
{
    get { return (Dictionary<Guid, string>)ViewState["Names"]; }
    set { ViewState["Names"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // to keep this sample really simple, we will populate some
        // sample data in a Dictionary and store in the viewstate
        var names = new Dictionary<Guid, string>
        {
            { Guid.NewGuid(), "John" },
            { Guid.NewGuid(), "Smith" },
            { Guid.NewGuid(), "Arther" },
            { Guid.NewGuid(), "Hari" }
        };
        //store the list in the viewstate.
        ViewState.Add("Names", names);

        //init grid           
    }
}

protected void btnAddSave_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        Names.Add(Guid.NewGuid(), txtNewName.Text);            
    }
}

在页面加载事件中我知道在Dictionary集合中添加了很少的值,之后整个集合被添加到名为“Names”的ViewState中。

btnAddSave_Click事件中,代码Names.Add(Guid.NewGuid(), txtNewName.Text);在集合中再次添加名称。

但有一件事我只是不明白如何在viewstate中添加新值。

如果某人看起来private Dictionary<Guid, string> Names属性,则没有任何setter,因此在ViewState中如何自动添加新值。我希望我的问题很明确。简单来说,我只是想知道没有任何setter,但是当代码变成Names.Add(Guid.NewGuid(), txtNewName.Text);时,ViewState中是如何添加新值的。

自动在ViewState中添加新值的方式。因为在字典集合中添加了新值,但是没有代码可用,其中在向字典集合添加任何值之后在ViewState中添加了所有字典值。运行代码并且它工作正常。因此,此代码对我来说变得非常模糊。所以请帮助我理解在字典集合中添加任何新值时如何在ViewState中添加新值。谢谢!

3 个答案:

答案 0 :(得分:2)

ViewState的内部实现是字典,这就是可能的原因

访问时

  Names.Add(Guid.NewGuid(), txtNewName.Text);            

以下步骤

1-获取名称所代表的属性的后备存储,在您的情况下是ViewState [“Names”]。

查看属性Names的getter部分

private Dictionary<Guid, string> Names
{   
 **get { 
         return (Dictionary<Guid, string>)ViewState["Names"];
     }**   
 set { ViewState["Names"] = value; }}

编辑,对于Thomas评论,我正在添加我的回复

  

忘记了setter,它唯一的getter,现在当你取消引用Names readonly属性时,dereferencing背后的实际类型是statebag和statebag实现IDictionary,这就是为什么你可以将ViewState属性转换为Dictionary,现在当你调用Add的Dictionary方法时,它将存储在StateBag中,这是已知的Control的ViewState。   所以ViewState只是一个Control的属性,它不是一个类型

答案 1 :(得分:0)

ViewState中添加的内容不是字典的内容,而是对字典的引用。在此之后,您仍然可以更改字典中包含的内容。

当页面执行完成,并且即将发送到浏览器时,字典的内容将被序列化。在此之前,您可以更改字典,更改将以ViewState结束。

答案 2 :(得分:0)

Names.Add的值不会(直接)添加到视图状态。它已添加到已在viewstate中的集合中。结果是,当序列化集合时,将序列化添加到Names的值。这是理解引用类型(字典是)的问题