編輯以節省您閱讀整篇文章的難度 tldr:對象的字段不應該是靜態的,除非您希望該對象的所有實例對該字段具有相同的值循環創建並向ArrayList添加新對象
我試圖創建和填充Blog對象的ArrayList。我知道泛型方法做到這一點:
create ArrayList of Blogs
loop (some condition)
create new Blog
add this Blog to AL
然而,當我試圖將while(datareader.read())
環路內這樣做,所有在ArrayList中的元素是完全一樣的博客。具體來說,我最終得到一個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;
}
正如我以前說過,這樣做的結果是一個充滿指針從Kristina_Blogs表中的最後一個博客的ArrayList。我想像ArrayList allBlogs看起來像[b,b,b,... b],因此當我說b.setTitle()等時它們全部得到更新。但是,如果我創建一個新的Blog對象,情況如何呢?在每次迭代的開始?
下面是一些額外的信息,你就不用看了,但它可能清理有關問題的結構有些混亂:
- 博客對象有ID,標題和消息字段和他們各自的getter/setters
- Kristina_Blogs是代表這些博客的表,其中包含id,標題,消息列
- 建議聲明爲我的數據庫引擎添加標記,但找不到標記:Microsoft SQL Server管理工作室
- 此代碼的工作完美,當我用字符串,而不是博客
編輯的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; }
}
不回答你的問題,但考慮使用列表而不是ArrayList。 ArrayList是泛型和類型集合之前的選擇(從.Net 2開始,如果我沒有錯的話) –
最好分享你的Blog代碼。我想問題是你的Blog類有靜態成員變量。 –
此外它最好使用屬性來設置值,而不是'setX'和'setY' –