0

在 ASP.net (C#) 中对 DropDownList 使用相同的 ListItem 对象时,它会显示最后一项文本和值。代码写在下面,

protected void Button1_Click(object sender, EventArgs e)  
{  
    ListItem itm = new ListItem();  
    itm.Text = "AAA";  
    itm.Value = "AAA";  
    DropDownList1.Items.Add(itm);  

    itm.Text = "BBB";  
    itm.Value = "BBB";  
    DropDownList1.Items.Add(itm);  

    itm.Text = "CCC";  
    itm.Value = "CCC";  
    DropDownList1.Items.Add(itm);  

    itm.Text = "DDD";  
    itm.Value = "DDD";  
    DropDownList1.Items.Add(itm);  
}  

DropDownList 显示 4 个项目,但所有项目的文本都为“DDD”。但是如果我添加

itm = new listItem();

在分配新的文本和值之前,它会根据需要显示。AAA、BBB、CCC、DDD。

是什么原因?

4

3 回答 3

0

ListItem 是一个对象,它在内存中只有一个实例。变量 itm 仅保存内存中对象的地址。当您将 listitem 添加到下拉列表时,下拉列表会在内部复制变量中的地址。因此,您将相同的对象添加到下拉列表中 4 次。稍后呈现下拉菜单并检查 Text 和 Value 属性时,它们将设置为您在上述代码中设置的最后一个值,即“DDD”。

使用 New 将在内存中实例化一个新对象,并且变量中的地址将指向新对象。

查找有关参考与值类型的主题,这应该可以帮助您了解正在发生的事情。

于 2013-07-30T15:13:00.670 回答
0

这是因为您将一个实例添加到显示的集合中。当您更改 itm.Text 的值时,您会更改集合内该项目在内存中的值。当您添加 itm = new listItem() 时,您将在内存中创建一个新实例,该实例将具有新值。基本上你是在内存中创建一个新地址。

于 2013-07-30T15:14:15.647 回答
0

使用 itm = new listItem() 创建一个类的实例使其成为内存中对该类的引用。换句话说,它保存了 listItem 对象的地址。每次更改它的属性值时,都会在内存中更新同一个对象。因此,当您将对象添加到下拉列表时,您也只是添加了引用。因此,每次更新对象时,引用的每个实例也会更新。如果您只想分配值,则可以使用结构而不是类。结构是值类型,类是引用类型。

有关结构和类之间区别的更多详细信息,请参阅this

.NET 中的结构和类有什么区别?

于 2013-07-30T16:37:55.143 回答