【发布时间】:2016-01-11 16:41:38
【问题描述】:
编辑以使您免于阅读整篇文章 tldr:对象的字段不应是静态的,除非您希望该对象的所有实例对该字段具有相同的值
我正在尝试创建和填充博客对象的 ArrayList。我确实知道这样做的通用方法:
create ArrayList of Blogs
loop (some condition)
create new Blog
add this Blog to AL
但是,当我尝试在 while(datareader.read()) 循环中这样做时,ArrayList 中的所有元素都是完全相同的 Blog。具体来说,我最终得到一个 ArrayList,其中填充了多个指向数据库表中最后一个 Blog 对象的指针。这是我的代码:
public static ArrayList AllBlogs()
{
SqlDataReader dr = anonPage.ExecuteReader("SELECT * FROM Kristina_Blogs");
ArrayList allBlogs = new ArrayList();
if (dr.HasRows)
{
while (dr.Read())
{
Blog b = new Blog();
//grab a row from Kristina_Blogs and assign those attributes to b
b.setTitle(dr["title"].ToString());
b.setMessage(dr["message"].ToString());
b.setId(dr["id"]);
allBlogs.Add(b);
}
}
dr.Close();
return allBlogs;
}
正如我之前所说,这样做的结果是一个 ArrayList,其中包含指向 Kristina_Blogs 表中最后一个博客的指针。我想 ArrayList allBlogs 看起来像 [b, b, b, ... b] ,因此当我说 b.setTitle() 等时它们都会更新。但是如果我正在创建一个新的 Blog 对象怎么会是这样在每次迭代开始时?
以下是一些您不必阅读的额外信息,但它可能会消除对问题结构的一些混淆:
- 博客对象具有 id、title 和 message 字段及其各自的 getter/setter
- Kristina_Blogs 是一个表格,表示这些博客,其中包含 id、title、message 列
- 建议为我的数据库引擎添加一个标签,但我找不到它的标签:Microsoft SQL Server Management Studio
- 当我使用字符串的 ArrayList 而不是博客时,此代码可以完美运行
编辑:包括来自博客类的代码
public class Blog
{
public App myApp;
public static string Title;
public static string Message;
public static int Id;
//constructors
public Blog() { }
public Blog(App App) { this.myApp = App; }
//all getters and setters look like this
public string getTitle() { return Title; }
public void setTitle(string t) { Title = t; }
}
【问题讨论】:
-
不回答您的问题,但考虑使用 List
而不是 ArrayList。 ArrayList 是泛型和类型化集合之前的选择(如果我没记错的话,从 .Net 2 开始) -
最好分享您的
Blog代码。我想问题在于您的Blog类具有静态成员变量。 -
另外最好使用属性来设置值,而不是
setX和setY -
@RezaAghaei 我将添加我的博客代码。你是对的,这些字段都是静态的。您能否解释一下您所说的“使用属性设置值”是什么意思?
-
@Kristina 是的,我会为您发布答案。请更新您的问题并添加您的课程代码。