C#定义了一个static方法,不调用这个方法,会占内存吗?

作者&投稿:喻满 (若有异议请与网页底部的电邮联系)
c#中函数被定义不调用需要浪费内存吗~

不是静态的方法不会浪费内存的,如果是静态的方法是浪费内存的,静态方法从进程的开始一直到进程的结束一直在占据这内存
如果不是静态的方法,就和我们平常引用命名空间一样,我们引用命名空间只是一个引用,并不占据什么内存的啊

会的,
当Entry生命周期结束后,
里面的静态方法消耗的内存也会被释放掉。

方法 (Method) 是一种类型定义,所以,它被存放在 Type Object 上,Type Object 是一个被分配在托管堆上的特殊类型,在同一个 AppDomain 中,每一个类型,都对应一个全局的 Type Object。每个引用类型的实例,都包含一个指向它的直接类型的 Type Object 的指针,每个 Type Object 也存在类似的指针,用来标识它的直接父类型的 Type Object。

当调用静态方法时,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()后,内存依然被占用,直至程序结束才回收

所有的静态方法只能加载一次,在加载完后就执行回收了


利辛县18921367249: C#定义了一个static方法,不调用这个方法,会占内存吗? -
牧雁安塞: 方法 (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时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现.也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网