SharpSource 1.5.0
See the version list below for details.
dotnet add package SharpSource --version 1.5.0
NuGet\Install-Package SharpSource -Version 1.5.0
<PackageReference Include="SharpSource" Version="1.5.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add SharpSource --version 1.5.0
#r "nuget: SharpSource, 1.5.0"
// Install SharpSource as a Cake Addin #addin nuget:?package=SharpSource&version=1.5.0 // Install SharpSource as a Cake Tool #tool nuget:?package=SharpSource&version=1.5.0
This repo houses a collection of analyzers that aim to make some language features and framework types easier to work with. It does this by highlighting when you might be using something incorrectly in a way that would result in suboptimal performance, runtime exceptions or general unintended behaviour.
Let's put it this way: this repo only contains analyzers for patterns that have a concrete potential to turn into a defect ticket.
It is not intended to help with general housekeeping tasks like formatting your code or providing productivity helpers.
Code | Name | Description | Level | Provides Code Fix? |
---|---|---|---|---|
SS001 | AsyncMethodWithVoidReturnType | Async methods should return a Task to make them awaitable. Without it, execution continues before the asynchronous Task has finished an exceptions go unhandled. |
Warning | Yes |
SS002 | DateTimeNow | Use DateTime.UtcNow to get a locale-independent value. DateTime.Now uses the system's local timezone which often means unexpected behaviour when working with global teams/deployments. |
Warning | Yes |
SS003 | DivideIntegerByInteger | The operands of a divisive expression are both integers and result in an implicit rounding. | Warning | No |
SS004 | ElementaryMethodsOfTypeInCollectionNotOverridden | Implement Equals() and GetHashcode() methods for a type used in a collection. Collections use these to fetch objects but by default they use reference equality. Depending on where your objects come from, they might be missed in the lookup. |
Warning | No |
SS005 | EqualsAndGetHashcodeNotImplementedTogether | Implement Equals() and GetHashcode() together. Implement both to ensure consistent behaviour around lookups. |
Warning | Yes |
SS006 | ThrowNull | Throwing null will always result in a runtime exception. |
Error | No |
SS007 | FlagsEnumValuesAreNotPowersOfTwo | A [Flags] enum its values are not explicit powers of 2. |
Error | Yes |
SS008 | GetHashCodeRefersToMutableMember | GetHashCode( ) refers to mutable or static member. If the object is used in a collection and then is mutated, subsequent lookups will result in a different hash and might cause lookups to fail. |
Warning | No |
SS009 | LoopedRandomInstantiation | An instance of type System.Random is created in a loop. Random uses a time-based seed so when used in a fast loop it will end up with multiple identical seeds for subsequent invocations. |
Warning | No |
SS010 | NewGuid | An empty GUID was created in an ambiguous manner. The default Guid constructor creates an instance with an empty value which is rarely what you want. |
Error | Yes |
SS011 | OnPropertyChangedWithoutNameofOperator | Use the nameof() operator in conjunction with OnPropertyChanged() to avoid divergence. |
Warning | Yes |
SS012 | RecursiveOperatorOverload | Recursively using overloaded operator will result in a stack overflow when attempting to use it. | Error | No |
SS013 | RethrowExceptionWithoutLosingStacktrace | An exception is rethrown in a way that it loses the stacktrace. Use an empty throw; statement instead to preserve it. |
Warning | Yes |
SS014 | StringDotFormatWithDifferentAmountOfArguments | A string.Format() call lacks arguments and will cause a runtime exception. |
Error | Yes |
SS015 | StringPlaceholdersInWrongOrder | Orders the arguments of a string.Format() call in ascending order according to index. This reduces the likelihood of the resulting string having data in the wrong place. |
Warning | Yes |
SS017 | StructWithoutElementaryMethodsOverridden | Structs should implement Equals() , GetHashCode() , and ToString() . By default they use reflection which comes with performance penalties. |
Warning | Yes |
SS018 | SwitchDoesNotHandleAllEnumOptions | Add cases for missing enum member. That way you won't miss new behaviour in the consuming API since it will be explicitly handled. | Warning | Yes |
SS019 | SwitchIsMissingDefaultLabel | Switch is missing a default label. Include this to provide fallback behaviour for any missing cases, including when the upstream API adds them later on. |
Warning | Yes |
SS020 | TestMethodWithoutPublicModifier | Verifies whether a test method has the public modifier. Some test frameworks require this to discover unit tests. |
Warning | Yes |
SS021 | TestMethodWithoutTestAttribute | A method might be missing a test attribute. Helps ensure no unit tests are missing from your test runs. | Warning | No |
SS022 | ExceptionThrownFromImplicitOperator | An exception is thrown from an implicit operator |
Warning | No |
SS023 | ExceptionThrownFromPropertyGetter | An exception is thrown from a property getter | Warning | No |
SS024 | ExceptionThrownFromStaticConstructor | An exception is thrown from a static constructor |
Warning | No |
SS025 | ExceptionThrownFromFinallyBlock | An exception is thrown from a finally block |
Warning | No |
SS026 | ExceptionThrownFromEqualityOperator | An exception is thrown from an equality operator | Warning | No |
SS027 | ExceptionThrownFromDispose | An exception is thrown from a Dispose() method |
Warning | No |
SS028 | ExceptionThrownFromFinalizer | An exception is thrown from a finalizer method | Warning | No |
SS029 | ExceptionThrownFromGetHashCode | An exception is thrown from a GetHashCode() method |
Warning | No |
SS030 | ExceptionThrownFromEquals | An exception is thrown from an Equals() method |
Warning | No |
SS031 | FlagsEnumValuesDontFit | A [Flags] enum its values are not explicit powers of 2 and its values dont fit in the specified enum type. |
Error | No |
SS032 | ThreadSleepInAsyncMethod | Synchronously sleeping a thread in an async method combines two threading models and can lead to deadlocks. |
Warning | Yes |
SS033 | AsyncOverloadsAvailable | An async overload is available. These overloads typically exist to provide better performing IO calls and should generally be preferred. |
Warning | Yes |
SS034 | AccessingTaskResultWithoutAwait | Use await to get the result of an asynchronous operation. While accessing .Result is fine once the Task has been completed, this removes any ambiguity and helps prevent regressions if the code changes later on. |
Warning | Yes |
SS035 | SynchronousTaskWait | Asynchronously await tasks instead of blocking them to avoid deadlocks. |
Warning | Yes |
SS036 | ExplicitEnumValues | An enum should explicitly specify its values. Otherwise you risk serializing your enums into different numeric values if you add a new member at any place other than the last line in the enum file. | Warning | Yes |
SS037 | HttpClientInstantiatedDirectly | HttpClient was instantiated directly. This can result in socket exhaustion and DNS issues in long-running scenarios. Use IHttpClientFactory instead. |
Warning | No |
SS038 | HttpContextStoredInField | HttpContext was stored in a field. This can result in a previous context being used for subsequent requests. Use IHttpContextAccessor instead. |
Warning | No |
SS039 | EnumWithoutDefaultValue | An enum should specify a default value of 0 as "Unknown" or "None". When an invalid enum value is marshalled or you receive a default value, many systems return it as 0 . This way you don't inadvertedly interpret it as a valid value. |
Warning | No |
SS040 | UnusedResultOnImmutableObject | The result of an operation on a string is unused. At best this has no effect, at worst this means a desired string operation has not been performed. |
Warning | No |
SS041 | UnnecessaryEnumerableMaterialization | An IEnumerable was materialized before a deferred execution call. This generally results in unnecessary work being done. |
Warning | Yes |
SS042 | InstanceFieldWithThreadStatic | [ThreadStatic] can only be used on static fields. If used on an instance field the attribute will not have any effect and the subsequent multithreading behaviour will not be as intended. |
Error | No |
SS043 | MultipleFromBodyParameters | A method specifies multiple [FromBody] parameters but only one is allowed. Specify a wrapper type or use [FromForm] , [FromRoute] , [FromHeader] and [FromQuery] instead. |
Error | No |
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.
Version | Downloads | Last updated |
---|---|---|
1.25.2 | 1,608 | 9/15/2024 |
1.25.1 | 99 | 9/15/2024 |
1.25.0 | 130 | 9/15/2024 |
1.24.1 | 149 | 9/13/2024 |
1.24.0 | 8,950 | 2/21/2024 |
1.23.4 | 856 | 1/5/2024 |
1.23.3 | 5,682 | 5/15/2023 |
1.23.2 | 789 | 3/18/2023 |
1.23.1 | 2,017 | 2/28/2023 |
1.23.0 | 309 | 2/26/2023 |
1.22.2 | 285 | 2/25/2023 |
1.22.1 | 309 | 2/21/2023 |
1.22.0 | 275 | 2/21/2023 |
1.21.6 | 679 | 2/10/2023 |
1.21.5 | 405 | 1/31/2023 |
1.21.4 | 336 | 1/29/2023 |
1.21.3 | 330 | 1/25/2023 |
1.21.2 | 312 | 1/23/2023 |
1.21.1 | 316 | 1/22/2023 |
1.21.0 | 328 | 1/21/2023 |
1.20.0 | 345 | 1/20/2023 |
1.19.1 | 364 | 1/14/2023 |
1.19.0 | 328 | 1/12/2023 |
1.18.0 | 10,940 | 1/10/2023 |
1.17.6 | 341 | 1/8/2023 |
1.17.5 | 357 | 1/6/2023 |
1.17.4 | 346 | 1/4/2023 |
1.17.3 | 327 | 1/3/2023 |
1.17.2 | 353 | 1/2/2023 |
1.17.1 | 327 | 1/2/2023 |
1.17.0 | 348 | 1/1/2023 |
1.16.22 | 347 | 1/1/2023 |
1.16.21 | 342 | 1/1/2023 |
1.16.20 | 328 | 1/1/2023 |
1.16.19 | 333 | 1/1/2023 |
1.16.18 | 317 | 12/31/2022 |
1.16.17 | 300 | 12/31/2022 |
1.16.16 | 337 | 12/30/2022 |
1.16.15 | 346 | 12/30/2022 |
1.16.14 | 353 | 12/30/2022 |
1.16.13 | 299 | 12/30/2022 |
1.16.12 | 319 | 12/30/2022 |
1.16.11 | 336 | 12/30/2022 |
1.16.10 | 321 | 12/30/2022 |
1.16.9 | 332 | 12/30/2022 |
1.16.8 | 301 | 12/30/2022 |
1.16.7 | 340 | 12/30/2022 |
1.16.6 | 336 | 12/30/2022 |
1.16.5 | 358 | 12/29/2022 |
1.16.4 | 341 | 12/29/2022 |
1.16.3 | 309 | 12/29/2022 |
1.16.2 | 338 | 12/29/2022 |
1.16.1 | 342 | 12/28/2022 |
1.16.0 | 305 | 12/27/2022 |
1.15.0 | 342 | 12/25/2022 |
1.14.1 | 9,669 | 10/16/2022 |
1.14.0 | 436 | 10/16/2022 |
1.13.1 | 429 | 10/1/2022 |
1.13.0 | 423 | 10/1/2022 |
1.12.0 | 478 | 9/25/2022 |
1.11.2 | 457 | 9/25/2022 |
1.11.1 | 423 | 9/24/2022 |
1.11.0 | 462 | 9/24/2022 |
1.10.1 | 447 | 9/16/2022 |
1.10.0 | 492 | 9/14/2022 |
1.9.4 | 512 | 9/13/2022 |
1.9.3 | 434 | 9/12/2022 |
1.9.2 | 415 | 9/12/2022 |
1.9.1 | 450 | 9/11/2022 |
1.9.0 | 453 | 9/11/2022 |
1.8.0 | 436 | 9/8/2022 |
1.7.2 | 453 | 9/6/2022 |
1.7.1 | 456 | 9/5/2022 |
1.7.0 | 450 | 9/5/2022 |
1.6.0 | 413 | 9/4/2022 |
1.5.0 | 416 | 9/4/2022 |
1.4.2 | 445 | 9/4/2022 |
1.3.1 | 451 | 9/3/2022 |
1.3.0 | 456 | 9/2/2022 |
1.2.4 | 460 | 8/31/2022 |
1.2.3 | 466 | 8/29/2022 |
1.2.2 | 457 | 8/29/2022 |
1.2.1 | 442 | 8/29/2022 |
1.2.0 | 456 | 8/29/2022 |
1.1.1 | 460 | 8/28/2022 |
1.1.0 | 441 | 8/28/2022 |
1.0.0 | 474 | 8/28/2022 |
0.9.0 | 464 | 8/26/2022 |
0.8.0 | 458 | 8/23/2022 |
0.7.0 | 419 | 8/22/2022 |
0.6.0 | 469 | 8/15/2022 |
0.5.0 | 440 | 8/14/2022 |
0.4.0 | 464 | 8/14/2022 |
0.3.0 | 536 | 5/10/2020 |
0.2.0 | 546 | 4/12/2020 |
0.1.0 | 572 | 4/12/2020 |
For a full overview of the changes, visit https://github.com/vannevelj/sharpsource/releases