使用静态方法和静态类读写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文件好不好?的主要内容,如果未能解决你的问题,请参考以下文章
C#(099):文件读写利用File静态类 System.IO.FileInfoDirectoryInfoDriveInfo