===================================================
问题描述如下:
====================================================
我定义了一个account类
然后定义了一个account类的数组,现在我想用一个循环来给这个数组赋值,最后发现数组中的所有元素变成最后一个元素的值了
我跟踪了一下程序,发现第一个元素赋值的时候很正常,但是第二个元素赋值的时候,第一个元素就跟着变了。===================================================
代码如下:
===================================================                  while (Sdr.Read())
                {
                    string str;
                    str=Sdr.GetString(0).ToString();
                    //下面的代码是通过tmp返回一个id为str的account类型的对象
                    data.Account.GetPPFromId(str, out tmp);
                    arr[i] = tmp;
                    i++;
                }
==================================================
症状:
==================================================
假设i最大为13
循环完毕以后arr数组中的每一个元素都和arr[13]一样了。
我知道是引用赋值惹的祸,但是不知道该怎么解决,我在account类中自己写了一个clone的类,也不能解决问题。
高手们帮帮忙,我为了这个问题,折腾了一个下午了,到现在还没有吃晚饭,哇哇....

解决方案 »

  1.   

    不要直接赋值,使用arr.SetValue方法即可。
      

  2.   

    把GetPPFromID的代码贴出来,问题应该出在这个里面。
    你出来的如果是引用类型,要么new ,要么Clone,否则就有可能都是一样的。
      

  3.   

    GetPPFromID代码:
    public static Boolean  GetPPFromId(string id, out code.Account YourPP)
            {
                code.Account tmp = new MyPP.code.Account(); 
                try
                {
                      
                    SqlConnection Myconn = Conn.CreateConn();
                    Myconn.Open();
                    StringBuilder str_sql = new StringBuilder("select * from PPUser where user_id='" +id +"'");
                    SqlCommand Mycomm = new SqlCommand(str_sql.ToString(), Myconn);
                    SqlDataReader Sdr = Mycomm.ExecuteReader();
                    Sdr.Read();
                    tmp.Id = id;
                    tmp.Name = Sdr.GetString(1);
                    tmp.Pwd = Sdr.GetString(2);
                    tmp.Level = Sdr.GetInt32(3);
                    tmp.Pb = Sdr.GetInt32(4);
                    tmp.Statue = Sdr.GetInt32(5);
                    tmp.Headimage = Sdr.GetInt32(6);
                    tmp.Signed = Sdr.GetString(7);
                    tmp.Sex = Sdr.GetString(8);
                    YourPP = tmp;
                    Myconn.Close();
                    Mycomm.Dispose();
                    Sdr.Dispose();                return true;
                    
                }
                catch (Exception)
                {
                    YourPP = tmp;
                    return  false ;
                }
            }
      

  4.   

    to acqy:
    setvalue不行哦
      

  5.   

    你干脆这样:
    1、对code.Account类型,实现ICloneable接口:class Account : ICloneable
    {
        public int Id { get; set; }
        public string Name { get; set; }    #region ICloneable Members    public object Clone()
        {
            Account account = new Account();
            account.Id = this.Id;
            account.Name = this.Name;
            return account;
        }    #endregion
    }2、while (Sdr.Read()) 
                    { 
                        string str; 
                        str=Sdr.GetString(0).ToString(); 
                        //下面的代码是通过tmp返回一个id为str的account类型的对象 
                        data.Account.GetPPFromId(str, out tmp); 
                        arr[i] = tmp.Clone(); 
                        i++; 
                    } 
      

  6.   

    问题解决,是我自己不小心,在定义类的时候,把字段设置成static了,晕死
    不过ACQY的思路对我很有启发,结贴!