私有静态方法private static method-值得用吗?
用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-值得用吗?相关推荐
- 找不到静态方法:No static method metafactory
No static method metafactory 找不到静态方法解决办法,在app中的build.gradle中加入 compileOptions {sourceCompatibility J ...
- 动态代理jdk和cglib区别、注意事项(private,static,final)、spring aop原理
文章目录 一.代理简聊 二.静态代理 三.动态代理 1.jdk动态代理 2.cglib动态代理 四.动态代理总结.注意事项 1.jdk动态代理与cglib的区别. 2.注意事项及分析. 五.aop原理 ...
- java.lang.IncompatibleClassChangeError: Expected static method
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...
- 私有方法与静态私有方法_每个私有静态方法都是新类的候选人
私有方法与静态私有方法 您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做. 每当我编写一个新方法时,我就会意识到它可以是一个新类. 当然,我不会从所有课程中选修课程,但这必须是目标. 私有 ...
- 每个私有静态方法都是新类的候选人
您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做. 每次编写新方法时,我都会意识到它可以是一个新类. 当然,我不会从所有课程中选修课程,但这是目标. 私有静态方法不可重用,而类则可重用,这 ...
- java中静态方法可以私有吗_java私有静态方法
一.private static 我们都知道想要保护一些数据,只要设置为private,并且在java中static多少有"共享"的意味存在,那么既然已经private了,为什么还 ...
- php protected 属性,PHP实现在对象之外访问其私有属性private及保护属性protected的方法...
本文实例讲述了PHP实现在对象之外访问其私有属性private及保护属性protected的方法.,具体如下: public 表示全局的访问权限,类内部外部子类都可以访问: private表示私有的访 ...
- 记录no static method cannot be reference
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如题: no static method cannot be reference 我一直以为是在 ...
- 安卓:No static method decodeBase64,commen-code包里报错的信息
安卓:No static method decodeBase64 造成主要原因 1.导入的commons-codec的jar包与项目里的第三方sdk(比如微信和qq第三方登陆重复) 2.安卓frame ...
最新文章
- dataTable 表格组件刷新 问题记录
- Ruby_day[1]控制流2
- Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
- Struts1和Struts2的区别和对比(完整版)
- python的setting怎么找_python-DJANGO_SETTINGS_MODULE如何配置
- 解决Eclipse查看源代码出现Source not found的问题
- HDU1520 Anniversary party 树形动态规划
- uni-app——map组件路线[polyline]功能示例
- Bug调用其他函数失败
- find : 路径必须在表达式之前
- setid android,android-如何将setId()用于imageView
- Spring系列:学习Spring的资源和讨论
- 软件分享 | 第十二期 yoco文库下载
- Centos 7环境MySql8.0.28源码安装
- 泰晤士2021计算机科学排名,重磅!2021泰晤士学科排名发布!
- H5设备运动事件 DeviceMotionEvent 实现摇一摇功能
- 【iOS】—— Foundation框架(二)- 数组(NSArray与NSMutableArray)
- w乐ndows update更新失败,黑鲨教你解决Windows系统update更新失败问题
- 如何克隆服务器系统盘,如果把云服务器系统盘克隆
- 解决设置scrollTop不起作用