当前位置:  开发笔记 > 编程语言 > 正文

静态方法总是保存在内存中吗?

如何解决《静态方法总是保存在内存中吗?》经验,为你挑选了2个好方法。

我的整个开发团队都认为,静态方法是一件很糟糕的事情.

在某些情况下我真的没有看到任何缺点.当我之前需要无状态方法时,我总是为此目的使用静态方法.

我同意他们的一些观点,例如我知道他们很难测试(尽管这并非不可能).

我不知道的是,他们声称,静态方法总是保存在内存中,并将填充基本的内存使用量.因此,如果您在程序中使用100个静态方法,则在程序启动时,所有方法都会加载到内存中,并且会不必要地填充内存.此外,静态方法会增加内存泄漏的风险.

真的吗?

为了调用方法而必须创建一个类的新实例是非常不方便的.但这就是他们现在如何做到这一点,在方法中创建一个实例并调用该方法,这可能只是一个静态方法.



1> Hans Passant..:

就内存而言,静态方法和实例方法之间没有区别.实例方法只有一个额外的参数,this.其他一切都完全一样.此外,扩展方法很容易添加到C#的基本方法,所需要的只是暴露隐藏参数的语法.

方法为其机器代码占用空间,处理器执行的实际代码.以及描述该方法如何存储对象的表,它有助于垃圾收集器发现保存在局部变量和CPU寄存器中的对象根.此空间取自"loader heap",这是CLR创建的与AppDomain关联的内部数据结构.当方法首次执行时,恰好发生一次.释放该空间需要卸载该appdomain.静态变量也在加载器堆中分配.

不要丢掉静态方法的巨大优势.它们可以极大地提高代码的可读性和可维护性.由于他们的合同,他们不能改变对象状态.因此,它们可以产生很少的副作用,因此很容易推断它们的作用.但是,如果他们让你添加静态变量,那么他们就完全相反,全局变量是邪恶的.



2> Peter Duniho..:

为了调用方法而必须创建一个类的新实例是非常不方便的.但那就是他们现在如何做到这一点

他们是荒谬的,是生硬的.

正如Groo指出的那样,在本机编译级别,实例方法与静态方法甚至没有什么不同.只是有一个隐式参数传递给实例方法,而静态方法"你看到的就是你得到的".

运行时可以优化对方法的访问.它可能不会在第一次执行时JIT编译该方法.在实际需要IL之前,它甚至可能无法将IL从程序集加载到内存中.但它可以使用静态和实例方法同样很好地执行这些优化.

事实上,强制所有方法都是实例方法比使用静态方法更糟糕,因为这意味着对于某些方法,任意方法都是随意创建一个无用的对象.虽然运行时可能能够检测到对象引用未使用并因此导致它具有最小寿命,但它无法避免完全分配对象,即使退化对象在它活着时也会占用一些内存,它会添加垃圾收集的成本.


除此之外,让我们假设你的同事是正确的.你会得到什么?任何可衡量的性能差异?疑.让我们面对现实:托管代码,特别是C#,有可能隐藏任何数量的性能消耗实现细节.我们使用像C#这样的托管代码语言的主要原因是我们在生产力和代码正确性方面获得了很多,这些可能的低效率非常值得.大多数时候,特别是在现代计算机上,它们实际上是不可见的.

碰巧的是,你的同事正确,并且在实例方法中做出任何有益的方法,否则这些方法可能是静态方法.但即使情况并非如此,花时间编写混淆的,未表达的代码以避免一些未经测量的,未经证实的性能成本是浪费.(而且我知道没有人愿意比较实际的性能差异,因为如果他们有,他们通过消除所有静态方法没有发现性能没有改善).

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有