首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

前辈,关于静态成员赋值给属性的有关问题

2012-01-15 
求助前辈,关于静态成员赋值给属性的问题有两个类一个class1,一个classDataAccess,class1的属性通过它的静

求助前辈,关于静态成员赋值给属性的问题
有两个类一个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

[解决办法]
static的字段只有一份copy的内存中, 你得到的当然就是最后的最新data了
------解决方案--------------------


这类问题,测试一下即可

[解决办法]
哎。。。LZ兄弟知道静态成员的作用吗????静态成员是对总个对象而言的。。。也就是说。总个对象都公用一个静态成员。。。。你这样不停的给静态成员赋值。。。其实是对一个内存地址赋值。他能不一样吗????
[解决办法]
...............
[解决办法]
你的设计不合理,既然用到属性就没必要用静态参数。你的属性没有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


[解决办法]
??? .... ###
樓主對靜態對象沒有弄明白啊~~
你的需求用靜態屬性是不行的。所有同類的靜態字段都是相同的。
如果你想保存給sel的值﹐應該將sel定義成public類型的成員﹐放在你需要用的地方。
[解决办法]
所有的类的实例都需要保持同一种状态的用静态属性(static),否则就非静态属性。
[解决办法]
呵呵,LZ基础多加强啊,找本基础书先看看
[解决办法]
因为静态变量只能存在一个值,你后面无论取那个sel[i],都是从最后一次赋值的class中取的静态变量。

热点排行