static 方法何时分配内存,何时释放? Static方法 并没有完全分配内存,只是把类的方法或属性的信息加入了内存中,这样访问起来就会比较快,当程序开始运行时,Static就分配好了,释放要到程序结束时。中间,它一直活着 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我觉得static方法只有在调用的时候才开始分配内存,因为static方法肯定在class里面,并没有实例化类,所以只有在调用static方法的时候才开始分配内存。释放时应该有几种情况:1.static方法中的static和const变量在项目启动时就已经分内存了,而且方法调用之后也不会被释放。2.static方法中的值变量(比如int型)在变量声明时才开始分配内存,它在超出它的作用域后马上被释放。3.static方法中的引用型变量要看它的使用者,当static方法调用后它是否被释放决定于该对象是否仍然被使用。(请教一高手得出的一点意见,仅供参考:)) 类的static成员的生命期与其进程完全一样。 static变量靜態占用內存﹐在程序運行期間它一直占用﹐直到程序結束運行它才释放 我很不同意楼上几位的观点,static方法可以很容易的进行重用,所以建议大家多多使用。关于内存的分配和释放问题我已经说过了有不同意见的欢迎大家讨论。 static变量在类第一次被引用的时候分配内存然后一直到程序退出才会被回收对于函数,也就是方法,没有分配内存这个概念!!! static虽然是始终占内存,但是也不需要实例化,完全面向对象的语言不支持全局变量,所以对那些本来全局的变量 ,让他常驻内存也无不可阿。 如果这个这个Static变量是类中的模块变量,则类开始加载时就已被分配内存了;如果这个Static变量存在于某个过程中,则只有当它首次房问时,就分配内存.可是一旦分配内存给Static变量,无论是模块极的,或者是过程级的变量,都不会消失,它们一直到这个类从内存撤消为止!!!朋友,明白否? 还是小花猪说的最地道:static 变量在类第一次被引用的时候分配内存然后一直到程序退出才会被回收楼上有位说到:const 变量,这是一个错误的提法。const 就是常量,不是什么变量。const 常量的值在编译后直接嵌入在代码中,无需分配内存。关于 const 常量的特殊性,请详读相关的语法文档。一本很有名的书:Applied Microsoft .Net Framework Programming 上有很精到的阐述。 static无需分配内存,但是不可乱用,因为不安全 公用方法我习惯上放在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方法,很值得讨论!!! static虽然是始终占内存,但是也不需要实例化,完全面向对象的语言不支持全局变量,所以对那些本来全局的变量 ,让他常驻内存也无不可阿。 我想static方法应该是在引用命名空间时分配内存,直到所有引用了此命名空间的程序全部结束时再释放!所以应该慎用! static方法内存的分配和释放是怎么回事。对于方法或者说函数哪里有什么内存的分配和释放的说法??。。关于这个问题。。小花猪也经说的非常清楚了。。还有在那里要为方法分配内存,,为方法释放内存程序一启动,OS就会把程序的代码全部载入到进程的代码区,直到进程结束。。静态变量是在静态构造函数中分配的。。它的生命期一起到进程结束。。 这里来了那么多星级人物,我也来说说CLR还用beforefieldinit 属性控制类的static构造函数在第一次static field被访问前调用。所以调用static方法的时候不一定初始化了static field. 同理, 类的实例可以在没调用static构造函数前初始化。C#对没static构造函数的类加了这个属性 不好意思!我想说的是static方法中的变量是如何分配内存的。他没有class构造函数的概念,static方法中可以使用static变量和const,当然还可以定义方法内的局部变量,还可以调用其它的方法,所以这中间内存的分配是有别于new 一个对象之后,使用对象中方法的。那位高手有关于内存分配的文章可以参考?多谢,多谢! shuker(我是一只小花猪),wangxt(海贝) is right方法谈什么内存?无论动态,静态都是存放在某一个特定的位置而已和实例的field是不同的 回来看看,我想说明为啥static field是第一次访问时初始化,而不是在类被加载时初始化 回复人: psn(psn) ( ) 信誉:100 2004-11-05 22:45:00 得分: 0 回来看看,我想说明为啥static field是第一次访问时初始化,而不是在类被加载时初始化 **********************************类的static field也就是类被第一次调用,也就是加载的时候被初始化的函数中的static变量是函数第一次被调用时候初始化的为什么?1。性能优化2。编译器实现的复杂度 我语言表达不清,这和编译器没关。clr可以获取类的信息,此时类内部结构已经被构造,函数stub和static field还是伪的,但是你可以通过reflection获知他们,这也就是类被加载了,其内容被部分stuff.当你第一次访问这个结构时,才初始化static fields, 第一次访问某个方法时,才初始化这个stub 瞎写了段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,输出是不同的 C# Socket通信问题? C# 中的switch 语句 怎样快速生成指定大小的文件? 请问如何得到应用程序当前路径呀? (给分)winform中用窗体利用messagebox.show弹出对话框 错误 WinForm里绘制统计图表 板竹请进, 我知道C#可以使用Office对象来操作Excel,但是不知道可否把Excel嵌入Window Form应用程序中? tcp问题 c#编写的应用程序应该能完全用于win98,win2000等系统吧?? 请问下面这些类的区别何在?? 扫描仪的接口代码
释放时应该有几种情况:
1.static方法中的static和const变量在项目启动时就已经分内存了,而且方法调用之后也不会被释放。
2.static方法中的值变量(比如int型)在变量声明时才开始分配内存,它在超出它的作用域后马上被释放。
3.static方法中的引用型变量要看它的使用者,当static方法调用后它是否被释放决定于该对象是否仍然被使用。(请教一高手得出的一点意见,仅供参考:))
有不同意见的欢迎大家讨论。
然后一直到程序退出才会被回收对于函数,也就是方法,没有分配内存这个概念!!!
然后一直到程序退出才会被回收楼上有位说到:const 变量,这是一个错误的提法。
const 就是常量,不是什么变量。const 常量的值在编译后直接嵌入在代码中,无需分配内存。关于 const 常量的特殊性,请详读相关的语法文档。
一本很有名的书:Applied Microsoft .Net Framework Programming 上有很精到的阐述。
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方法,很值得讨论!!!
程序一启动,OS就会把程序的代码全部载入到进程的代码区,直到进程结束。。静态变量是在静态构造函数中分配的。。它的生命期一起到进程结束。。
CLR还用beforefieldinit 属性控制类的static构造函数在第一次static field被访问前调用。所以调用static方法的时候不一定初始化了static field. 同理, 类的实例可以在没调用static构造函数前初始化。C#对没static构造函数的类加了这个属性
我想说的是static方法中的变量是如何分配内存的。
他没有class构造函数的概念,static方法中可以使用static变量和const,当然还可以定义方法内的
局部变量,还可以调用其它的方法,所以这中间内存的分配是有别于new 一个对象之后,使用对象中方法的。那位高手有关于内存分配的文章可以参考?多谢,多谢!
方法谈什么内存?
无论动态,静态
都是存放在某一个特定的位置而已
和实例的field是不同的
回来看看,我想说明为啥static field是第一次访问时初始化,而不是在类被加载时初始化
**********************************类的static field也就是类被第一次调用,也就是加载的时候被初始化的
函数中的static变量是函数第一次被调用时候初始化的为什么?
1。性能优化
2。编译器实现的复杂度
clr可以获取类的信息,此时类内部结构已经被构造,函数stub和static field还是伪的,但是你可以通过reflection获知他们,这也就是类被加载了,其内容被部分stuff.当你第一次访问这个结构时,才初始化static fields, 第一次访问某个方法时,才初始化这个stub
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,输出是不同的