c# - 是否有充分的理由在非静态类中使用静态方法?

标签 c# .net

标题几乎是我的整个问题。

我正在为一位离岸开发人员进行代码审查,该开发人员在非静态类中拥有多个静态方法。在我向开发人员提出质疑并将其标记为“需要更改”之前,我只想确定一下。

我明白了静态类的用途:它不能被实例化,可以直接使用。但我看不出有任何理由在非静态类中使用静态方法。这有任何有效的用例吗?

相关方法都是私有(private),并且是从非静态方法调用的。

这是一个例子:

    public ViewResult ClaimDetails(ClaimDetails claim)
    {
        if (claim.ClaimNumber != 0)
        {
            claim = Get_ClaimDetails(claim);
        }
        return View("ClaimDetails", claim);
    }

    private static ClaimDetails Get_ClaimDetails(ClaimDetails claim)
    {
        ClaimsRepository claimsRepository = new ClaimsRepository();
        _claimDetails = new ClaimDetails();
        _claimDetails = claimsRepository.GetClaimDetails(claim.ClaimNumber);
        return _claimDetails;
    }

最佳答案

有一些事情会让我感到惊讶,但方法签名很好。

static 是一个关键字,可确保该方法不使用实例成员。那太棒了。它向其他开发人员清楚地表明了这一点。我会主张相反的观点:方法应该标记为静态,除非需要时。

如果您没有将其标记为静态,许多工具甚至 Visual Studio 本身都会标记它:CA1822: Mark members as static .

引用微软的话:

Members that do not access instance data or call instance methods can be marked as static (Shared in Visual Basic). After you mark the methods as static, the compiler will emit nonvirtual call sites to these members. Emitting nonvirtual call sites will prevent a check at run time for each call that makes sure that the current object pointer is non-null. This can achieve a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.

总结一下:它本身就很好。


阅读所有附加评论:看来真正的问题是注入(inject)的存储库已经存在,整个方法应该废弃并替换为行 claim = this.injectedClaimsRepository.GetClaimDetails(claim.ClaimNumber);.但这完全是另一个问题。如果使用正确,关键字 static 是完全没问题的,发布的代码没有显示它不是。

关于c# - 是否有充分的理由在非静态类中使用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60209725/

相关文章:

c# - 在 asp.net 中调用 session_start 或 session_onstart 时

c# - try 没有捕获 WebException

c# - 我的中继器不显示文本,我是否错过了什么?

c# - 具有附件突出显示功能的客户端 .Net Nest

c# - 仅在尝试使用 Word DocumentClass 时在产品中出现对象引用错误

c# - 如何在我的 .net 代码中向 GridView 表格添加圆 Angular ?

c# - 书架 : what Redis version to use?

c# - 是否有一个 API 可以设置双击的第一次和第二次点击之间可能发生的最小毫秒数?

c# - 在 C# 中,继承树可以达到多深?

c# - convert.ToString(C0) 的行为如何?