CodeQL 文档

实例方法写入静态字段

ID: cs/static-field-written-by-instance
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - reliability
   - maintainability
   - modularity
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

静态字段表示类的所有实例的共享状态。 因此,从任何特定实例修改此状态都是不好的做法。 由于静态字段在程序所有线程中存在的所有类的实例之间共享,因此一个实例尝试读取该字段而另一个实例尝试写入该字段可能会导致竞争条件,从而意味着该类不是线程安全的。 它还会降低可读性,因为大多数开发人员期望实例方法仅影响实例状态,而静态方法仅影响静态状态。

建议

在实施此规则的警报修复之前,请务必仔细评估情况。 也许该字段被错误地声明为静态的,实际上应该是一个实例字段; 如果是这样,则从该字段中删除 static 修饰符。 如果该字段确实必须是静态的,请评估代码背后的假设。 它真的必须在实例方法中直接修改吗? 将对该字段的访问包装在静态方法中可能会有所帮助,这样就可以解决任何有关同步的问题,同时避免代码重复。

示例

在此示例中,名为“name”的字段被错误地声明为静态的。 尝试重命名一个人实际上会修改静态名称字段并影响所有人。

public class Customer
{
    private static String name;
    public void rename(String newname)
    {
        name = newname; // BAD
    }
}

参考

  • MSDN,C# 参考,static

  • ©GitHub 公司
  • 条款
  • 隐私