很多时候我遇到过一个需要在类中定义的辅助函数的场景。以下是一个例子:
public class MyClass
{
private void BeautifyOrValidate(MyRequest request)
{
//Beautify or validate request
}
public void DoOperation(MyRequest request)
{
BeautifyOrValidate(request);
//Do actual operation
}
}
在上面的例子中,“BeautifyOrValidate”可以是静态的。在一个时候,许多这样的功能可以存在于一个类中 我想知道是否应该始终对这些方法使用static关键字,或者还有其他一些规则。
答案 0 :(得分:3)
对于私人会员而言,它并不重要,使其静态是一个微小的优化。
对于公共成员,基本规则是,当它可以是静态的时,它应该是。只是要清楚MyClass
BeautifyOrValidate(request)
个实例的事实
答案 1 :(得分:2)
显然它没有实际意义。
如果您使用像Resharper这样的代码分析工具,并且对魔法零警告状态(嘿,没有任何问题)着迷,那么您可能需要使这些方法保持静态,或者调整您的规则。
或者,如何将它们移动到静态类并使它们成为扩展方法呢?
public static class RequestUtilities
{
public static void BeautifyOrValidate(this MyRequest request)
{
...
}
}
这有一种很好的感觉,避免了你目前面临的深刻的道德困境。
否则,我认为这取决于个人偏好。除了Resharper之外,我的偏好不是让这些静态,因为这并没有真正反映出我故意使方法静止的意图。
请放心,没有明确的答案,在一般情况下,最轻微的事情可能无关紧要。
答案 2 :(得分:2)
(我想这是programmers.stackexchange的问题......)检查这个答案:https://stackoverflow.com/a/2267438/2018771
正如其他人所说,你应该拥有一个resharper :)。 如果它可以是静态的,则意味着:
然后根据代码你有选择(这里没有一般规则!)
BeautifyOrValidate(MyRequest request)
逻辑 进入 MyRequest
sense(代码正在使用MyRequest
的非静态方法)。这很酷,因为你已经找到了MyRequest
的附加功能,你应该把它放在哪里呢?
对我来说,在函数之间传递相同的变量是一个标志,在它自己的类中使它成为一个实例变量(在“旧”中,或者在新的中,因为我已经确定了一个新的责任新课程。)BeautifyOrValidate(MyRequest request)
是一个转换MyRequest的函数,但其逻辑与MyRequest或更广泛的用法无关,可以提取到静态助手类。可以将其视为MyRequest
。MyClass
与MyRequest
没有任何真正强大的联系,那么人们会感到困惑,他们也不会知道在哪里搜索BeautifyOrValidate(MyRequest request)
(最终他们会编写他们可以找到的自己的版本,导致行为不一致,无论其他人是否找到您或他们的代码......)。我个人的偏好不是在真正需要之前编写扩展方法,例如MyRequest
是第三方代码,或者不能/不得修改它是sealed
等等。或者没有其他项目需要修改,功能是特定于您的项目并清除您的代码。
如果您选择第一个版本,则可以删除该参数:
MyRequest myRequest = new MyRequest();
myRequest.BeautifyOrValidate();
对我有意义。