• C# 为什么要限制静态方法的使用


    前言

    在工作了一年多之后,我发现静态方法的耦合问题实在是头疼。如果可以尽量不要使用静态方法存储数据,如果要存储全局数据就把数据放在最顶层的主函数里面。

    静态方法问题

    耦合问题,不要用静态方法存储数据

    我这里有两个静态方法:A和B。A和B都各种存储A_Data和B_Data。如果两个静态方法一直互相调用,就会导致耦合过高,无法控制数据流向的问题。

    A
    Method_A_1
    Data_B
    Method_A_2
    Method_A_3
    Data_A
    B
    Method_B_1
    Method_B_2
    Method_B_3

    可以看到,这个已经乱成一锅粥了

    Mermaid源码

    graph LR
    
    A--> Method_A_1-->Data_B
    A--> Method_A_2-->Data_B
    A--> Method_A_3-->Data_A
    A--->Data_A
    
    B--> Method_B_1-->Data_A
    B--> Method_B_2-->Data_A
    B--> Method_B_3-->Data_B
    B--->Data_B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    所以静态方法尽量只存放方法,不要存放变量。比如字符串切割,数组拼接,敏感字去除。

    扩展方法

    这里推荐使用扩展方法来解决,扩展方法很好的限制了输入和输出,不会出现耦合数据的情况
    微软扩展方法文档

    如何改变面向过程的思维

    喜欢用静态方法,其实还是面向过程的思维,就是在写方法的时候,就已经知道我可以直接去拿Static_A的静态参数。静态方法最容易出现的就是配置文件的读取。

    面向过程,直接去静态函数里面拿参数

    直接调用
    直接调用
    直接调用
    Static_A
    Data
    A
    Method_A
    B
    Method_B
    C
    Method_C
    这样是面向过程的思想,ABC可以直接去拿Static_A的参数
    如果参数A被污染就会导致参数不可控,非常的危险

    面向对象,在构造函数里面将参数注入

    构造函数注入
    Data
    A_Data_
    Method_A调用Data

    这个才是面向对象的思想。

    如果参数过多怎么办?

    方法1:将参数写对象

    
    method(string a,int b,int [] c)
    
    //改成
    
    method(Data a)
    
    class Data{
    	public string a {get;set;}
    	public int b {get;set;}
    	public int[] c {get;set;}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    方法2:通过委托实现回调

    这里不展开说

    方法3:依赖注入和IOC控制反转

    这里不展开说

  • 相关阅读:
    JS-10-es6常用知识-对象扩展
    韩语这是 作死的节奏啊 怎么说的
    基于transformer的心脑血管心脏病疾病预测
    [附源码]java毕业设计新生入学计算机配号系统
    仿牛客论坛项目
    Java 中用的是值传递还是引用传递?
    Poetry零基础教学使用
    C语言基础知识理论版(很详细)
    从离线到实时对客,湖仓一体释放全量数据价值
    Java学习笔记3.4.3 static关键字 - 静态代码块
  • 原文地址:https://blog.csdn.net/qq_44695769/article/details/133633364