以前就听很多程序员说在程序中发尽量不用使用静态变量和静态方法,因为静态方法和静态变量会产生很多不正确的数据,一直没理解这句话的意思,在网上看到静态变量是共享的,但是也有很多人建议使用静态方法,不知道该什么下情况使用静态方法和变量,什么情况下不使用,请对这方面有了解的程序员给于解答,比如我写了段操作数据库的静态方法:
 public static void ExecuteNonQuery(string SqlString)
        {
            SqlCommand cmd = CreateCommand(SqlString);
            cmd.ExecuteNonQuery();
            Close();//关闭数据库连接
        }
请大家说说这样写的有什么问题

解决方案 »

  1.   

    静态变量(static)是相对自动变量(auto)等而言的,一旦声明为静态变量,在编译时刻开始永远存在,不受作用域范围约束。 如果多人同时访问 就会共享这个静态变量
      

  2.   

    谢谢你的回答,我知道有时候静态变量会产生一些并不是自己想要的结点,举个例子来说:
    有一个按钮单击事件
     private static int count = 0;//声明一个静态计数变量
        protected void Button1_Click(object sender, EventArgs e)
        {
            count++;
            Label2.Text = count.ToString();
        }
    当我单击按钮一次的时候,我希望Label文本显示的是1(如果只有我一个人在操作,结果是正确的)
    如果同时有另一个人也单击按钮,他也只击了一次,他希望看到的结果也是1,但是因为我之前已经单击过1次了,这个时候文本显示的结果是2(这个我已经做过测试了)静态方法是否也会出现这样意想不到的结果呢?比如:
      /// <summary>
            /// 判断文件是否存在
            /// </summary>
            /// <param name="FileName"></param>
            /// <returns></returns>
            static public bool ExistsFile(string FileName)
            {
                return File.Exists(FileName);
            }
    我给他传的文件名是一个普通的变量,但是判断的方法是静态方法
    他会不会也出现这种意想不到的结果呢?请帮忙回答一下
      

  3.   

    对呀 所以讲静态变量是共享的 
    静态变量会在页面关闭时才释放  也就是讲只要这个页面打开着 那么大家都共用这个变量
    1,静态方法和静态变量是只属于原始类的 
    2,在内存上永远只有一份拷贝(原始类中),不会随着新建此类的对象而产生 
    3,所以只要有访问权限,在任何地方, 不需要实例化就可以用 类名.方法名() 来访问 
     
    static public bool ExistsFile(string FileName)
      {
      return File.Exists(FileName);
      }
    这个方法虽是静态的方法  但他的参数非静态变量  而是这个方法的局部变量
    所以不会出现共享的结果  因为参数在变
      

  4.   

    单线程单用户的话,静态变量随便用。
    多线程或多用户的话,静态变量前加volitile,静态函数里面使用Lock控制线程安全。
      

  5.   

    静态变量和静态方法在加载之前它们就存在了,而且会一直存在,少量是可以的,如果太多,会占用大量的资源,而其他方法是等到用NEW关键字的时候草占内存,然后被释放