用Resharper的同学都知道,如果你写了一个私有函数,这个函数没有访问类里面的其他参数和方法,那么它建议你标记这个方法为私有静态方法,提示是这样的:

值得这样做吗?看看微软的建议:

After you mark the methods as static, the compiler will emit non-virtual call sites to these members. Emitting non-virtual call sites will prevent a check at runtime for each call that ensures that the current object pointer is non-null. This can result in a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.

意思就是说,编译器对标记为静态的函数无需检测this指针是否为空,有时候这样的检测会对性能敏感的应用产生影响。说的比较笼统,其实原因是对非静态函数来说,都会默认传递第一个this参数,就是this地址,调用的时候会首先压入栈;如果是静态函数,this指针的入栈这一步就免了,IL就免了ldrag.0这一步:

CPU方面

而大家知道,传递一个额外的参数给函数需要一些开销,CPU要把它放到寄存器,然后把它压入线程栈(Thread Stack)等等。省了这一步自然性能有所提升。但其实和装箱拆箱、算法、IO访问、数据库和网络访问等比起来简直就是微乎其微,后几项对性能的影响可能是十倍甚至百倍的。

内存方面

内存方面,大家知道函数和变量不同,变量的话私有的在线程栈(Thread Stack)中(调用函数前分配该内存),静态的在全局堆(Heap)里面(在加载AppDomain的时候就分配)。函数在内存中通常是存放在代码段(Code Segment),但在.NET中是在堆(Heap)里面,函数刚开始存在assembly中然后被映射到进程内存中,JIT编译器把他们复制为native code并被执行,所以基本上函数在内存中是存在堆(Heap)里面。不是每个实例(instance)一份,只有一份。

该不该用?

如果你的私有函数没有访问类里面的其他参数和方法,又被频繁调用,那就把他设为private static吧,没有什么坏处哦。看看微软的源码里面,也是大量使用私有静态方法:

最后提醒一句,public static的变量/方法/事件慎用,很容易引起内存泄露的问题。

私有静态方法private static method-值得用吗?相关推荐

  1. 找不到静态方法:No static method metafactory

    No static method metafactory 找不到静态方法解决办法,在app中的build.gradle中加入 compileOptions {sourceCompatibility J ...

  2. 动态代理jdk和cglib区别、注意事项(private,static,final)、spring aop原理

    文章目录 一.代理简聊 二.静态代理 三.动态代理 1.jdk动态代理 2.cglib动态代理 四.动态代理总结.注意事项 1.jdk动态代理与cglib的区别. 2.注意事项及分析. 五.aop原理 ...

  3. java.lang.IncompatibleClassChangeError: Expected static method

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  4. 私有方法与静态私有方法_每个私有静态方法都是新类的候选人

    私有方法与静态私有方法 您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做. 每当我编写一个新方法时,我就会意识到它可以是一个新类. 当然,我不会从所有课程中选修课程,但这必须是目标. 私有 ...

  5. 每个私有静态方法都是新类的候选人

    您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做. 每次编写新方法时,我都会意识到它可以是一个新类. 当然,我不会从所有课程中选修课程,但这是目标. 私有静态方法不可重用,而类则可重用,这 ...

  6. java中静态方法可以私有吗_java私有静态方法

    一.private static 我们都知道想要保护一些数据,只要设置为private,并且在java中static多少有"共享"的意味存在,那么既然已经private了,为什么还 ...

  7. php protected 属性,PHP实现在对象之外访问其私有属性private及保护属性protected的方法...

    本文实例讲述了PHP实现在对象之外访问其私有属性private及保护属性protected的方法.,具体如下: public 表示全局的访问权限,类内部外部子类都可以访问: private表示私有的访 ...

  8. 记录no static method cannot be reference

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如题: no static method cannot be reference 我一直以为是在 ...

  9. 安卓:No static method decodeBase64,commen-code包里报错的信息

    安卓:No static method decodeBase64 造成主要原因 1.导入的commons-codec的jar包与项目里的第三方sdk(比如微信和qq第三方登陆重复) 2.安卓frame ...

最新文章

  1. dataTable 表格组件刷新 问题记录
  2. Ruby_day[1]控制流2
  3. Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
  4. Struts1和Struts2的区别和对比(完整版)
  5. python的setting怎么找_python-DJANGO_SETTINGS_MODULE如何配置
  6. 解决Eclipse查看源代码出现Source not found的问题
  7. HDU1520 Anniversary party 树形动态规划
  8. uni-app——map组件路线[polyline]功能示例
  9. Bug调用其他函数失败
  10. find : 路径必须在表达式之前
  11. setid android,android-如何将setId()用于imageView
  12. Spring系列:学习Spring的资源和讨论
  13. 软件分享 | 第十二期 yoco文库下载
  14. Centos 7环境MySql8.0.28源码安装
  15. 泰晤士2021计算机科学排名,重磅!2021泰晤士学科排名发布!
  16. H5设备运动事件 DeviceMotionEvent 实现摇一摇功能
  17. 【iOS】—— Foundation框架(二)- 数组(NSArray与NSMutableArray)
  18. w乐ndows update更新失败,黑鲨教你解决Windows系统update更新失败问题
  19. 如何克隆服务器系统盘,如果把云服务器系统盘克隆
  20. 解决设置scrollTop不起作用

热门文章

  1. 如何在win10搜索计算机,如何在win10电脑的任务栏搜索框中添加地址?
  2. 20200221:在排序数组中查找元素的第一个和最后一个位置(leetcode34)
  3. 集成ueditor后显示html问题处理
  4. spark structured stream的Append模式例子
  5. VB 读写TXT文本文件函数
  6. 修复GRUB [转]
  7. 自考那些事儿(七):信息资源管理(总述篇)
  8. 腾讯IDG投资的明星无人车公司Zoox,拿下硅谷第一张载客许可
  9. Jetty插件实现热部署(开发时修改文件自动重启Jetty)
  10. 51nod 1062 序列中最大的数【打表】