Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果一个方法不访问,我们是否应该始终将其声明为静态;这";对象属性或方法_C#_Oop_Static - Fatal编程技术网

C# 如果一个方法不访问,我们是否应该始终将其声明为静态;这";对象属性或方法

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

很多时候,我都会遇到这样一个场景:我们需要在类中定义一些helper函数。以下是一个例子:

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
    的附加功能,您还应该把它放在哪里? 对我来说,在函数之间传递相同的变量是将其作为自身类中的实例变量的标志(无论是在“旧”类中,还是在新类中,因为我已经确定了新类的新职责)
  • beautiforvalidate(MyRequest-request)
    是一个转换MyRequest的函数,但其逻辑与MyRequest或更广泛的用法无关,可以将其提取到静态助手类中。将其视为转换
    MyRequest
    数据的工具包
  • 您可以将其设置为静态的,但是如果
    MyClass
    MyRequest
    没有任何真正紧密的联系,人们会感到困惑,并且他们不知道在哪里搜索
    beautiforvalidate(MyRequest request)
    (最终他们将编写自己的版本,他们可以找到,从而导致不一致的行为,无论其他人是找到您的还是他们的代码……)
我个人的偏好是在真正需要扩展方法之前不要编写扩展方法,例如,
MyRequest
是第三方代码,或者您不能/不可以修改并且它是
密封的
,等等。或者没有其他项目需要修改,并且功能是特定于您的项目的,它会清除您的代码

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

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

对我来说很有意义。

我认为有可能使用
MyRequestBeautifier
MyRequestValidator
类。因此,如果这是针对私人成员的优化,没有理由不做对吗?从未听说过这样的“基本规则”,有进一步澄清的机会吗?优化是一个旁白,它不应该是主要的决策点。它不是一个优化考虑,而是一个设计考虑。通过使其静态化,你告诉世界它不会修改类中的任何非静态成员变量。模拟静态很难说。