当前位置: 首页 > news >正文

静态方法(Static)到底该不该用?

最近在review同事代码的时候发现一个问题,很多类里边穿插了一些静态方法,而且情况很普遍,调用的时候有的需要实例化,有些不需要实例化直接调用。我问他为什么要用那么多静态方法,他说“使用方便,不需要实例化,而且这些静态方法不需要保存状态,不需要调用外界变量,应该是线程安全的”。后来我们一起研究讨论了一下静态方法的使用问题,结论如下:


1. 静态方法不需要实例化,使用方便

2. 静态方法不存在常驻内存,效率高等幻觉,可以看看这篇文章

3. 一个类里面不要穿插静态方法和非静态方法,因为违反OO和设计原则

4. 大量使用静态方法有违OO原则

5. 使用静态方法的情况:适合用在helper类型的辅助类、基础类,这个类本身就定义成static class,看一段微软的示范代码:

    internal   static   class  Guard
    {
        
public   static   void  TypeIsAssignableFromType(Type assignee, Type providedType, Type classBeingBuilt)
        {
            
if  ( ! assignee.IsAssignableFrom(providedType))
                
throw   new  IncompatibleTypesException( string .Format(CultureInfo.CurrentCulture,
                    Properties.Resources.TypeNotCompatible, assignee, providedType, classBeingBuilt));
        }

        
public   static   void  ValidateMethodParameters(MethodBase methodInfo,  object [] parameters, Type typeBeingBuilt)
        {
            ParameterInfo[] paramInfos 
=  methodInfo.GetParameters();

            
for  ( int  i  =   0 ; i  <  paramInfos.Length; i ++ )
                
if ( parameters[i]  !=   null  )
                    Guard.TypeIsAssignableFromType(paramInfos[i].ParameterType, parameters[i].GetType(), typeBeingBuilt);
        }
    }


 

转载于:https://www.cnblogs.com/Mainz/archive/2010/12/01/1893151.html

相关文章:

  • JS 简单的2级下拉框
  • 使用Windows 7中的库
  • 嘉猪妈妈写的日记(一)
  • QT C++ 学习
  • 理解相机的相关参数的设置
  • 带参数的main函数
  • 基本文章
  • 使用sharppcap抓数据包
  • SOA
  • Mac OS 10.6.5上如何默认启动mysq服务
  • fedora linux 下安装pwntcha[验证码开源]
  • 初识 统一建模语言(UML)
  • OllyDBG 1.10汉化第二版
  • Eclipse Android配置
  • asp.net与Discuz-UCenter整合(3):UCenter与应用同步
  • ----------
  • CentOS7简单部署NFS
  • create-react-app项目添加less配置
  • express.js的介绍及使用
  • golang中接口赋值与方法集
  • IDEA 插件开发入门教程
  • JavaScript异步流程控制的前世今生
  • JS字符串转数字方法总结
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MYSQL 的 IF 函数
  • nodejs实现webservice问题总结
  • python3 使用 asyncio 代替线程
  • sessionStorage和localStorage
  • vue-loader 源码解析系列之 selector
  • 彻底搞懂浏览器Event-loop
  • 给Prometheus造假数据的方法
  • 关于使用markdown的方法(引自CSDN教程)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #162 (Div. 2)
  • (11)MSP430F5529 定时器B
  • (6)STL算法之转换
  • (pojstep1.1.2)2654(直叙式模拟)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (分布式缓存)Redis分片集群
  • (转)http-server应用
  • .NET 反射 Reflect
  • .NET 使用配置文件
  • .net实现客户区延伸至至非客户区
  • /etc/fstab 只读无法修改的解决办法
  • @Responsebody与@RequestBody
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [20171101]rman to destination.txt
  • [4.9福建四校联考]
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Asp.net mvc]国际化
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [CCIE历程]CCIE # 20604
  • [CISCN2019 华东南赛区]Web11