.NET icon

dotInsights

Get the latest .NET news every month – all in one place

Keep up to date with the .NET world, and expect tips, tricks, and community information.

By submitting this form, I agree to the JetBrains Privacy Notice

Check out recent editions

dotInsights | February 2025

Did you know? The GC.KeepAlive() method in the .NET Framework is not used to prevent garbage collection of an object for the entire method scope, as you might think. Instead, it explicitly ensures that the object remains referenced at a specific point in the code after it's last used. It’s particularly useful when dealing with unmanaged code or resources where the runtime might release an object too early because no managed references exist for it. Welcome to dotInsights by JetBrains! This newsletter is the home for recent .NET and software development related information. 🌟 Featured Content This month's Featured Content is from Daniel Ward. Daniel is a Microsoft .NET MVP and software consultant at Lean TECHniques. He helps teams deliver high-quality software while adopting lean practices such as effective CI/CD, automated testing, and product management. He co-organizes the San Antonio/Austin .NET User Group and also writes a technical blog. Outside of work, he enjoys playing piano and guitar, swing dancing, and game development. Are your tests actually catching bugs? Having a strong test suite is an important (and necessary, I would argue) part of creating high quality software that’s adaptable to changes. Once you’ve written those tests, though, how do you know they’re actually catching bugs? “Never trust a test you haven’t seen fail” is a great guideline for writing new tests, but what about after that? This is where mutation testing comes in. Simply put, mutation testing is a way to test your tests. In my experience, it’s not a very common strategy among developers – including myself! Before I learned about it, I already felt confident in the way I wrote tests, and didn't want to yet invest the time to learn another testing framework and philosophy. However, once I understood what mutation testing is, and how easy it is to adopt, I became a big supporter of it. Testing your tests To see how simple mutation testing really is, try this: go into one of your projects and change a + operator to a - operator and see if the tests around that code still pass. If they do, that means your tests probably aren't as amazing as they could be. Congratulations, you've just done mutation testing! Of course, manually changing your code over and over like this would be very painful and time consuming, and this is what mutation testing libraries are for. Stryker, one of those libraries, is a popular option for C# and Typescript. Stryker can help you scale this process by automating it, discovering many mutants all at once and then seeing if your tests fail. Mutation testing concepts The core concept is simple: You create “mutants,” which are small changes to your code. The operator change in the example above is an example of a mutant. Then, you try to “kill” those mutants. You do this by running the tests that hit the changed code.  If your tests fail (which they should, because your code is now doing something fundamentally different), then you’ve killed the mutant! Otherwise, the mutant has survived, and you probably need to update your test cases. At the end of the run, you’re given a “mutation score” of 0-100%. This is the number of mutants that were killed compared to the total that were found. Just like with code coverage, a higher number is better. Getting started One of the great things about getting started with mutation testing is that you don't necessarily need to enforce it. Rather than fail the build on a low mutation score, your team may decide to just use it as a soft metric to identify weak tests. Or, you may choose to just run Stryker locally. You'll be able to improve the quality of your tests over time, and your team won’t even know that you’re using Stryker - you’ll just end up with better quality tests as a result! Not only that, but you'll start to get a feel for what does make a strong test case and hopefully create less mutants in the future. In this way, Stryker can also be a great learning tool for creating high quality tests. However you choose to use it, mutation testing is a low effort way to get a lot of value out of your test suite, and I encourage you to try it out.If you’d like to have a practical code example and see Stryker in action, I’ve previously written about mutation testing with Stryker in C# at my blog, and also given a talk on it, which can be found on Youtube. 🔗 Links Here’s the latest from the developer community. Technical Coaching: METRICS Your Developer BOSS Cares About - Emily Bache From Zero to Hero: JetBrains Rider - Dan Clark How to FIX a Spaghetti Code System - Derek Comartin ASP.NET Core Reimagined with htmx Book and Query Projection: Stop Hauling More Data Than You Need! - Chris Woodruff How to Integration Test with the new .NET Testing Framework - Gui Ferreira Everything a .NET Developer Needs to Know in 2025 - Nick Chapsas Why I Use Visual Studio & ReSharper for C++ - Utah Cpp Programmers Exploring the Forwarded Headers Middleware in ASP.NET Core - Tore Nestenius How to Add, Edit, or Remove Hyperlinks in PDFs Using C#? - Chinnu Muniyappan Deploying ASP.NET Core Applications with Docker—Part 1 and Deploying ASP.NET Core Applications with Docker—Part 2- Assis Zang  Func vs. Predicate vs. Expression in C# .Net - Jiyan Epözdemir Evaluating the Parallel Processing of Collections in Microsoft .NET - David McCarter .NET Asynchronous Programming Guidance - David Fowler ASP.NET Core Distributed Tracing - Ricardo Peres Mastering C# – Pattern Matching - Jesse Liberty C# Enum: Definition and Best Practices - Stackify Team AI chatbots vs. AI agents: Which AI tool fits your business needs? - Emily Shin Improving your dev experience with .NET Aspire - Chris Klug at NDC Porto 2024 Using Roslyn to analyze and rewrite code in a solution - Gérald Barré Why Tracebit is written in C# - Sam Cox 🔦 From our .NET Guide Each month we feature tutorials or tips from our .NET Guide. In this tutorial, we will have a look at profiling options in Rider. We will explore profiling modes and their differences, look at Dynamic Program Analysis to do automatic memory profiling. We will then use these to optimize the performance of an existing application, and make it run faster. Profiling in Rider ☕ Coffee Break Take a break to catch some fun social posts. https://youtube.com/shorts/fgWV-EOzLGs?si=aDOrtGLwRFfjlzYR https://youtube.com/shorts/04aHabdYN5M?si=PwSSkAgW7yXmdEyP 🗞️ JetBrains News What’s going on at JetBrains? Check it out here: 🎉 Big News for .NET and Game Devs: Rider Is Now Free for Non-Commercial Use  🎉 New Files View in Solution Explorer The Early Access Program for Rider 2025.1 Is Now Open! The Early Access Program for ReSharper and the .NET Tools 2025.1 Is Here! The ReSharper and Rider 2024.3.4 Bug-Fix Updates Are Now Available Faster Debugging for Massive C++ Projects in Rider ✉️ Comments? Questions? Send us an  email.  Subscribe to dotInsights

dotInsights | November 2024

Wow! It's easy to take the rapid pace of technological advancement for granted, especially given how many of us have been tech-natives for most of our lives. For Mac lovers, Infinite Mac takes a trip across the decades of the 1980s to 2000s through the lens of releases. Experience history all in your browser. Draw an inspiring image in QuickDraw, play a round of Battle Chess, or build your utopia in Civilization and have some tremendous retro-nostalgic fun. Now, let's get Rider and .NET running on these VMs. ? Welcome to dotInsights by JetBrains! This newsletter is the home of recent .NET and software development-related content. 🌟 Featured Content You might have seen us tease a big announcement, and by this time, the cat's out of the bag. We are happy to make JetBrains Rider and WebStorm freely available for non-commercial use cases. Non-commercial use applies to anyone learning new technologies, hobbyists who code in their free time, content creators sharing information on social media, and open-source authors improving the technological landscape. This is fantastic news for .NET, Game, and web developers. We hope this brings the joy of using JetBrains IDEs to more developers. Check out the landing pages of the respective products to learn if your situation qualifies you for the non-commercial license. We hope this change empowers developers everywhere to achieve their dreams and make it happen. With code. 🖇️ Links Here’s the latest from the developer community. .NET Days Online 2024 Recordings - JetBrains The latest in CSS and web UI: I/O 2024 recap - Una Kravetz / Google React 19 RC - The React Team Announcing Void Zero Inc - Evan You Blazor GraphEditor - Kristoffer Strube What's new for .NET MAUI in .NET 9: HybridWebView - Naveenkumar Sanjeevirayan Wolverine 3.0 is Live! - Jeremy Miller ASP.NET Core 9 and IAsyncEnumerable - Tomasz Pęczek Test using OpenTelemetry traces in ASP.NET - Jennifer Moore MassTransit v8.3.0 - RabbitMQ ReplyTo Support - Chris Patterson Browser-based applications with BFF and IdentityServer - Roland Gujit Don't Oversell Ideas: Trunk-based development edition - Oskar Dudycz How's This Website So Fast? - Wes Bos .NET 9 RC2 - The .NET Team Godot Engine SDK Integrations - Godot Team Unity 6 Now Available! - Unity Htmt: .NET templating language that is a superset of HTML/XML and AOT-ready- Asko Nõmm Doom in Space - Ólafur Waage From Hell to Heaven: Porting Doom to MAUI - Nico Vermeir ReSharper Code Inspection Issues Imported into NDepend - NDepend Classic Windows UI for Avalonia - Bartosz Korczyński Visual Studio Solution Persistence (Slnx) - .NET Team Xaml Designer v0.2 - OpenSilver TUnit (AOT-ready Unit Testing Framework) - Thom Hurst Wine takes over ownership of Mono - WineHQ DEF CON 32 - Inside the FBI’s Secret Encrypted Phone Company ‘Anom’ - Joseph Cox CSS Avatar Rhombus - Temani Afif HTML for People - Blake Watson Oxpecker goes full stack! (F#) - Vladimir Shcur Vite, TypeScript, and Vue Components in ASP.NET Core - James White 🔦 From our .NET Guide Each month, we feature tutorials or tips from our .NET Guide. Here is some helpful knowledge worth filing in your brain for future development. ☕ Coffee Break Take a break to catch some fun social posts. I can watch an entire movie without being on my phone https://t.co/C4HOmYD88Q— Emma Berquist (@eeberquist) September 17, 2024 pic.twitter.com/kADya3qVAX— The Dalbo Dog (@Dalbodog) September 7, 2024 change him back i don’t care what he’s done no one deserves this https://t.co/mg6lMt6u07— old tom (@YuckyTom) September 10, 2024 📰 JetBrains News What’s going on at JetBrains? Check it out here: HackerNews Comments on Non-Commercial License Changes Qodana Self-hosted with 40% off - Code analysis and quality control tools Meet Renovated Kotlin Support – K2 Mode: What You Need to Know Ktor 3.0 Is Now Available With New Features and Improved Performance TeamCity Pipelines Is Now Out of Beta Solving Remote Development Challenges With CodeCanvas JetBrains JavaScript Day 2024 on The Primegean ✉️ Comments? Questions? Send us an email. Subscribe to the dotInsights Newsletter

Contact Us

Feel free to suggest an article or become a guest curator for the upcoming dotInsights newsletter. Send us an email at dotnet-advocates@jetbrains.com

This newsletter is hosted by Rachel Appel, a Developer Advocate at JetBrains, with occasional updates from other JetBrains Developer Advocates and guest curators from the wider .NET community.

Rachel Appel

Rachel Appel

Developer Advocate at JetBrains

Pick the right tools

Rider

A fast and powerful cross-platform .NET IDE

ReSharper

Visual Studio extension for .NET developers

dotCover

.NET unit test runner and code coverage tool

dotTrace

.NET performance profiler

dotMemory

.NET memory profiler

dotPeek

.NET decompiler and assembly browser