如果它不访问“this”对象属性或方法,我们是否应该始终将方法声明为static

时间:2013-11-13 11:18:42

标签: c# oop static

很多时候我遇到过一个需要在类中定义的辅助函数的场景。以下是一个例子:

public class MyClass
{
    private void BeautifyOrValidate(MyRequest request)
    {
        //Beautify or validate request
    }
    public void DoOperation(MyRequest request)
    {
        BeautifyOrValidate(request);
        //Do actual operation
    }
}

在上面的例子中,“BeautifyOrValidate”可以是静态的。在一个时候,许多这样的功能可以存在于一个类中 我想知道是否应该始终对这些方法使用static关键字,或者还有其他一些规则。

3 个答案:

答案 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
  • 转换数据的工具包
  • 您可以将其设为静态,但如果MyClassMyRequest没有任何真正强大的联系,那么人们会感到困惑,他们也不会知道在哪里搜索BeautifyOrValidate(MyRequest request)(最终他们会编写他们可以找到的自己的版本,导致行为不一致,无论其他人是否找到您或他们的代码......)。

我个人的偏好不是在真正需要之前编写扩展方法,例如MyRequest是第三方代码,或者不能/不得修改它是sealed等等。或者没有其他项目需要修改,功能是特定于您的项目并清除您的代码。

如果您选择第一个版本,则可以删除该参数:

MyRequest myRequest = new MyRequest();
myRequest.BeautifyOrValidate();

对我有意义。