C#定义了一个static方法,不调用这个方法,会占内存吗?
作者&投稿:喻满 (若有异议请与网页底部的电邮联系)
不是静态的方法不会浪费内存的,如果是静态的方法是浪费内存的,静态方法从进程的开始一直到进程的结束一直在占据这内存
如果不是静态的方法,就和我们平常引用命名空间一样,我们引用命名空间只是一个引用,并不占据什么内存的啊
会的,
当Entry生命周期结束后,
里面的静态方法消耗的内存也会被释放掉。
当调用静态方法时,CLR 会根据方法调用去寻找其对应的 Type Object,然后,把方法 JIT,JIT 之后的方法是本机代码,可以直接运行,然后,这部分代码被加载进入内存,方法的参数被加载进入当前执行栈,原来的执行上下文地址也被记录到执行栈;方法开始执行,执行完后,执行栈中的返回地址被读出,然后 CLR 利用本机跳转指令,跳转到该返回至继续执行。
当调用实例方法时,CLR 会根据实例的 Type Object 指针找到对应的 Type Object,然后,把方法 JIT,JIT 之后的方法是本机代码,可以直接运行,然后,这部分代码被加载进入内存,该实例对象,以及方法的参数被加载进入当前执行栈 (实例对象永远是第一个参数,即 arg0,利用 ldarg0 指令进行读取),原来的执行上下文地址也被记录到执行栈;方法开始执行,执行完后,执行栈中的返回地址被读出,然后 CLR 利用本机跳转指令,跳转到该返回至继续执行。
如果方法已经被 JIT 过,则不会被第二次 JIT。
方法在 IL 中是以字节流的形式存在的,所以,它仍然会占据内存。
方法 JIT 之后会被驻留在该进程的地址空间里面,因此,它也会在运行时占据内存。
方法的元数据存放在程序集 MethodRef 以及 MethodDef 表中。
总结下,不管是实例还是静态方法,被JIT只存在一份,不过实例方法多了一个引用该实例的参数作为它的第一个参数!
方法貌似没有分配内存这一说额,你应该问的是satatic变量吧
static方法或类只有在类的第一次访问时才会加载
程序启动时 即为之分配内存(方法在内存中主要是其变量和地址)
而static占用的资源不会被GC回收,直到程序结束
所以调用完ClassA.A1()后,内存依然被占用,直至程序结束才回收
所有的静态方法只能加载一次,在加载完后就执行回收了
牧雁安塞: 方法 (Method) 是一种类型定义,所以,它被存放在 Type Object 上,Type Object 是一个被分配在托管堆上的特殊类型,在同一个 AppDomain 中,每一个类型,都对应一个全局的 Type Object.每个引用类型的实例,都包含一个指向它的直接...
利辛县18921367249: C#中【静态方法】和【非静态方法】的区别?! - ?
牧雁安塞: 静态方法:1.可以直接用,不用new也就是实例化,通过类名加个点就可以用了2.静态方法里只可以用静态的东西3.静态方法的生命周期长,也就是说,定义一个静态变量,你往里面存东西可以一直存在4.定义的静态方法在内存中有固定的位置,所以一个程序最好不要有太多的静态方法 非静态方法:参考静态方法(取反) 不明白再留言吧#_#
利辛县18921367249: C#中的静态方法与非静态方法的区别是什么? - ?
牧雁安塞: C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析. C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?...
利辛县18921367249: C# 中静态方法和实例方法分别指的是什么? - ?
牧雁安塞: 实例方法,就是对象的方法,静态方法,是类的方法.实例方法不能直接调用,需要实例化类产生一个对象以后,掉用这个类下面的实例方法.静态方法不属于任何一个对象,它直属于类的方法,静态方法不能调用非静态的方法,因为这时的实例方法还没有分配地址.是NULL.但是其他方法可以任意掉用静态方法.public static int add(int i,int j){}//静态方法,即不需要实例化一个对象就可以直接调用.public void remove(){}//实例方法,需要产生一个对象才能调用.带static就是静态方法了C#是面向对象的语言,对象的概念一定要有认识
利辛县18921367249: c#类中的方法,什么情况下使用static修饰?什么情况下不用? - ?
牧雁安塞: static表示静态,所以这个问题就转化为静态类的作用了,静态类的作用就是可以不通过实例化而直接调用其中的方法,比方说Math类,你可以直接用Math.Abs(),并不需要先定义一个Math类的实例然后再调用Abs方法.
利辛县18921367249: C# 中用static定义的静态函数或方法,和非静态有什么区别??
牧雁安塞: 只有静态对象: class CompanyInfo { //.. static CompanyInfo ob = new CompanyInfo;
利辛县18921367249: 在c# 中static 和const的区别 - ?
牧雁安塞: static为静态修饰符,可以放在对象前面(函数也是一种对象)如:class Example{ public static void show(){ Console.WriteLine("这是一个静态方法"); } } 可直接Example.show();去调用这个方法而不用实例化 当然也可以定义静态的属性...
利辛县18921367249: 静态方法和非静态方法的区别是什么 - ?
牧雁安塞: 静态方法和非静态方法的区别总结如下:1、静态方法属于类所有,类实例化前即可使用; 2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员; 3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实...
利辛县18921367249: C#中static关键字的作用?
牧雁安塞: static意思是静态,可以修饰类、字段、属性、方法 标记为static的就不用创建实例对象调用了,可以通过类名直接点出来 比如C#控制台操作的Cancle类里面的成员就被标记为静态的,可以直接用Concle.直接点出来使用. 如果没有标记为静态就要通过创建实例对象来调用,比如说动态字符串StringBuilder就要new一个实例来调用 StringBuilder sb =new StringBuilder(); sb.xxx(); //xxx是方法名 上面有说把static理解为全局变量这个说法是错的,所有提升为成员变量的都可以理解为全局变量.
利辛县18921367249: C#里为什么static virtual不能同时使用 - ?
牧雁安塞: C# 是面向对象的程序设计语言,每一个函数都属于一个类.当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现.也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它...