使用静态方法和静态类读写json文件好不好?

Posted

技术标签:

【中文标题】使用静态方法和静态类读写json文件好不好?【英文标题】:Is it good to use a static method and static class to read and write to a json file? 【发布时间】:2021-05-23 02:48:54 【问题描述】:

我正在尝试写入和读取 JSON 文件。使用静态方法好吗?如何提高这段代码的性能

public static class Service

    private static JsonContainer ReadAll()
    
        using (StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath(Constants.JsonFilePath)))
        
            return JsonConvert.DeserializeObject<JsonContainer>(sr.ReadToEnd());
                 
    

    private static bool WriteAll(JsonContainer data)
    
        // serialize JSON directly to a file
        using (StreamWriter file = new StreamWriter(HttpContext.Current.Server.MapPath(Constants.JsonFilePath)))
        
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(file, data);
            return true;
        
    

【问题讨论】:

这是一种老式的做法。现代代码会将方法实现为接口的一部分,以便可以注入此服务(或其存根)。此外,HttpContextBase 将被注入而不是通过HttpContext.Current/ 访问 在没有进一步上下文的情况下问“对 X 使用静态方法好不好”就像问“在星期二写代码好不好?”。 【参考方案1】:

A very nice article why to avoid static classes

一些额外的点:

    您不能扩展它们 您最终会得到所有序列化代码,并且您的代码将变得无法管理。 你已经把它弄得太笼统了,放弃了所有类型安全 他们往往违反单一责任原则 它们阻碍了单元测试 它们不能被 DI 容器注入

除了Math,我真的想不出任何其他有意义的类(我相信有一些),那是因为这些概念是核心的,不会改变也不会扩展。

任何其他重要的表示都不会从中受益。

【讨论】:

"你不能扩展它们" - 但是你不能在 .NET 中扩展你的项目之外的 any 类型 - 你只能从非密封类派生,但是继承不应该被用作 mixins 的替代品,所以第 1 点并不是真正有效的。 你为什么这么认为?我真的很想听听你的意见。密封类以这种方式声明是有原因的。一个抽象类可以被认为是一个 mixin,这取决于定义。所有只是相应地使用的工具。使用静态类是没有充分理由的有效密封。 尽管 C# 是一种现代语言,但它仍然不是围绕 成功之坑 的概念设计的:您已经指出了许多实用和static 方法的理论上的缺点,但 static 方法提供了许多语法和(开发人员的)工作流便利,其中“正确”的做事方式(例如使用单例模式而不是静态方法;任意调用站点的便利,而不是需要向方法添加另一个参数 - 或向上下文类添加成员 - 以便将引用传递给拥有的接口实例等)... ...所以很难争辩“DI无处不在!”当有许多令人信服的替代方案具有自己的优势,并且没有让 DI 在任何应用程序和/或依赖项中工作所需的大量工作时(例如,必须添加对 DI 库的依赖项,必须设置 ConfigureServices ,必须将ClassName.StaticMethod() 引用更改为this.injectedService.StaticMethod()ClassName.DefaultInstance.StaticMethod()(这会使代码不必要地冗长),通过using static 失去访问权限,总是需要额外的(多余的)this 参数...

以上是关于使用静态方法和静态类读写json文件好不好?的主要内容,如果未能解决你的问题,请参考以下文章

Java 静态代理和动态代理

全局静态类和方法不好吗?

一个类只有静态字段和方法是不好的做法吗?

C#(099):文件读写利用File静态类 System.IO.FileInfoDirectoryInfoDriveInfo

Java中的静态和枚举

在 Dart 中将类静态工厂作为方法参数传递