<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://fouraq.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://fouraq.com/" rel="alternate" type="text/html" /><updated>2026-07-23T17:28:07+00:00</updated><id>https://fouraq.com/feed.xml</id><title type="html">FOURAQ</title><subtitle>.NET insights, productivity tips and experience sharing by Salah.  Analysis, quick notes and magenta-friendly resources.</subtitle><author><name>Salah Fouraq</name></author><entry><title type="html">C# Optimizations That Boosted Our Application</title><link href="https://fouraq.com/csharp/dotnet/2024/11/24/C-Optimizations-That-Boosted-Our-Applications-Performance.html" rel="alternate" type="text/html" title="C# Optimizations That Boosted Our Application" /><published>2024-11-24T00:00:00+00:00</published><updated>2024-11-24T00:00:00+00:00</updated><id>https://fouraq.com/csharp/dotnet/2024/11/24/C#-Optimizations-That-Boosted-Our-Applications-Performance</id><content type="html" xml:base="https://fouraq.com/csharp/dotnet/2024/11/24/C-Optimizations-That-Boosted-Our-Applications-Performance.html"><![CDATA[<p>In the world of software development, performance is often the difference between success and failure. As an experienced developer, I faced a significant challenge when our C# application began to struggle under heavy load. After debugging and optimization, my team and I managed to give a good boost to the application’s performance. 
In this article, I’ll share some easy key optimizations that made this possible, along with some practical examples and explanations.</p>

<h2 id="choosing-the-right-data-structures">Choosing the Right Data Structures</h2>
<p>One of the most significant performance bottlenecks in any application is the choice of data structures. In C#, the right data structure can make all the difference. In some high-performance critical scenarios we can for example use Span<T></T></p>

<h4 id="example-using-span-instead-ofarrays">Example: Using Span<T> Instead of Arrays</T></h4>

<p>Before</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessData</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span> <span class="n">data</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">data</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
    <span class="p">{</span>
        <span class="c1">// Process each byte</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessData</span><span class="p">(</span><span class="n">Span</span><span class="p">&lt;</span><span class="kt">byte</span><span class="p">&gt;</span> <span class="n">data</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">foreach</span> <span class="p">(</span><span class="kt">byte</span> <span class="n">b</span> <span class="k">in</span> <span class="n">data</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// Process each byte</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation">Explanation:</h4>
<p>Span<T> is a stack-allocated struct that provides a memory-safe way to work with contiguous blocks of data (Span<T> is not supposed to replace arrays).
By avoiding the overhead of array bounds checking and unnecessary memory allocations, Span<T> can significantly improve performance, especially in tight loops.</T></T></T></p>

<h2 id="minimizing-garbage-collection-pressure">Minimizing Garbage Collection Pressure</h2>

<p>Garbage collection (GC) is a powerful feature of .NET, but it can introduce significant overhead if not managed properly. In some scenarios when the class is expensive to create or destroy, we can create an object pool by using a ConcurrentBag.
Example: Object Pooling</p>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessMessages</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">message</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Message</span><span class="p">();</span>
        <span class="c1">// Process message</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessMessages</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">var</span> <span class="n">pool</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ObjectPool</span><span class="p">&lt;</span><span class="n">Message</span><span class="p">&gt;(()</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="nf">Message</span><span class="p">());</span>
    <span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">message</span> <span class="p">=</span> <span class="n">pool</span><span class="p">.</span><span class="nf">Get</span><span class="p">();</span>
        <span class="c1">// Process message</span>
        <span class="n">pool</span><span class="p">.</span><span class="nf">Return</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-1">Explanation:</h4>
<p>In C# Object Pooling reuses objects instead of creating new ones, reducing the frequency of garbage collection.
We avoid the overhead of constant allocations and deallocations by reusing Message objects.</p>

<h2 id="algorithmic-optimizations">Algorithmic Optimizations</h2>
<p>Sometimes, the biggest performance gains come from rethinking your algorithms. </p>

<h4 id="example-replacing-linear-search-with-binarysearch">Example: Replacing Linear Search with Binary Search</h4>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">bool</span> <span class="nf">Contains</span><span class="p">(</span><span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">list</span><span class="p">,</span> <span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">item</span> <span class="k">in</span> <span class="n">list</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">item</span> <span class="p">==</span> <span class="k">value</span><span class="p">)</span>
            <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">bool</span> <span class="nf">Contains</span><span class="p">(</span><span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">list</span><span class="p">,</span> <span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">list</span><span class="p">.</span><span class="nf">Sort</span><span class="p">();</span>
    <span class="k">return</span> <span class="n">list</span><span class="p">.</span><span class="nf">BinarySearch</span><span class="p">(</span><span class="k">value</span><span class="p">)</span> <span class="p">&gt;=</span> <span class="m">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-2">Explanation:</h4>
<p>List<T>.BinarySearch(T) Method uses a binary search algorithm to locate a specific element in the sorted List<T> or a portion of it.
Binary Search has a time complexity of O(log n), whereas linear search is O(n).
By sorting the list once and using binary search, we significantly reduce the time complexity for multiple searches.</T></T></p>

<h2 id="leveraging-parallel-processing">Leveraging Parallel Processing</h2>
<p>Modern CPUs have multiple cores, and C# provides powerful tools to take advantage of them.</p>

<h4 id="example-parallel-linqplinq">Example: Parallel LINQ (PLINQ)</h4>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">results</span> <span class="p">=</span> <span class="n">data</span><span class="p">.</span><span class="nf">Select</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="nf">Process</span><span class="p">(</span><span class="n">x</span><span class="p">)).</span><span class="nf">ToList</span><span class="p">();</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">results</span> <span class="p">=</span> <span class="n">data</span><span class="p">.</span><span class="nf">AsParallel</span><span class="p">().</span><span class="nf">Select</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="nf">Process</span><span class="p">(</span><span class="n">x</span><span class="p">)).</span><span class="nf">ToList</span><span class="p">();</span>
</code></pre></div></div>

<h4 id="explanation-3">Explanation:</h4>
<p>PLINQ automatically parallelizes LINQ queries, distributing the workload across multiple cores.
This can lead to significant performance improvements for CPU-bound operations.</p>

<h2 id="caching-and-avoiding-redundant-computations">Caching and Avoiding Redundant Computations</h2>
<p>Caching is a powerful technique to avoid redundant computations.</p>

<h4 id="example-memoization-with-dictionary-cache">Example: Memoization with Dictionary Cache</h4>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">int</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="p">&lt;=</span> <span class="m">1</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
    <span class="k">return</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="p">-</span> <span class="m">1</span><span class="p">)</span> <span class="p">+</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="p">-</span> <span class="m">2</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="n">cache</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;();</span>
<span class="k">public</span> <span class="kt">int</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="p">&lt;=</span> <span class="m">1</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">cache</span><span class="p">.</span><span class="nf">ContainsKey</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
    <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="p">-</span> <span class="m">1</span><span class="p">)</span> <span class="p">+</span> <span class="nf">Fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="p">-</span> <span class="m">2</span><span class="p">);</span>
    <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="p">=</span> <span class="n">result</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-4">Explanation:</h4>
<p>Memoization stores the results of expensive function calls and returns the cached result when the same inputs occur again.
By caching Fibonacci numbers, we reduce the time complexity from exponential to linear.</p>

<h2 id="avoiding-unnecessary-io-operations">Avoiding Unnecessary I/O Operations</h2>
<p>I/O operations, such as file access or network calls, are often the biggest bottlenecks in an application.</p>

<h4 id="example-minimizing-databasecalls">Example: Minimizing Database Calls</h4>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">ids</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
<span class="p">{</span>
    <span class="kt">var</span> <span class="n">user</span> <span class="p">=</span> <span class="nf">GetUserFromDatabase</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="c1">// Process user</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">users</span> <span class="p">=</span> <span class="nf">GetUsersFromDatabase</span><span class="p">(</span><span class="n">ids</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">user</span> <span class="k">in</span> <span class="n">users</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Process user</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-5">Explanation:</h4>
<p>Batching database calls reduces the number of round trips to the database, significantly improving performance.
By fetching all users in a single call, we minimize the I/O overhead.</p>

<h2 id="using-structs-instead-of-classes-for-small-datatypes">Using Structs Instead of Classes for Small Data Types</h2>
<p>Value types (structs) are stored on the stack, which can be more efficient than reference types (classes) stored on the heap.</p>

<h4 id="example-using-structs-for-smalldata">Example: Using Structs for Small Data</h4>

<p>Before:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Point</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">X</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Y</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">struct</span> <span class="nc">Point</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">X</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Y</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-6">Explanation:</h4>
<p>Structs are value types and are allocated on the stack, which is faster and uses less memory for small data types.
By converting Point to a struct, we reduce the overhead of object creation and garbage collection.</p>

<h2 id="profiling-and-benchmarking">Profiling and Benchmarking</h2>
<p>Before making any optimizations, it’s crucial to identify the actual bottlenecks in your application.</p>

<h4 id="example-using-benchmarknet">Example: Using Benchmark.NET</h4>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">MemoryDiagnoser</span><span class="p">]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">MyBenchmarks</span>
<span class="p">{</span>
    <span class="p">[</span><span class="n">Benchmark</span><span class="p">]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">MyMethod</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="c1">// Code to be benchmarked</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="explanation-7">Explanation:</h4>
<p>Benchmark.NET is a powerful tool for measuring the performance of your code.
By diagnosing memory usage and execution time, you can pinpoint the areas that need optimization.</p>

<h2 id="conclusion">Conclusion</h2>
<p>As a developer, you can boost the performance of your C# application by applying the right strategies. In this article, I explained how it’s important to always try to choose the right data structure, to use wisely parallel processing, and to avoid doing redundant computations. Optimization is not just about making code run faster, it’s about making intelligent decisions that balance performance, readability, and maintainability.</p>]]></content><author><name>Salah Fouraq</name></author><category term="csharp" /><category term="dotnet" /><category term="csharp" /><category term="dotnet" /><summary type="html"><![CDATA[In the world of software development, performance is often the difference between success and failure. As an experienced developer, I faced a significant challenge when our C# application began to struggle under heavy load. After debugging and optimization, my team and I managed to give a good boost to the application’s performance.  In this article, I’ll share some easy key optimizations that made this possible, along with some practical examples and explanations.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://fouraq.com/assets/images/csharp_optimizations_cover.png" /><media:content medium="image" url="https://fouraq.com/assets/images/csharp_optimizations_cover.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Use .http files in Visual Studio to make HTTP requests</title><link href="https://fouraq.com/visual-studio/2024/06/01/Making-HTTP-Requests-Directly-from-Visual-Studio.html" rel="alternate" type="text/html" title="Use .http files in Visual Studio to make HTTP requests" /><published>2024-06-01T00:00:00+00:00</published><updated>2024-06-01T00:00:00+00:00</updated><id>https://fouraq.com/visual-studio/2024/06/01/%20Making-HTTP-Requests-Directly-from-Visual-Studio</id><content type="html" xml:base="https://fouraq.com/visual-studio/2024/06/01/Making-HTTP-Requests-Directly-from-Visual-Studio.html"><![CDATA[<p>If you’re like me tired of switching between your IDE and external tools like Postman to test your APIs? 
<a href="https://learn.microsoft.com/en-us/aspnet/core/test/http-files?view=aspnetcore-8.0">Visual Studio 2022</a> has a built-in solution that can revolutionize your development workflow <em>direct HTTP request support</em>. 
This feature allows you to craft and send HTTP requests right from your IDE, making your development and debugging processes more easy.</p>

<h2 id="why-make-requests-within-visual-studio-2022">Why Make Requests Within Visual Studio 2022?</h2>

<p>API testing is crucial for ensuring your development aligns with specifications.  While popular tools like Postman offer extensive features, they can be overkill for basic tasks. Why use a tank when a salt gun can do the job? 
You can create a simple HTTP request files stored in your code repository to efficiently test yourAPIs.  Thoses files integrate seamlessly with your development workflow and enable effortless sharing across your entire team.</p>

<h3 id="the-benefits-are">The benefits are</h3>

<ul>
  <li>Simplified Workflow: No more tab-switching madness. Keep your API tests and code in the same environment.</li>
  <li>Integrated Debugging: Leverage Visual Studio’s powerful debugging tools to inspect requests, responses, and variables for faster troubleshooting.</li>
  <li>Project Context: Easily reference project variables, secrets, and settings within your HTTP requests.</li>
  <li>Collaboration: Share and version control your .http files along with your codebase.</li>
</ul>

<h2 id="how-to-get-started">How to Get Started:</h2>
<ol>
  <li>
    <p>Create an <code class="language-plaintext highlighter-rouge">.http</code> File: Right-click on your project in Solution Explorer, choose “Add” -&gt; “New Item”, and select “HTTP File” from the list.</p>
  </li>
  <li>
    <p>Construct Your Request: Use standard HTTP syntax to define the method (GET, POST, PUT, DELETE), URL, headers, and request body (if needed).</p>
  </li>
  <li>
    <p>Leverage Variables: Use the @ symbol to create variables for dynamic values (e.g., base URLs, API keys). You can even use .env files for environment-specific configurations.</p>
  </li>
  <li>
    <p>Send &amp; Analyze: Click the “Send Request” button (green arrow) or press Ctrl+Alt+R to send the request. The response will appear neatly formatted in a separate pane, ready for analysis.</p>
  </li>
  <li>
    <p>Examples</p>
  </li>
</ol>

<ul>
  <li>Fetching User Data (GET)</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>HTTP
GET https://api.example.com/users/123
Authorization: Bearer YOUR_API_TOKEN 
</code></pre></div></div>
<ul>
  <li>Creating a New Resource (POST)</li>
</ul>

<pre><code class="language-HTTP">@apiUrl = https://api.example.com

POST /products 
Content-Type: application/json

{
    "name": "Awesome Product",
    "price": 49.99
}
</code></pre>

<h3 id="beyond-the-basics">Beyond the Basics:</h3>
<ul>
  <li>
    <p>Endpoints Explorer: Visual Studio 2022’s Endpoints Explorer (currently in preview) auto-discovers your API endpoints, making it easier to get started with testing.</p>
  </li>
  <li>
    <p>Secrets Management: Securely store API keys and other sensitive data using Visual Studio’s Secret Manager.</p>
  </li>
  <li>
    <p>Environments: 
Create and switch between environments (dev, staging, production) with different configuration settings using .env files.
<img src="/assets/images/http-env-visualtudio.jpeg" alt="Select enviroment for http requests" /></p>
  </li>
</ul>

<p>Effective API testing doesn’t have to break the bank.  While many tools boast comprehensive capabilities, they often come with hefty price tags and limitations on team collaboration.</p>

<p>By using simple HTTP request files within your codebase, you can achieve robust API testing without the unnecessary expense.  This practical approach not only saves your budget but also fosters better collaboration by allowing seamless sharing across your entire development team.</p>]]></content><author><name>Salah Fouraq</name></author><category term="visual-studio" /><category term="visual-studio" /><category term="apis" /><summary type="html"><![CDATA[If you’re like me tired of switching between your IDE and external tools like Postman to test your APIs? Visual Studio 2022 has a built-in solution that can revolutionize your development workflow direct HTTP request support. This feature allows you to craft and send HTTP requests right from your IDE, making your development and debugging processes more easy.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://fouraq.com/assets/images/http_cover.jpg" /><media:content medium="image" url="https://fouraq.com/assets/images/http_cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">.NET API Guide: Returning Enum Values as Strings</title><link href="https://fouraq.com/csharp/2024/05/29/net-api-guide-returning-enum-values-as-strings.html" rel="alternate" type="text/html" title=".NET API Guide: Returning Enum Values as Strings" /><published>2024-05-29T00:00:00+00:00</published><updated>2024-05-29T00:00:00+00:00</updated><id>https://fouraq.com/csharp/2024/05/29/net-api-guide-returning-enum-values-as-strings</id><content type="html" xml:base="https://fouraq.com/csharp/2024/05/29/net-api-guide-returning-enum-values-as-strings.html"><![CDATA[<p>I was recently asked to return an enum as a string instead of an int from an API call. At first, I considered how to override the framework’s behavior, but after some research, I found the solution was easier than I expected.
The easiest way to resolve this is by adding a JsonStringEnumConverter() in the .AddJsonOptions() method of the Startup class:</p>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre><span class="p">.</span><span class="nf">AddNewtonsoftJson</span><span class="p">(</span><span class="n">options</span> <span class="p">=&gt;</span>
     <span class="p">{</span>
         <span class="n">options</span><span class="p">.</span><span class="n">SerializerSettings</span><span class="p">.</span><span class="n">Converters</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Newtonsoft</span><span class="p">.</span><span class="n">Json</span><span class="p">.</span><span class="n">JsonConverter</span><span class="p">&gt;</span> <span class="p">{</span> <span class="k">new</span> <span class="nf">StringEnumConverter</span><span class="p">()</span> <span class="p">};</span>
     <span class="p">})</span>
     <span class="p">.</span><span class="nf">AddJsonOptions</span><span class="p">(</span><span class="n">options</span> <span class="p">=&gt;</span>
     <span class="p">{</span>
         <span class="n">options</span><span class="p">.</span><span class="n">JsonSerializerOptions</span><span class="p">.</span><span class="n">Converters</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="nf">JsonStringEnumConverter</span><span class="p">());</span>
     <span class="p">});</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>The first part adds a StringEnumConverter to the SerializerSettings.Converters list for Newtonsoft.Json. The second part adds a JsonStringEnumConverter to the JsonSerializerOptions.Converters list for the built-in JSON serializer. This ensures that enums are serialized as strings instead of integers.</p>]]></content><author><name>Salah Fouraq</name></author><category term="csharp" /><category term="csharp" /><category term="swagger" /><category term="dotnet" /><category term="guide" /><summary type="html"><![CDATA[I was recently asked to return an enum as a string instead of an int from an API call. At first, I considered how to override the framework’s behavior, but after some research, I found the solution was easier than I expected. The easiest way to resolve this is by adding a JsonStringEnumConverter() in the .AddJsonOptions() method of the Startup class:]]></summary></entry><entry><title type="html">Error Handling in .NET: Exceptions or Results?</title><link href="https://fouraq.com/csharp/dotnet/2024/05/01/Error-Handling-in-NET-Exceptions-or-Results.html" rel="alternate" type="text/html" title="Error Handling in .NET: Exceptions or Results?" /><published>2024-05-01T00:00:00+00:00</published><updated>2024-05-01T00:00:00+00:00</updated><id>https://fouraq.com/csharp/dotnet/2024/05/01/Error-Handling-in-NET-Exceptions-or-Results</id><content type="html" xml:base="https://fouraq.com/csharp/dotnet/2024/05/01/Error-Handling-in-NET-Exceptions-or-Results.html"><![CDATA[<p>After years of experience working on diverse software projects, I’ve observed a concerning trend: developers often overuse exceptions for error handling. While exceptions have their place in certain situations, I believe that well-designed code should be capable of managing most scenarios without resorting to exceptions. In my view, truly clean and robust code should handle various cases and potential issues gracefully, with exceptions reserved for exceptional circumstances.</p>

<h2 id="exceptions">Exceptions</h2>

<p>Exceptions are most effectively employed for handling unexpected errors that the program cannot gracefully manage through normal control flow. They should be reserved for serious issues that demand immediate attention and typically necessitate halting the program’s execution. However, their use should be judicious and purposeful.</p>

<h3 id="pros">Pros</h3>
<ul>
  <li>Clear indication of critical failures.</li>
  <li>Simplifies control flow by separating error handling from regular logic.</li>
</ul>

<h3 id="cons">Cons</h3>
<ul>
  <li>Can be overused, leading to cluttered code.</li>
  <li>My cause performance overhead due to stack unwinding.</li>
</ul>

<h3 id="example-with-exceptions">Example with Exceptions</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">Order</span> <span class="n">order</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">try</span>
    <span class="p">{</span>
        <span class="nf">ValidateOrder</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
        <span class="nf">SaveOrder</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">catch</span> <span class="p">(</span><span class="n">ValidationException</span> <span class="n">ex</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Validation failed: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"An unexpected error occurred: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">private</span> <span class="k">void</span> <span class="nf">ValidateOrder</span><span class="p">(</span><span class="n">Order</span> <span class="n">order</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">order</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
        <span class="k">throw</span> <span class="k">new</span> <span class="nf">ValidationException</span><span class="p">(</span><span class="s">"Order cannot be null."</span><span class="p">);</span>
    <span class="c1">// Additional validation logic...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It’s crucial to distinguish between exceptional conditions and expected error states. For instance, a file not found when opening a configuration file might be an exception, but a file not found when searching for user-uploaded content is likely an expected possibility that should be handled without throwing an exception.
By adhering to these principles, developers can create more robust, maintainable, and performant code that clearly separates normal operations from truly exceptional circumstances.</p>

<h2 id="result--returning-values-instead-of-exception">Result : returning values instead of exception</h2>

<p>A superior alternative to using exceptions is implementing the Result pattern. This approach leads to more robust and maintainable code for several compelling reasons:</p>
<ul>
  <li>Explicit error handling: Results force developers to consider and handle potential failure cases explicitly.</li>
  <li>Better performance: Creating and throwing exceptions can be costly in terms of performance.</li>
  <li>Improved readability: The code’s intent becomes clearer when success and failure paths are explicitly defined.</li>
  <li>Type safety: Results can leverage the type system to ensure errors are handled appropriately.</li>
</ul>

<h3 id="implementation-example-">Implementation example :</h3>
<p>Let’s write the previous code using result patter :</p>

<p>Result is a generic class that encapsulates the success or failure of an operation, along with either the result value or an error message.</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Result</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsSuccess</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">T</span> <span class="n">Value</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Error</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">private</span> <span class="nf">Result</span><span class="p">(</span><span class="kt">bool</span> <span class="n">isSuccess</span><span class="p">,</span> <span class="n">T</span> <span class="k">value</span><span class="p">,</span> <span class="kt">string</span> <span class="n">error</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">IsSuccess</span> <span class="p">=</span> <span class="n">isSuccess</span><span class="p">;</span>
        <span class="n">Value</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="n">Error</span> <span class="p">=</span> <span class="n">error</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="nf">Success</span><span class="p">(</span><span class="n">T</span> <span class="k">value</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="k">true</span><span class="p">,</span> <span class="k">value</span><span class="p">,</span> <span class="k">null</span><span class="p">);</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="nf">Failure</span><span class="p">(</span><span class="kt">string</span> <span class="n">error</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="k">false</span><span class="p">,</span> <span class="k">default</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>ProcessOrder method: Now returns a Result<Order> instead of using exceptions. It explicitly handles failures from both validation and saving steps.
ValidateOrder and SaveOrder methods are now returning Result<bool> instead of throwing exceptions. This makes the possibility of failure explicit in their signatures :</bool></Order></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">OrderProcessor</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">Order</span><span class="p">&gt;</span> <span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">Order</span> <span class="n">order</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">validationResult</span> <span class="p">=</span> <span class="nf">ValidateOrder</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(!</span><span class="n">validationResult</span><span class="p">.</span><span class="n">IsSuccess</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Validation failed: </span><span class="p">{</span><span class="n">validationResult</span><span class="p">.</span><span class="n">Error</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
            <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">Order</span><span class="p">&gt;.</span><span class="nf">Failure</span><span class="p">(</span><span class="n">validationResult</span><span class="p">.</span><span class="n">Error</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kt">var</span> <span class="n">saveResult</span> <span class="p">=</span> <span class="nf">SaveOrder</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(!</span><span class="n">saveResult</span><span class="p">.</span><span class="n">IsSuccess</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"An unexpected error occurred: </span><span class="p">{</span><span class="n">saveResult</span><span class="p">.</span><span class="n">Error</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
            <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">Order</span><span class="p">&gt;.</span><span class="nf">Failure</span><span class="p">(</span><span class="n">saveResult</span><span class="p">.</span><span class="n">Error</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="n">Order</span><span class="p">&gt;.</span><span class="nf">Success</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;</span> <span class="nf">ValidateOrder</span><span class="p">(</span><span class="n">Order</span> <span class="n">order</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">order</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;.</span><span class="nf">Failure</span><span class="p">(</span><span class="s">"Order cannot be null."</span><span class="p">);</span>

        <span class="c1">// Additional validation logic...</span>
        <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;.</span><span class="nf">Success</span><span class="p">(</span><span class="k">true</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;</span> <span class="nf">SaveOrder</span><span class="p">(</span><span class="n">Order</span> <span class="n">order</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">try</span>
        <span class="p">{</span>
            <span class="c1">// Simulating saving the order to a database</span>
            <span class="c1">// In a real scenario, this might involve a database call</span>
            <span class="c1">// that could fail for various reasons</span>
            <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;.</span><span class="nf">Success</span><span class="p">(</span><span class="k">true</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">Result</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;.</span><span class="nf">Failure</span><span class="p">(</span><span class="s">$"Failed to save order: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>

<p>Instead of using try-catch blocks, we now check the IsSuccess property of the returned Results. This makes the error handling more explicit and easier to follow.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Usage example</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">ProcessOrderExample</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">var</span> <span class="n">processor</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">OrderProcessor</span><span class="p">();</span>
    <span class="kt">var</span> <span class="n">order</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Order</span><span class="p">();</span> <span class="c1">// Assume this is properly initialized</span>

    <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="n">processor</span><span class="p">.</span><span class="nf">ProcessOrder</span><span class="p">(</span><span class="n">order</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">IsSuccess</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Order processed successfully."</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Order processing failed: </span><span class="p">{</span><span class="n">result</span><span class="p">.</span><span class="n">Error</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This approach provides several benefits:</p>

<ul>
  <li>It’s more explicit about what can go wrong and where.</li>
  <li>It avoids the performance overhead of throwing and catching exceptions.</li>
  <li>It makes the code easier to reason about, as the flow is more linear and predictable.</li>
  <li>It encourages handling of all possible outcomes, as the compiler will warn you if you don’t check the Result.</li>
</ul>

<h2 id="summary">Summary</h2>
<p>Effective error handling is crucial for developing robust and maintainable applications. As developers, we should anticipate potential failures and address them at the earliest possible stage in our code. This proactive approach will not only improves code quality but also enhances overall application reliability.</p>]]></content><author><name>Salah Fouraq</name></author><category term="csharp" /><category term="dotnet" /><category term="csharp" /><category term="dotnet" /><summary type="html"><![CDATA[After years of experience working on diverse software projects, I’ve observed a concerning trend: developers often overuse exceptions for error handling. While exceptions have their place in certain situations, I believe that well-designed code should be capable of managing most scenarios without resorting to exceptions. In my view, truly clean and robust code should handle various cases and potential issues gracefully, with exceptions reserved for exceptional circumstances.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://fouraq.com/assets/images/error_handling_in_dot_net_cover.png" /><media:content medium="image" url="https://fouraq.com/assets/images/error_handling_in_dot_net_cover.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>