ThinkMeta.CodeAnalysis.CSharp
1.0.11
dotnet add package ThinkMeta.CodeAnalysis.CSharp --version 1.0.11
NuGet\Install-Package ThinkMeta.CodeAnalysis.CSharp -Version 1.0.11
<PackageReference Include="ThinkMeta.CodeAnalysis.CSharp" Version="1.0.11" />
<PackageVersion Include="ThinkMeta.CodeAnalysis.CSharp" Version="1.0.11" />
<PackageReference Include="ThinkMeta.CodeAnalysis.CSharp" />
paket add ThinkMeta.CodeAnalysis.CSharp --version 1.0.11
#r "nuget: ThinkMeta.CodeAnalysis.CSharp, 1.0.11"
#:package ThinkMeta.CodeAnalysis.CSharp@1.0.11
#addin nuget:?package=ThinkMeta.CodeAnalysis.CSharp&version=1.0.11
#tool nuget:?package=ThinkMeta.CodeAnalysis.CSharp&version=1.0.11
ThinkMeta.CodeAnalysis
Static code analyzer for C#
ThinkMeta.CodeAnalysis.CSharp<br>
Overview
ThinkMeta.CodeAnalysis is a static code analyzer for C# projects, built on Roslyn. It helps developers identify code issues, enforce coding standards, and improve code quality automatically.
Features
- Detects common code issues and anti-patterns
- Supports custom analyzers and code fixes
- Integrates with .NET build and IDE tooling
- Targets .NET Standard 2.0 for broad compatibility
Diagnostics
TM0001: Use pattern matching for null checks
Description:
Warns when using == null or != null for null checks.
Reason:
Pattern matching (is null, is not null) is preferred for clarity and future-proofing code.
How to fix:
Replace == null with is null, and != null with is not null.
Exceptions:
Null checks using == null or != null inside expression trees (e.g., lambdas assigned to Expression<Func<...>>) are not reported by this diagnostic, as pattern matching is not supported in expression trees.
Examples:
// Standard null check
if (obj == null) { }
// =>
if (obj is null) { }
// Query syntax
var q = from o in arr where o == null select o;
// =>
var q = from o in arr where o is null select o;
// Razor-generated (in .g.cs from .razor)
@if (Model == null) { <text>Empty</text> }
// =>
@if (Model is null) { <text>Empty</text> }
// No warning in expression trees
Expression<Func<object, bool>> expr = o => o == null; // No diagnostic
TM0002: DeepCopy attribute usage violation
Description:
Reports errors when a method marked with [DeepCopy] does not follow required usage rules.
Reason:
Methods with [DeepCopy] must have exactly one parameter, and that parameter's type (and all nested types/collections, unless marked with [DeepCopyIgnore]) must be sealed.
How to fix:
- Ensure the method has only one parameter.
- The parameter type and all nested types/collections must be
sealed(unless[DeepCopyIgnore]is used).
Examples:
// Violations:
class Bar {
[DeepCopy]
void Copy(int a, int b) { } // TM0002: Method must have exactly one parameter.
}
class Foo { }
class Bar {
[DeepCopy]
void Copy(Foo foo) { } // TM0002: Parameter type 'Foo' must be sealed.
}
class Inner { }
sealed class Outer { public Inner I; }
class Bar {
[DeepCopy]
void Copy(Outer outer) { } // TM0002: All nested types and collections must be sealed.
}
// Correct:
sealed class Inner { }
sealed class Outer { public Inner I; }
class Bar {
[DeepCopy]
void Copy(Outer outer) { } // OK
}
TM0003: DeepCopy method incomplete
Description:
Warns when a method marked with [DeepCopy] is incomplete, such as containing only a throw new NotImplementedException() or is empty.
Reason:
A [DeepCopy] method should provide a full implementation for deep copying the parameter.
How to fix:
Implement the method body to perform a deep copy of the parameter.
Examples:
class Bar {
[DeepCopy]
void Copy(Foo foo) {
throw new NotImplementedException(); // TM0003: DeepCopy method incomplete.
}
}
// Correct:
class Bar {
[DeepCopy]
void Copy(Foo foo) {
// ... actual deep copy logic ...
}
}
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- 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.
Removed non-working analyzer rules.