我使用静态方法来实现我真正想要的静态方法。我使用ReSharper来提高代码质量。有时候ReSharper建议一种方法可以是静态的。
当我得到以下课程时:
public class WhatEverClass {
private string DoSomethingFancy(string input)
{
string fancyStuff;
// Fancy Stuff here
return fancyStuff;
}
public WhatEverClass() {
string awesome=DoSomethingFancy("some fancy string");
}
}
ReSharper可能会说“DoSomethingFancy可以变为静态”。
我知道可以变得静态,但有充分的理由真正做到这一点吗?或者我应该忽略这些建议?
答案 0 :(得分:4)
通过定义静态方法,以及计算某事的过程,您向API
关于无状态的消费者显示意图你的功能。
当我们使用static
函数时,我们不希望它在其内部static private
变量中的某处保存计算状态或某个计算内部值,因此下一次调用即使第一次调用期间传递的参数相同,该函数也可能有不同的结果。
简而言之:每当你看到一个函数只是对参数执行一个动作而不保留某个状态时,它就是一个很好的候选者static
。
答案 1 :(得分:1)
如果你的方法不需要说或改变实例化对象的状态,那么它应该是静态的。
答案 2 :(得分:1)
通常的想法是,如果你没有创建任何实例,你可以将它声明为静态。至于应该在何处使用,ReSharper会根据标准编程实践为您提供建议。但是,我采取了“标准编程实践”的方法。这是一些个人编程偏好的问题。以下是关于该主题的详细参考:
答案 3 :(得分:0)
如果方法DoSomethingFancy
没有在对象WhatEverClass
中使用任何东西,那么在我的书中它应该是静态的,因为它实际上与它所在的对象没有任何关系使用。
答案 4 :(得分:0)
因为您将通过创建WhatEverClass()
实例从类外部调用WhatEverClass
方法。因此,每个实例的值都是不同的,因为变量是本地的,并且每次创建类的实例时都会创建。
但是如果你想为所有实例保留相同的值,那么你可以使它static
,这样它就会在内存中创建一次,所有实例都会使用它。
答案 5 :(得分:0)
注意使方法静态化的后果!
通过使您的方法保持静态,您可以让消费者更难以隐藏算法的实现并将其替换为自己的算法(显然,如果方法为private
您没有这样的担忧) 。
静态方法的消费者将您的实现融入他们的代码中 - 他们不能使用依赖注入来解析算法的特定实例(没有一点工作)。这使得他们的系统更难以测试,并且通常适用于不太可扩展的代码库。