All technologies

C#

30 painsavg 5.6/10
dx 10performance 7compatibility 4migration 3ecosystem 3security 1other 1architecture 1

Use of obsolete or weak cryptographic algorithms

9

Developers use outdated or vulnerable encryption algorithms like SHA1 or RIPEMD160, failing to recognize their security limitations. This creates security vulnerabilities that are easily avoidable with modern algorithms.

securityC#SHA1RIPEMD160

.NET ecosystem rejection due to accumulated pain

9

Experienced .NET developers are actively avoiding new .NET projects and migrating to Go, Python, Node.js, and PostgreSQL on AWS due to years of breaking changes, deprecated technologies, and migration pain. C# is perceived as dying for backend/web development.

migration.NETC#Go+2

Enterprise .NET environments stifle innovation and skill growth

7

Large enterprise .NET deployments enforce rigid processes, pre-approved design patterns, locked-down machines, and strict governance. Developers have no agency to fix broken systems or optimize workflows, leading to skill atrophy and mediocrity as the goal.

other.NETC#

Excessive database calls in ORM usage

7

Developers, particularly juniors using Entity Framework or NHibernate, make multiple separate database calls instead of batching queries. Each database call carries significant time overhead, degrading application performance.

performanceC#Entity FrameworkNHibernate

Outdated .NET versions lacking modern features

7

Developers maintaining codebases on unsupported or feature-limited .NET versions (Framework 4.8, Core 3.1, .NET 5-6) struggle to adopt modern C# features and syntax improvements. The path to upgrading to LTS versions is unclear and refactoring requires careful planning.

migration.NETC#

Unsafe virtual member access in constructors

6

Developers call overridden methods directly from base class constructors, causing code to execute before proper initialization. This is a common error that leads to runtime failures and unexpected behavior.

compatibilityC#

Lack of awareness about 'using' keyword for resource disposal

6

Many C# developers are unfamiliar with the dual purpose of the 'using' keyword, not recognizing it as a tool for proper object disposal and resource cleanup beyond namespace imports. This leads to resource leaks and improper memory management.

dxC#

Identical LINQ statements returning inconsistent results

6

LINQ abstracts collection manipulation but produces unpredictable results when the underlying data source changes format (in-memory objects vs. databases vs. XML). Developers must understand the underlying objects to write correct LINQ code, undermining the abstraction benefit.

compatibilityC#LINQ

Thread-Safe Dictionary Implementation Complexity

6

Manual implementation of thread-safe dictionaries using locks is error-prone and inefficient in multi-threaded scenarios, causing developers to either reinvent the wheel or face concurrency bugs.

performanceC#.NET

Compiler warnings accumulated and ignored

6

Developers habitually ignore or hide C# compiler warnings, abandoning the benefits of strict type checking. Hidden warnings accumulate unnoticed, and many warnings indicate real defects that eventually manifest as bugs in production code.

dxC#

Limited Cross-Platform Support

6

Although .NET Core improved cross-platform capabilities, C# was originally Windows-centric, and achieving true cross-platform compatibility (macOS, Linux) without code rewrites remains a significant challenge.

compatibilityC#.NET

Operator precedence surprises in pattern matching and null-coalescing

6

The `??` (null-coalescing) operator and pattern matching operators have unintuitive precedence rules. For example, `x is not 0 or 1` evaluates as `(x is not 0) or 1` rather than the intended `x is not (0 or 1)`, leading to subtle bugs and redundant logic.

dxC#

Inefficient string concatenation patterns in C#

6

Developers frequently use string concatenation in loops instead of StringBuilder, causing new memory allocations for each operation. This creates unnecessary performance degradation, especially with repeated append operations on strings.

performanceC#StringBuilder

C# language bloat and inconsistency

6

C# has accumulated so much syntactic sugar and features that it feels like three different languages. Inconsistencies between similar features (e.g., primary constructors vs. records, different object initialization methods) make the language harder to teach, learn, and use consistently.

dxC#

Performance optimization complexity and poor benchmarks

6

Identifying and fixing performance bottlenecks in C# is difficult, requiring deep understanding of memory management and resource allocation. C# ranks 22nd in TechEmpower performance benchmarks, necessitating use of profiling tools like dotTrace.

performanceC#.NET

Extension method confusion and undocumented dependencies

5

Developers unfamiliar with extension methods encounter compiler errors when viewing pre-written code that uses them. This causes confusion about missing libraries or version mismatches when the actual issue is an undeclared extension method, wasting significant debugging time.

dxC#

Unnecessary abstractions and over-engineering

5

C# developers create overly generic or abstract code anticipating future requirements, leading to unmaintainable solutions. This introduces state ownership issues, implicit workflows, and feature creep that obstructs rather than assists code clarity and testability.

architectureC#

Improper LINQ query patterns and exception handling

5

Developers use Where().First() instead of FirstOrDefault() or apply First() with conditions inefficiently, leading to unnecessary exceptions when no matching values are found. This is a common pattern mistake among C# developers.

dxC#LINQ

Manual property mapping instead of using mapping libraries

5

Developers manually rewrite object properties line-by-line instead of using established mapping libraries like AutoMapper. This is tedious, error-prone (easy to omit properties), and leads to maintenance difficulties with complex object models.

dxC#AutoMapper

Poor IDE and downstream integration of C# language features

5

New C# language features (top-level statements, global includes) are sometimes delivered with incomplete IDE polish, integration issues, and downstream problems in ASP.NET Core. The implementation itself works, but the tooling and delivery experience suffers.

dxC#ASP.NET Core

Ecosystem Centralization Around Microsoft

5

While .NET is open source, the ecosystem is heavily driven by Microsoft's strategic goals, making it difficult to integrate with non-.NET tools and reducing appeal for developers working outside the Microsoft stack.

ecosystem.NETC#

Legacy Codebase Verbosity and Boilerplate

5

Many existing C# projects contain excessive boilerplate and outdated patterns, requiring developers entering the ecosystem to navigate legacy code that doesn't reflect the language's modern capabilities.

migrationC#.NET

LINQ misunderstanding and misuse

5

Many C# developers either don't know about LINQ or misunderstand its capabilities beyond database querying. Developers continue using iterative statements instead of LINQ for collection manipulation, missing opportunities for cleaner, more concise code, though performance trade-offs exist.

dxC#LINQ

Imperative Code Patterns Reduce Maintainability

4

Developers frequently write manual collection iterations and imperative statements for simple operations instead of using declarative alternatives, resulting in less maintainable and unnecessarily verbose code.

dxC#.NET

Limited Presence in Startup and Open-Source Communities

4

C# has less visibility in startup environments and open-source communities compared to JavaScript, Python, or Go, limiting exposure to cutting-edge tools and reducing collaboration opportunities outside enterprise settings.

ecosystemC#.NETJavaScript+2

Empty Collection Allocation Overhead

4

Habitually allocating new empty collections (arrays, lists) instead of using cached singletons causes unnecessary memory pressure and increases Garbage Collection overhead, especially in high-frequency loops.

performanceC#.NET

Dictionary Resizing and Rehashing Performance Impact

4

Failing to preset Dictionary capacity causes expensive Resizing and Rehashing operations when capacity is exceeded, significantly increasing memory allocation overhead if data volume is known.

performanceC#.NET

Confusing .NET and C# naming conventions

4

Microsoft's rebranding of .NET Core to .NET and frequent changes to target framework monikers (e.g., .netcoreapp3.X to .net5+) creates confusion. The naming strategy makes it harder for developers to understand version compatibility, especially when .NET Framework 4.0 still exists alongside .NET 5+.

compatibility.NETC#

C# perceived performance disadvantage vs. lower-level languages

4

In performance-critical contexts requiring ultra-lightweight operation or low-level control, developers perceive C# as having a heavier runtime or memory footprint, pushing them toward languages with lower-level access. This affects adoption in performance-sensitive domains.

performanceC#

Reinventing collections instead of using .NET libraries

4

Developers unnecessarily create custom collection objects when comprehensive built-in options exist in .NET, including specialized collections like persistent tree data structures and priority queues. This wastes time and introduces maintenance burden.

ecosystemC#.NET