有两个类一个class1,一个classDataAccess,class1的属性通过它的静态成员赋值,之所以定义成静态的是因为这个类的属性赋完值后以后还要用到,静态成员的值是通过classDataAccess类查询数据库得到的,其中查全部记录的方法要返回一个Iclass1的数组(因为不是一条class1类型的记录),我可能没说明白,示意代码如下: class class1:Iclass1
{
    private static string _str1;   //第一个静态成员
    private static string _str2;   //第二个静态成员
    
    public string P1         //第一个属性
    {
       get
         {
            return _str1;
         }
    }
    public string P2        //第二个属性
    {
       get
         {
            return _str2;
         }
    }    public class1(){}                   //无参数构造函数
    public class1(string s1,string s2)  //有参数构造函数
    {
       _str1=s1;   //类中属性赋值
       _str2=s2;   //类中属性赋值
    }    ......       //其他的成员
 
}class classDataAccess    //访问数据库类
{
......   
 public Iclass1[] selectall()  //查询全部数据
 {
   ......
   int n=....;         //查询到的记录条数
   Iclass1[] sel=new Iclass1[n];  //定义一个数组
   for(int i=0;i<n;i++)
   {
      string string1=myds.Tables[0].Rows[i]["str1"].ToString();
      string string2=myds.Tables[0].Rows[i]["str2"].ToString();
      class1 se=new class1(string1,string2);  //通过有参数的构造函数给属性赋值
      sel[i]=se;         //返回值
   }
   return sel;
 }
}
现在的问题是,sel[i]数组循环完后其中的值一样,都为最后一次查询到的数据,如果我把静态成员改成非静态的就正常了,可是那样的话查询到的数据赋给属性后以后再用就为空了,不知道我说明白没?呵呵,小弟菜鸟,请前辈指点,谢谢:D

解决方案 »

  1.   

    static的字段只有一份copy的内存中, 你得到的当然就是最后的最新data了
      

  2.   

    你的设计不合理,既然用到属性就没必要用静态参数。你的属性没有set。
    class class1:Iclass1
    {
        private string _str1;   //第一个静态成员
        private string _str2;   //第二个静态成员
        
        public string P1         //第一个属性
        {
           set
             {
                _str1=value;
             }
           get
             {
                return _str1;
             }
        }
        public string P2        //第二个属性
        {
           set
             {
                _str2=value;
             }
           get
             {
                return _str2;
             }
        }    public class1(){}                   //无参数构造函数
        public class1(string s1,string s2)  //有参数构造函数
        {
           _str1=s1;   //类中属性赋值
           _str2=s2;   //类中属性赋值
        }    ......       //其他的成员
     
    }
    class classDataAccess    //访问数据库类
    {
    ......   
     public Iclass1[] selectall()  //查询全部数据
     {
       ......
       int n=....;         //查询到的记录条数
       Iclass1[] sel=new Iclass1[n];  //定义一个数组
       for(int i=0;i<n;i++)
       {
          string string1=myds.Tables[0].Rows[i]["str1"].ToString();
          string string2=myds.Tables[0].Rows[i]["str2"].ToString();
          class1 se=new class1(string1,string2);  //通过有参数的构造函数给属性赋值
          se.P1=string1;
          se.P2=string2;
          sel[i]=se;         //返回值
       }
       return sel;
     }
    }
    要用到P1,P2直接调用就可以了。如sel[i].P1,sel[i].P2
      

  3.   

    ??? .... ###
    樓主對靜態對象沒有弄明白啊~~
    你的需求用靜態屬性是不行的。所有同類的靜態字段都是相同的。
    如果你想保存給sel的值﹐應該將sel定義成public類型的成員﹐放在你需要用的地方。
      

  4.   

    所有的类的实例都需要保持同一种状态的用静态属性(static),否则就非静态属性。
      

  5.   

    static的字段只有一份copy的内存中, 你得到的当然就是最后的最新data了哎LZ兄弟知道静态成员的作用吗????静态成员是对总个对象而言的也就是说。总个对象都公用一个静态成员。你这样不停的给静态成员赋值其实是对一个内存地址赋值。他能不一样吗????
    ---------------------------------------------------------------------------------
    那个我知道啊,可是在那个sel[i]数组里,每次循环都读一次属性值,sel[0]从这个内存地址取走数据,下一次sel[1]也从这里取,在下一次sel[2]也从这里取......这几次的数据不是都不一样吗?数组中每个成员的地址不一样吧,怎么下一次的会把上一次的影响呢,为什么阿,谢谢
      

  6.   

    你的设计不合理,既然用到属性就没必要用静态参数。你的属性没有set。
    class class1:Iclass1
    {
        private string _str1;   //第一个静态成员
        private string _str2;   //第二个静态成员
        
        public string P1         //第一个属性
        {
           set
             {
                _str1=value;
             }
           get
             {
                return _str1;
             }
        }
        public string P2        //第二个属性
        {
           set
             {
                _str2=value;
             }
           get
             {
                return _str2;
             }
        }    public class1(){}                   //无参数构造函数
        public class1(string s1,string s2)  //有参数构造函数
        {
           _str1=s1;   //类中属性赋值
           _str2=s2;   //类中属性赋值
        }    ......       //其他的成员
     
    }
    class classDataAccess    //访问数据库类
    {
    ......   
     public Iclass1[] selectall()  //查询全部数据
     {
       ......
       int n=....;         //查询到的记录条数
       Iclass1[] sel=new Iclass1[n];  //定义一个数组
       for(int i=0;i<n;i++)
       {
          string string1=myds.Tables[0].Rows[i]["str1"].ToString();
          string string2=myds.Tables[0].Rows[i]["str2"].ToString();
          class1 se=new class1(string1,string2);  //通过有参数的构造函数给属性赋值
          se.P1=string1;
          se.P2=string2;
          sel[i]=se;         //返回值
       }
       return sel;
     }
    }
    要用到P1,P2直接调用就可以了。如sel[i].P1,sel[i].P2
    -------------------------------------------------
    我也想用set阿,可是让我做这个的前辈说为了减少错误可能,让我用
    public class1(string s1,string s2)  //有参数构造函数
        {
           _str1=s1;   //类中属性赋值
           _str2=s2;   //类中属性赋值
        }
    给属性赋值,呵呵
      

  7.   

    因为静态变量只能存在一个值,你后面无论取那个sel[i],都是从最后一次赋值的class中取的静态变量。
      

  8.   

    不用set就把变量设成非静态的,就可以了。
      

  9.   

    我知道LZ的意思了...你把sel[i]赋值时,比如:第一回sel[1]=1,  再第二回把sel[2]= 2,就在第二回的同时,也把第一回赋值sel[1]的值也更改为2了..  不知道我理解的对不对...我觉得sel[1]像这样的可以看成一个指针,, 只是指向一个地址,你把一个静态变量的值给它..
    就相当于把那个地址给他了.. 他每回读取的.不是你开始的值. 而是一个固定位置里的值.但这个值它不是不变的.. 正像LZ说的.更成不是静态的就不会出现问题. 那是因为不是静态的每回new出的地址不同.. 希望这个就是LZ要的答案...