C# 如果一个方法不访问,我们是否应该始终将其声明为静态;这";对象属性或方法
很多时候,我都会遇到这样一个场景:我们需要在类中定义一些helper函数。以下是一个例子:C# 如果一个方法不访问,我们是否应该始终将其声明为静态;这";对象属性或方法,c#,oop,static,C#,Oop,Static,很多时候,我都会遇到这样一个场景:我们需要在类中定义一些helper函数。以下是一个例子: public class MyClass { private void BeautifyOrValidate(MyRequest request) { //Beautify or validate request } public void DoOperation(MyRequest request) { BeautifyOrVali
public class MyClass
{
private void BeautifyOrValidate(MyRequest request)
{
//Beautify or validate request
}
public void DoOperation(MyRequest request)
{
BeautifyOrValidate(request);
//Do actual operation
}
}
在上面的示例中,“BeautyorValidate”可以设置为静态。一个类中可以同时存在许多这样的函数。我想知道我们是否应该始终使用static关键字来处理此类方法,或者有其他一些规则。对于私人成员来说,这并不重要,将其设置为静态是一个微小的优化
对于公共成员来说,基本规则是,当它可以是静态的时,它应该是静态的。只是想明确一个事实,
MyClass
实例没有参与beautiforvalidate(request)
显然,这没有实际意义
如果您使用像Resharper这样的代码分析工具,并且痴迷于神奇的零警告状态(嘿,这没什么错),那么您可能需要将这些方法设置为静态,或者调整您的规则
或者,把它们移到一个静态类中,让它们成为扩展方法,怎么样
public static class RequestUtilities
{
public static void BeautifyOrValidate(this MyRequest request)
{
...
}
}
这给人一种美好的感觉,避免了你目前面临的深刻的道德困境
否则,我认为这取决于个人偏好。撇开Resharper不谈,我的偏好是不要使这些方法成为静态的,因为这并不能真正反映我有意使方法成为静态的意图
请确信,没有明确的答案,而且在一般情况下,它可能一点也不重要。
(我想这是程序员的问题。stackexchange…)请查看以下答案:
正如其他人所说,您可能应该拥有一个resharper:)。
如果可以将其设置为静态,则表示:
- 方法不使用任何实例变量
- 方法不调用使用实例变量的任何其他方法
- 您可以将
逻辑移动到美化验证(MyRequest request)
,如果这样做有意义的话(代码使用的是MyRequest
的非静态方法)。这很酷,因为您已经发现了MyRequest
的附加功能,您还应该把它放在哪里? 对我来说,在函数之间传递相同的变量是将其作为自身类中的实例变量的标志(无论是在“旧”类中,还是在新类中,因为我已经确定了新类的新职责)MyRequest
是一个转换MyRequest的函数,但其逻辑与MyRequest或更广泛的用法无关,可以将其提取到静态助手类中。将其视为转换beautiforvalidate(MyRequest-request)
数据的工具包MyRequest
- 您可以将其设置为静态的,但是如果
与MyClass
没有任何真正紧密的联系,人们会感到困惑,并且他们不知道在哪里搜索MyRequest
(最终他们将编写自己的版本,他们可以找到,从而导致不一致的行为,无论其他人是找到您的还是他们的代码……)beautiforvalidate(MyRequest request)
MyRequest
是第三方代码,或者您不能/不可以修改并且它是密封的
,等等。或者没有其他项目需要修改,并且功能是特定于您的项目的,它会清除您的代码
如果选择第一个版本,则可以删除该参数:
MyRequest myRequest = new MyRequest();
myRequest.BeautifyOrValidate();
对我来说很有意义。我认为有可能使用
MyRequestBeautifier
和MyRequestValidator
类。因此,如果这是针对私人成员的优化,没有理由不做对吗?从未听说过这样的“基本规则”,有进一步澄清的机会吗?优化是一个旁白,它不应该是主要的决策点。它不是一个优化考虑,而是一个设计考虑。通过使其静态化,你告诉世界它不会修改类中的任何非静态成员变量。模拟静态很难说。