SharpSource 1.8.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package SharpSource --version 1.8.0
NuGet\Install-Package SharpSource -Version 1.8.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SharpSource" Version="1.8.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SharpSource --version 1.8.0
#r "nuget: SharpSource, 1.8.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SharpSource as a Cake Addin
#addin nuget:?package=SharpSource&version=1.8.0

// Install SharpSource as a Cake Tool
#tool nuget:?package=SharpSource&version=1.8.0

Nuget Downloads Visual Studio Marketplace Downloads

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.

In other words, 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.

Interested in contributing? Take a look at the guidelines!


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 [Flags] enum members need to be either powers of two, or bitwise OR expressions. This will fire if they are non-negative decimal literals that are not powers of two, and provide a code fix if the value can be achieved through a binary OR using other enum members. 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
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
SS044 AttributeMustSpecifyAttributeUsage An attribute was defined without specifying the [AttributeUsage]. Warning Yes
SS045 StaticInitializerAccessedBeforeInitialization A static field relies on the value of another static field which is defined in the same type. static fields are initialized in order of appearance. Error No
SS046 UnboundedStackalloc An array is stack allocated without checking whether the length is within reasonable bounds. This can result in performance degradations and security risks. Warning Yes

Configuration

Is a particular rule not to your liking? There are many ways to adjust their severity and even disable them altogether. For an overview of some of the options, check out this document.

There are no supported framework assets in this package.

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.24.0 1,163 2/21/2024
1.23.4 725 1/5/2024
1.23.3 5,260 5/15/2023
1.23.2 715 3/18/2023
1.23.1 1,542 2/28/2023
1.23.0 279 2/26/2023
1.22.2 254 2/25/2023
1.22.1 281 2/21/2023
1.22.0 246 2/21/2023
1.21.6 560 2/10/2023
1.21.5 380 1/31/2023
1.21.4 308 1/29/2023
1.21.3 300 1/25/2023
1.21.2 284 1/23/2023
1.21.1 287 1/22/2023
1.21.0 298 1/21/2023
1.20.0 317 1/20/2023
1.19.1 340 1/14/2023
1.19.0 307 1/12/2023
1.18.0 1,362 1/10/2023
1.17.6 313 1/8/2023
1.17.5 325 1/6/2023
1.17.4 323 1/4/2023
1.17.3 299 1/3/2023
1.17.2 323 1/2/2023
1.17.1 301 1/2/2023
1.17.0 327 1/1/2023
1.16.22 315 1/1/2023
1.16.21 312 1/1/2023
1.16.20 296 1/1/2023
1.16.19 309 1/1/2023
1.16.18 287 12/31/2022
1.16.17 273 12/31/2022
1.16.16 310 12/30/2022
1.16.15 319 12/30/2022
1.16.14 321 12/30/2022
1.16.13 273 12/30/2022
1.16.12 292 12/30/2022
1.16.11 305 12/30/2022
1.16.10 293 12/30/2022
1.16.9 300 12/30/2022
1.16.8 275 12/30/2022
1.16.7 312 12/30/2022
1.16.6 305 12/30/2022
1.16.5 328 12/29/2022
1.16.4 313 12/29/2022
1.16.3 287 12/29/2022
1.16.2 309 12/29/2022
1.16.1 316 12/28/2022
1.16.0 278 12/27/2022
1.15.0 316 12/25/2022
1.14.1 8,561 10/16/2022
1.14.0 409 10/16/2022
1.13.1 403 10/1/2022
1.13.0 399 10/1/2022
1.12.0 448 9/25/2022
1.11.2 424 9/25/2022
1.11.1 397 9/24/2022
1.11.0 436 9/24/2022
1.10.1 421 9/16/2022
1.10.0 457 9/14/2022
1.9.4 476 9/13/2022
1.9.3 405 9/12/2022
1.9.2 391 9/12/2022
1.9.1 423 9/11/2022
1.9.0 426 9/11/2022
1.8.0 407 9/8/2022
1.7.2 425 9/6/2022
1.7.1 429 9/5/2022
1.7.0 421 9/5/2022
1.6.0 391 9/4/2022
1.5.0 387 9/4/2022
1.4.2 417 9/4/2022
1.3.1 426 9/3/2022
1.3.0 425 9/2/2022
1.2.4 426 8/31/2022
1.2.3 434 8/29/2022
1.2.2 427 8/29/2022
1.2.1 411 8/29/2022
1.2.0 428 8/29/2022
1.1.1 429 8/28/2022
1.1.0 409 8/28/2022
1.0.0 444 8/28/2022
0.9.0 441 8/26/2022
0.8.0 431 8/23/2022
0.7.0 393 8/22/2022
0.6.0 440 8/15/2022
0.5.0 418 8/14/2022
0.4.0 432 8/14/2022
0.3.0 500 5/10/2020
0.2.0 524 4/12/2020
0.1.0 540 4/12/2020

For a full overview of the changes, visit https://github.com/vannevelj/sharpsource/releases