Immutable struct should be declared as readonly
Declare immutable structures as readonly struct: the compiler and JIT learn the immutability intent and can optimize, e.g. passing/returning instances by-reference instead of copying them (no mutation risk). More: https://learn.microsoft.com/en-us/dotnet/csharp/write-safe-efficient-code#declare-immutable-structs-as-readonly
How to fix
Declare matched structures as readonly struct.
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>Immutable struct should be declared as readonly</Name>
// <Id>ND1914:ImmutableStructShouldBeDeclaredAsReadonly</Id>
warnif count > 0
from t in JustMyCode.Types
// Match structures that are immutable but not declared as 'readonly struct'
where t.IsStructure &&
t.IsImmutable &&
!t.IsReadOnly &&
!t.IsGeneratedByCompiler
select new {
t,
Debt = 2.ToMinutes().ToDebt(),
Severity = Severity.Medium
}
//<Expl>
// The *{0}* should be declared as *readonly*.
// This way not only the intent is clearly expressed and some optimizations
// can be performed by the compiler and the runtime.
//</Expl>
//<Desc>
// Declare immutable structures as **readonly struct**: the compiler and JIT
// learn the immutability intent and can optimize, e.g. passing/returning
// instances by-reference instead of copying them (no mutation risk). More:
// https://learn.microsoft.com/en-us/dotnet/csharp/write-safe-efficient-code#declare-immutable-structs-as-readonly
//</Desc>
//<HowToFix>
// Declare matched structures as **readonly struct**.
//</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