因为本人所剩分数不多,不打算散分,所以希望能有一到两个人回答精确些,然后平分分数。我的问题如下:
1,static变量不安全,那么static方法是否安全?请举出一个代码例子(非常重要)。
2,static方法内部的变量是否会一直占用资源?为什么?注意,以上问题基于web程序开发,所以请注意多人并发访问的问题。正所谓会的不难,难的不会,我因为无法通过一些测试手段来验证,但在网上搜索到的资源都不太详细,希望这里有一两个高人能提供详细点的解释,最好是有代码例子,而不是直接告诉最终结果,那样,只会引来其它人的争论。
能得到您的关注,我只能说声谢谢,另外送上一点点分数!

解决方案 »

  1.   

    哦,还有第三个问题忘记提了,即:当用new跟static方法都可以实现同一个功能的情况下,除了一个要实例化另一个不用实例化之外,两者还有什么其它区别?比如内存开销方面?
      

  2.   

    static变量不安全,那么static方法是否安全
    ————————————————————————————————————————————
    方法跟“安全”没有关系。并发时的对象“安全”问题仅仅跟对象变量的作用域有关,也就是说共享的变量如果不进行合适的同步锁,刚刚读取或者修改的变量立刻被其它线程修改,造成前后代码逻辑不一致,流程混乱不可靠。所以仅仅是变量声明的问题。当然static中要求所有外部变量都是static的,但是如果你并不会修改共享的变量,当然没有事。“测试”还是很简单的呀。你可以在页面上要求用户输入(通过textbox)一个文字,保存在static变量中,并且在页面刷新的时候读出来显示(通过label)。反复做这个动作,会发现显示的就是用户自己输入的。然后模拟两个用户从各自的浏览器上访问统一网站页面操作试试看。
      

  3.   

    上面的测试其实不能说“static变量不安全”,其实是从计算机编程逻辑出发与从用户需求出发两种不同出发点造成的。从需求出发,就应该为用户会话保存“私有”变量。暂时忘记编程技术其实能够“一步到位”地写出正确的程序,避免“过分技术化”造成恶果。因此我觉得你的第三个问题,我倒是建议你先谨慎判断是否真的“实现同一个功能”了。另外,对象实例的方法(需要通过对象的接口表查询)与static的方法其实“性能”差别很小,相当于大海里的一滴水几乎没有影响。
      

  4.   

    类型中的 static 变量是在类型中本,当类型被创建的时候被初始化的。而类型是其实例第一次被创建的时候才创建的。类型其实也是对象,只不过是只有系统才能直接访问它。因此 static 变量其实也实现起来简单,只是位置特殊而已。同一类型的对象,他们访问同一个类型对象来取得static变量。稍微理解起来复杂一点的是:类型是与调入内存的assembly相关的。因此同一名字的类型,如果在不同的应用程序则他们不是同一个;如果在同一应用程序内被两次调入同一assembly,那么它们分别调入内存的“同一名字”的类型也完全不同。
      

  5.   

    关键在于是Web应用。Web应用需要考虑多用户并发的问题,那么static变量在于这种情况下,变量的操作是否“安全”?针对于public static的变量,就好像存在Application里的变量一样,可以被所有用户访问。这时候应该考虑避免两个用户可以同时访问该变量的操作。就像多线程控制共享资源一样。如果用非静态方法访问该变量应该使用 Lock() { } 将操作包含在其作用域内。
    如果是静态方法访问应该使用 Application.Lock / Application.UnLock 来控制对静态变量的操作。但是Application.Lock将会导致其他用户访问的暂时停滞,所以应该避免对静态变量的长时间处理。
      

  6.   

    我比较关心static方法,请楼上的高人能举一两个实例代码作解释,这样我测试起来理解透彻些.看了上面一些sp1234朋友的介绍,目前也是似懂非懂.
    请举一两个代码,有对比最好.谢谢