C# 如果一个静态类有完全不可逆的、静态的方法,那么它有什么问题吗?
我目前正在处理许多C#代码,这些代码不是我最初编写的。它们被写成一大堆看起来很可怕的代码,现在我的工作就是整理它们 无论如何,在许多不同的aspx.cs文件中都有大量重复的代码。例如,大约有五个代码隐藏文件,这些文件中的同一段代码重复了很多次,以便将一些文本输出到文件中。我可以采用以下方法:C# 如果一个静态类有完全不可逆的、静态的方法,那么它有什么问题吗?,c#,asp.net,code-behind,C#,Asp.net,Code Behind,我目前正在处理许多C#代码,这些代码不是我最初编写的。它们被写成一大堆看起来很可怕的代码,现在我的工作就是整理它们 无论如何,在许多不同的aspx.cs文件中都有大量重复的代码。例如,大约有五个代码隐藏文件,这些文件中的同一段代码重复了很多次,以便将一些文本输出到文件中。我可以采用以下方法: private void outputToFile(string text) 在五个不同的代码隐藏文件中重复 然而,我想知道声明一个名为“MethodHub”的静态类(它保存文件(字符串文本)的输出以及十
private void outputToFile(string text)
在五个不同的代码隐藏文件中重复
然而,我想知道声明一个名为“MethodHub”的静态类(它保存文件(字符串文本)的输出以及十几个彼此不相关的其他方法)是错误的做法还是错误的
总体目标是从静态类访问这些方法,这样我就可以有效地删除其他类中的数百行代码
任何人都可以看到这个方法有什么错误,或者我可能遇到的任何问题吗?当然可以使用静态类,但是如果该方法使用任何共享字段,请避免线程安全问题。当然可以使用静态类,但是,如果该方法使用了任何共享字段,就要避免线程安全问题。当然,一个包含几个不相关方法的静态类并不特别优雅,但它比“到处重复大量看起来可怕的代码”模式要好
当你进行重构时,一定要分步进行。一旦删除了重复,就更容易进一步改进。当然,一个包含几个不相关方法的静态类并不特别优雅,但它比“到处重复大量看起来可怕的代码”模式要好
当你进行重构时,一定要分步进行。一旦删除了重复,就更容易进一步改进。我建议通过引入接口来抽象这种实用程序行为
interface IOutputService
{
void Output(string data);
}
并使用您的实现实现类,如
class FileOutputService : IOutputService
{
// ...
}
代表这个接口,主要的一点是避免使用静态类,因为
编辑:
我建议通过引入接口来抽象这种实用行为
interface IOutputService
{
void Output(string data);
}
并使用您的实现实现类,如
class FileOutputService : IOutputService
{
// ...
}
代表这个接口,主要的一点是避免使用静态类,因为
编辑:
他为什么要避开静态类呢?声明一个接口会给他带来哪些好处?当他决定通过单元测试来覆盖整个逻辑时,摆脱“硬编码”的静态类调用将是一团糟,无论如何,我宁愿注入接口抽象之类的实用程序,而不是静态类。我并不是说单元测试是个坏主意,但是不要谈论引入单元测试。你喜欢某样东西并不意味着它总是最好或最简单的解决方案。@Paolo Tedesco,我必须同意你的看法。顺便说一句,我提到了测试,因为最初他还问了“或者我可能遇到的任何问题”,谢谢你的意见。事实上,对于我正在使用的软件的上下文,我并不关心单元测试。我很感激你的投入,我会考虑你所建议的方法,他为什么要避开静态课程呢?声明一个接口会给他带来哪些好处?当他决定通过单元测试来覆盖整个逻辑时,摆脱“硬编码”的静态类调用将是一团糟,无论如何,我宁愿注入接口抽象之类的实用程序,而不是静态类。我并不是说单元测试是个坏主意,但是不要谈论引入单元测试。你喜欢某样东西并不意味着它总是最好或最简单的解决方案。@Paolo Tedesco,我必须同意你的看法。顺便说一句,我提到了测试,因为最初他还问了“或者我可能遇到的任何问题”,谢谢你的意见。事实上,对于我正在使用的软件的上下文,我并不关心单元测试。我很欣赏你的输入,我会考虑你所建议的方法。总是有代码> [TraceStime] ,所以每个线程都有自己的实例。实际上你错了。在提取静态类中的实例方法后,可能需要一些静态字段,因此您可能会失去线程安全性。始终存在
[ThreadStatic]
,因此每个线程都有自己的实例。实际上您错了。在提取静态类中的实例方法之后,可能需要一些静态字段,所以您可能会失去线程安全性。