Static方法 并没有完全分配内存,只是把类的方法或属性的信息加入了内存中,这样访问起来就会比较快,
当程序开始运行时,Static就分配好了,释放要到程序结束时。中间,它一直活着

解决方案 »

  1.   

    我觉得static方法只有在调用的时候才开始分配内存,因为static方法肯定在class里面,并没有实例化类,所以只有在调用static方法的时候才开始分配内存。
    释放时应该有几种情况:
    1.static方法中的static和const变量在项目启动时就已经分内存了,而且方法调用之后也不会被释放。
    2.static方法中的值变量(比如int型)在变量声明时才开始分配内存,它在超出它的作用域后马上被释放。
    3.static方法中的引用型变量要看它的使用者,当static方法调用后它是否被释放决定于该对象是否仍然被使用。(请教一高手得出的一点意见,仅供参考:))
      

  2.   

    类的static成员的生命期与其进程完全一样。
      

  3.   

    static变量靜態占用內存﹐在程序運行期間它一直占用﹐直到程序結束運行它才释放
      

  4.   

    我很不同意楼上几位的观点,static方法可以很容易的进行重用,所以建议大家多多使用。关于内存的分配和释放问题我已经说过了
    有不同意见的欢迎大家讨论。
      

  5.   

    static变量在类第一次被引用的时候分配内存
    然后一直到程序退出才会被回收对于函数,也就是方法,没有分配内存这个概念!!!
      

  6.   

    static虽然是始终占内存,但是也不需要实例化,完全面向对象的语言不支持全局变量,所以对那些本来全局的变量 ,让他常驻内存也无不可阿。
      

  7.   

    如果这个这个Static变量是类中的模块变量,则类开始加载时就已被分配内存了;如果这个Static变量存在于某个过程中,则只有当它首次房问时,就分配内存.可是一旦分配内存给Static变量,无论是模块极的,或者是过程级的变量,都不会消失,它们一直到这个类从内存撤消为止!!!朋友,明白否?
      

  8.   

    还是小花猪说的最地道:static 变量在类第一次被引用的时候分配内存
    然后一直到程序退出才会被回收楼上有位说到:const 变量,这是一个错误的提法。
    const 就是常量,不是什么变量。const 常量的值在编译后直接嵌入在代码中,无需分配内存。关于 const 常量的特殊性,请详读相关的语法文档。
    一本很有名的书:Applied Microsoft .Net Framework Programming 上有很精到的阐述。
      

  9.   

    static无需分配内存,但是不可乱用,因为不安全
      

  10.   

    公用方法我习惯上放在static方法中。duwamish也是如此处理的。如下面代码所示:
    public class clsShare
    {
    public static string g_strDefaultDbConnection ;                 //默认数据库的连接串
    public const string  g_DateTimeFormat = "年/月/日";
    #region "插入历史日志//insertHistoryLog" /// <summary>
    ///    '*************************************************************
    ///    '*     函数名称:insertHistoryLog
    ///    '*     功能描述:添加一条历史日志信息
    ///    '*     作    者:肖海鹏
    ///    '*     创建日期:2004-2-4
    ///    '*     备    注:如果为本机录入,就写入机器名
    ///    '*************************************************************
    /// </summary>
    /// <param name="intObjectID">用户的ID</param>
    /// <param name="strIP">机器名</param>
    /// <param name="dteTime">发生时间</param>
    /// <param name="strType">事件类型,插入代码表中的codeID值</param>
    /// <param name="strType">事件说明</param>
    public static void insertHistoryLog( Page objPage,string strOperateType,string strMemo)
    {
    clsDbHandle dbHandle;
    clsHistory history;
    clsLoginUser loginUser;
    string strHostName;

    dbHandle = new clsDbHandle(clsShare.g_strDefaultDbConnection);
    {
    history = new clsHistory( dbHandle );
    loginUser = (clsLoginUser)clsShare.getSessionValue(objPage,clsSessionName.LOGINED_USER);  
    strHostName = objPage.Request.UserHostName; 
    if( strHostName == "127.0.0.1")
    strHostName = System.Net.Dns.GetHostName(); 
    history.ObjectID = loginUser.UserID;
    history.Ip = strHostName;
    history.Time = DateTime.Now;
    history.Type = strOperateType;
    history.Memo = strMemo;
    history.AddNewObject();
    }
    } #endregion
    }// clsss end
    当我们调用此方法时,用clsShare.insertHistoryLog(xxxx),来执行,由于clsShare没有进行实例化,所以static如何分配和释放内存?是否推荐大量使用static方法,很值得讨论!!!
      

  11.   

    static虽然是始终占内存,但是也不需要实例化,完全面向对象的语言不支持全局变量,所以对那些本来全局的变量 ,让他常驻内存也无不可阿。
      

  12.   

    我想static方法应该是在引用命名空间时分配内存,直到所有引用了此命名空间的程序全部结束时再释放!所以应该慎用!
      

  13.   

    static方法内存的分配和释放是怎么回事。对于方法或者说函数哪里有什么内存的分配和释放的说法??。。关于这个问题。。小花猪也经说的非常清楚了。。还有在那里要为方法分配内存,,为方法释放内存
    程序一启动,OS就会把程序的代码全部载入到进程的代码区,直到进程结束。。静态变量是在静态构造函数中分配的。。它的生命期一起到进程结束。。
      

  14.   

    这里来了那么多星级人物,我也来说说
    CLR还用beforefieldinit 属性控制类的static构造函数在第一次static field被访问前调用。所以调用static方法的时候不一定初始化了static field. 同理, 类的实例可以在没调用static构造函数前初始化。C#对没static构造函数的类加了这个属性
      

  15.   

    不好意思!
    我想说的是static方法中的变量是如何分配内存的。
    他没有class构造函数的概念,static方法中可以使用static变量和const,当然还可以定义方法内的
    局部变量,还可以调用其它的方法,所以这中间内存的分配是有别于new 一个对象之后,使用对象中方法的。那位高手有关于内存分配的文章可以参考?多谢,多谢!
      

  16.   

    shuker(我是一只小花猪),wangxt(海贝) is right
    方法谈什么内存?
    无论动态,静态
    都是存放在某一个特定的位置而已
    和实例的field是不同的
      

  17.   

    回来看看,我想说明为啥static field是第一次访问时初始化,而不是在类被加载时初始化
      

  18.   

    回复人: psn(psn) ( ) 信誉:100  2004-11-05 22:45:00  得分: 0  
     
     
       回来看看,我想说明为啥static field是第一次访问时初始化,而不是在类被加载时初始化
      
     
    **********************************类的static field也就是类被第一次调用,也就是加载的时候被初始化的
    函数中的static变量是函数第一次被调用时候初始化的为什么?
    1。性能优化
    2。编译器实现的复杂度
      

  19.   

    我语言表达不清,这和编译器没关。
    clr可以获取类的信息,此时类内部结构已经被构造,函数stub和static field还是伪的,但是你可以通过reflection获知他们,这也就是类被加载了,其内容被部分stuff.当你第一次访问这个结构时,才初始化static fields, 第一次访问某个方法时,才初始化这个stub
      

  20.   

    瞎写了段
    using System;
    using System.Threading;
    using System.Reflection;namespace ConsoleApplication3
    {
    class WT
    {
    public WT()
    {
    Thread.Sleep(1000);
    }
    } class Class2
    {
    static DateTime sdt = DateTime.Now;
    static WT t = new WT();
    static DateTime sdt2 = DateTime.Now;
    static WT t2 = new WT();
    public static DateTime sdt3 = DateTime.Now; public Class2()
    {
    Thread.Sleep(1000);
    Console.WriteLine(DateTime.Now);
    Console.WriteLine(sdt);
    Console.WriteLine(sdt2);
    Console.WriteLine(sdt3);
    } public static void Trigger()
    {
    }
    } class Class1
    {
    static DateTime sdt = DateTime.Now; [STAThread]
    static void Main(string[] args)
    {
    Thread.Sleep(1000);
    Console.WriteLine(sdt);
    Console.WriteLine(DateTime.Now);
    Type t = Type.GetType("ConsoleApplication3.Class2");
    MethodInfo[] ms = t.GetMethods();
    Console.WriteLine(t.TypeHandle.Value);           //t.GetConstructor(new Type[0]).Invoke(new Object[0]);
    //Class2.Trigger();
    //Console.WriteLine(Class2.sdt3);
    Thread.Sleep(1000);
    Class2 c = new Class2();
    Console.ReadLine();
    }
    }
    }//Class2.Trigger();
    //Console.WriteLine(Class2.sdt3);
    这2句2选1,输出是不同的