SatorImaging.StaticMemberAnalyzer
1.1.0
Prefix Reserved
See the version list below for details.
dotnet add package SatorImaging.StaticMemberAnalyzer --version 1.1.0
NuGet\Install-Package SatorImaging.StaticMemberAnalyzer -Version 1.1.0
<PackageReference Include="SatorImaging.StaticMemberAnalyzer" Version="1.1.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add SatorImaging.StaticMemberAnalyzer --version 1.1.0
#r "nuget: SatorImaging.StaticMemberAnalyzer, 1.1.0"
// Install SatorImaging.StaticMemberAnalyzer as a Cake Addin #addin nuget:?package=SatorImaging.StaticMemberAnalyzer&version=1.1.0 // Install SatorImaging.StaticMemberAnalyzer as a Cake Tool #tool nuget:?package=SatorImaging.StaticMemberAnalyzer&version=1.1.0
Static Field Analyzer for C# / .NET
Roslyn-based analyzer to provide diagnostics of static fields and properties initialization.
- Wrong order of static field and property declaration
- Cross-Referencing Problem of static field across type
Unity Integration
This analyzer can be used with Unity 2020.2 or above. See the following page for detail.
https://github.com/sator-imaging/CSharp-StaticFieldAnalyzer/tree/main/unity
Visual Studio 2019 or Earlier
Analyzer is tested on Visual Studio 2022.
You could use this analyzer on older versions of Visual Studio. To do so, update Vsix
project file by following instructions written in memo and build project.
Cross-Referencing Problem
It is a design bug makes all things complex. Not only that but also it causes initialization error only when meet a specific condition.
So it must be fixed even if app works correctly at a moment, to prevent simple but complicated bug which is hard to find in large code base by hand. As you know static fields will never report error when initialization failed!!
It could be happened when reordering field declarations on refactoring large code base.
class A {
public static int Value = B.Other;
public static int Other = 310;
}
class B {
public static int Other = 620;
public static int Value = A.Other; // will be '0' not '310'
}
public static class Test
{
public static void Main()
{
System.Console.WriteLine(A.Value); // 620
System.Console.WriteLine(A.Other); // 310
System.Console.WriteLine(B.Value); // 0 👈👈👈
System.Console.WriteLine(B.Other); // 620
// when changing class member access order, it works correctly 🤣
// see the following for details
//System.Console.WriteLine(B.Value); // 310 👈 correct!!
//System.Console.WriteLine(B.Other); // 620
//System.Console.WriteLine(A.Value); // 620
//System.Console.WriteLine(A.Other); // 310
}
}
C# Compiler Initialization Logic
A.Value = B.Other;
- // 'B' initialization is started by member access
B.Value = A.Other;
// B.Value will be 0 because reading uninitializedA.Other
B.Other = 620;
- // then, assign
B.Other
value (620) toA.Value
A.Other = 310;
// initialized here!! this value is not assigned to B.Value
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.