Avoid static fields with a mutable field type
Warns about static fields with a mutable field type: they hold modifiable state. Instance fields are the natural OOP artifact for mutable state; such static fields create confusion about runtime state. More: https://blog.ndepend.com/the-proper-usages-of-the-keyword-static-in-c/
How to fix
Hold mutable states in objects passed explicitly wherever consumed, rather than in a static field modifiable from everywhere in the program.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Avoid static fields with a mutable field type</Name>
// <Id>ND1902:AvoidStaticFieldsWithAMutableFieldType</Id>
warnif count > 0
from f in Application.Fields
where f.IsStatic &&
!f.IsEnumValue &&
!f.IsGeneratedByCompiler &&
!f.IsLiteral
let fieldType = f.FieldType
where fieldType != null &&
!fieldType.IsThirdParty &&
!fieldType.IsInterface &&
!fieldType.IsDelegate &&
!fieldType.IsImmutable
select new {
f,
mutableFieldType = fieldType ,
isFieldImmutable = f.IsImmutable ? "Immutable" : "Mutable",
isFieldReadOnly = f.IsInitOnly ? "ReadOnly" : "Not ReadOnly",
Debt = 10.ToMinutes().ToDebt(),
Severity = Severity.Medium
}
//<Expl>
// The *static {0}* is typed with the *{1}* that is mutable: its states can be modified at runtime.
// This can lead to runtime confusion and hinder code testability.
// In *Object-Oriented Programming*, *instance fields* are the preferred choice for holding modifiable states.
//</Expl>
//<Desc>
// Warns about static fields with a mutable field type: they hold modifiable
// state. **Instance fields** are the natural OOP artifact for mutable state;
// such static fields create *confusion* about runtime state. More:
// https://blog.ndepend.com/the-proper-usages-of-the-keyword-static-in-c/
//</Desc>
//<HowToFix>
// Hold mutable states in objects passed **explicitly** wherever consumed,
// rather than in a static field modifiable from everywhere in the program.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Immutability: all 15 items
- Fields should be marked as ReadOnly when possible ND1900
- Avoid non-readonly static fields ND1901
- Avoid static fields with a mutable field type ND1902
- Structures should be immutable ND1903
- Immutable struct should be declared as readonly ND1914
- Property Getters should be pure ND1904
- A field must not be assigned from outside its parent hierarchy types ND1905
- Don't assign a field from many methods ND1906
- Do not declare read only fields with mutable reference types ND1907
- Public read only array fields can be modified ND1908
- Types tagged with ImmutableAttribute must be immutable ND1909
- Types immutable should be tagged with ImmutableAttribute ND1910
- Methods tagged with PureAttribute must be pure ND1911
- Pure methods should be tagged with PureAttribute ND1912
- Record should be immutable ND1913