C# 如果一个静态类有完全不可逆的、静态的方法,那么它有什么问题吗?

C# 如果一个静态类有完全不可逆的、静态的方法,那么它有什么问题吗?,c#,asp.net,code-behind,C#,Asp.net,Code Behind,我目前正在处理许多C#代码,这些代码不是我最初编写的。它们被写成一大堆看起来很可怕的代码,现在我的工作就是整理它们 无论如何,在许多不同的aspx.cs文件中都有大量重复的代码。例如,大约有五个代码隐藏文件,这些文件中的同一段代码重复了很多次,以便将一些文本输出到文件中。我可以采用以下方法: private void outputToFile(string text) 在五个不同的代码隐藏文件中重复 然而,我想知道声明一个名为“MethodHub”的静态类(它保存文件(字符串文本)的输出以及十

我目前正在处理许多C#代码,这些代码不是我最初编写的。它们被写成一大堆看起来很可怕的代码,现在我的工作就是整理它们

无论如何,在许多不同的aspx.cs文件中都有大量重复的代码。例如,大约有五个代码隐藏文件,这些文件中的同一段代码重复了很多次,以便将一些文本输出到文件中。我可以采用以下方法:

private void outputToFile(string text)
在五个不同的代码隐藏文件中重复

然而,我想知道声明一个名为“MethodHub”的静态类(它保存文件(字符串文本)的输出以及十几个彼此不相关的其他方法)是错误的做法还是错误的

总体目标是从静态类访问这些方法,这样我就可以有效地删除其他类中的数百行代码


任何人都可以看到这个方法有什么错误,或者我可能遇到的任何问题吗?

当然可以使用静态类,但是如果该方法使用任何共享字段,请避免线程安全问题。

当然可以使用静态类,但是,如果该方法使用了任何共享字段,就要避免线程安全问题。

当然,一个包含几个不相关方法的静态类并不特别优雅,但它比“到处重复大量看起来可怕的代码”模式要好


当你进行重构时,一定要分步进行。一旦删除了重复,就更容易进一步改进。

当然,一个包含几个不相关方法的静态类并不特别优雅,但它比“到处重复大量看起来可怕的代码”模式要好


当你进行重构时,一定要分步进行。一旦删除了重复,就更容易进一步改进。

我建议通过引入接口来抽象这种实用程序行为

interface IOutputService
{
  void Output(string data);
}
并使用您的实现实现类,如

class FileOutputService : IOutputService
{
    // ...
}
代表这个接口,主要的一点是避免使用静态类,因为

编辑:

  • 通过单元测试覆盖使用静态clas调用的逻辑将是一团混乱
  • 对于静态类,很容易切换逻辑/行为非常复杂,您必须更改逻辑实现本身,例如,您必须从文件输出切换到数据库输出,注入另一个实现公共接口的服务将非常容易,而不是进行潜在的重构

  • 我建议通过引入接口来抽象这种实用行为

    interface IOutputService
    {
      void Output(string data);
    }
    
    并使用您的实现实现类,如

    class FileOutputService : IOutputService
    {
        // ...
    }
    
    代表这个接口,主要的一点是避免使用静态类,因为

    编辑:

  • 通过单元测试覆盖使用静态clas调用的逻辑将是一团混乱
  • 对于静态类,很容易切换逻辑/行为非常复杂,您必须更改逻辑实现本身,例如,您必须从文件输出切换到数据库输出,注入另一个实现公共接口的服务将非常容易,而不是进行潜在的重构

  • 他为什么要避开静态类呢?声明一个接口会给他带来哪些好处?当他决定通过单元测试来覆盖整个逻辑时,摆脱“硬编码”的静态类调用将是一团糟,无论如何,我宁愿注入接口抽象之类的实用程序,而不是静态类。我并不是说单元测试是个坏主意,但是不要谈论引入单元测试。你喜欢某样东西并不意味着它总是最好或最简单的解决方案。@Paolo Tedesco,我必须同意你的看法。顺便说一句,我提到了测试,因为最初他还问了“或者我可能遇到的任何问题”,谢谢你的意见。事实上,对于我正在使用的软件的上下文,我并不关心单元测试。我很感激你的投入,我会考虑你所建议的方法,他为什么要避开静态课程呢?声明一个接口会给他带来哪些好处?当他决定通过单元测试来覆盖整个逻辑时,摆脱“硬编码”的静态类调用将是一团糟,无论如何,我宁愿注入接口抽象之类的实用程序,而不是静态类。我并不是说单元测试是个坏主意,但是不要谈论引入单元测试。你喜欢某样东西并不意味着它总是最好或最简单的解决方案。@Paolo Tedesco,我必须同意你的看法。顺便说一句,我提到了测试,因为最初他还问了“或者我可能遇到的任何问题”,谢谢你的意见。事实上,对于我正在使用的软件的上下文,我并不关心单元测试。我很欣赏你的输入,我会考虑你所建议的方法。总是有代码> [TraceStime] ,所以每个线程都有自己的实例。实际上你错了。在提取静态类中的实例方法后,可能需要一些静态字段,因此您可能会失去线程安全性。始终存在
    [ThreadStatic]
    ,因此每个线程都有自己的实例。实际上您错了。在提取静态类中的实例方法之后,可能需要一些静态字段,所以您可能会失去线程安全性。