3

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

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

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

4

3 回答 3

3

(我想这是程序员的问题。stackexchange ...)检查这个答案:https ://stackoverflow.com/a/2267438/2018771

正如其他人所说,您可能应该拥有一个 resharper :)。如果可以将其设为静态,则表示:

  • 该方法不使用任何实例变量
  • 该方法不调用任何其他使用实例变量的方法

然后您可以根据代码进行选择(这里没有一般规则!)

  • 如果有意义的话,您可以 BeautifyOrValidate(MyRequest request) 逻辑 移入 (代码正在使用 的非静态方法)。这很酷,因为您发现了 的附加功能,您还应该把它放在哪里?对我来说,跨函数传递相同的变量是使其成为自己类中的实例变量的标志(无论是在“旧”类中,还是在新类中,因为我已经确定了新类的新职责)。MyRequestMyRequestMyRequest
  • BeautifyOrValidate(MyRequest request)是一个转换 MyRequest 的函数,但它的逻辑与 MyRequest 或更广泛的用法无关,可以提取到静态帮助程序类。将其视为用于转换MyRequest.
  • 您可以将其设为静态,但如果MyClass与人没有任何真正牢固的联系,MyRequest则会感到困惑,他们将不知道在哪里搜索BeautifyOrValidate(MyRequest request)(最终他们会编写自己的版本,他们可以找到,导致不一致行为,无论其他人是否找到您或他们的代码...)。

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

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

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

我感觉合理。

于 2013-11-13T12:05:21.110 回答
3

对于私有成员来说,这并不重要,使其成为静态是一个微小的优化。

对于公共成员,基本规则是当它可以是静态的时,它应该是。只是为了清楚没有MyClass实例参与的事实BeautifyOrValidate(request)

于 2013-11-13T11:21:54.603 回答
2

显然它没有实际的区别。

如果您使用像 Resharper 这样的代码分析工具并且痴迷于神奇的零警告状态(嘿,这没什么错),那么您可能需要将这些方法设为静态,或者调整您的规则。

或者,将这些移出到静态类并使其成为扩展方法怎么样?

public static class RequestUtilities
{
    public static void BeautifyOrValidate(this MyRequest request) 
    { 
        ... 
    }
}

这给人一种很好的感觉,并避免了你目前面临的深刻的道德困境。

否则,我认为这取决于个人喜好。撇开 Resharper 不谈,我的偏好是不要将这些设为静态,因为这并不能真正反映我故意将方法设为静态时的意图。

请放心,没有明确的答案,在一般情况下,它可能一点也不重要。

于 2013-11-13T11:43:05.060 回答