<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suneeh</title>
    <description>The latest articles on DEV Community by Suneeh (@suneeh).</description>
    <link>https://dev.to/suneeh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1000652%2F9234d6e2-4038-4c6b-8eb2-dae9ee8b846b.jpg</url>
      <title>DEV Community: Suneeh</title>
      <link>https://dev.to/suneeh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suneeh"/>
    <language>en</language>
    <item>
      <title>The Secret Weapon Against API Abuse: The Power of Rate Limiting</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Sat, 11 Jan 2025 22:16:25 +0000</pubDate>
      <link>https://dev.to/suneeh/the-secret-weapon-against-api-abuse-the-power-of-rate-limiting-3kpa</link>
      <guid>https://dev.to/suneeh/the-secret-weapon-against-api-abuse-the-power-of-rate-limiting-3kpa</guid>
      <description>&lt;h2&gt;
  
  
  I. Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is Rate Limiting?
&lt;/h3&gt;

&lt;p&gt;Rate limiting is a strategy for limiting network traffic that is very commonly used on &lt;em&gt;free to use&lt;/em&gt; APIs. It puts a limit on how often someone can call an API within a certain time frame. This way you can protect against certain kinds of malicious or abusive intentions and activities as well as you protect your hardware or costs of resources!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Why is Rate Limiting Crucial for APIs?
&lt;/h3&gt;

&lt;p&gt;These days most APIs are hosted in the Cloud and therefore are connected to monthly costs depending on how much resources they use. Rate Limiting can help you to reduce excessive or even abusive usage of your resources. It helps you to keep the costs low as well as ensuring uptime of your API / service. It sometimes even has security features to rate limit requests - for instance, rate limiting the login requests for your application to prevent brute-force attacks. But don't just lock down the entire login service, just because there are lots of users trying to login at the same time - find the correct way of how to rate limit!&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Types of Rate Limiting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Request-Based Rate Limiting
&lt;/h3&gt;

&lt;p&gt;Just counting the requests per minute up to a certain limit will restrict your API in general - which is more of a self defense system. It protects your resources, while ignoring the user experience completely. Attackers could just send a few hundreds of requests per minute and DoS all your users by doing so. This is the last resort, and should most likely never be used in production ever.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. IP-Based Rate Limiting
&lt;/h3&gt;

&lt;p&gt;To not lock out all users, you could track IP addresses to find out who is spamming requests against your API. This is the first idea that most developers have when they need to find out who is calling their API - and let me tell you: It's not the best one! An IP is a good indicator, but might be misleading! While sometimes, this is all we know of our callers it is very much possible for multiple devices to call from the same IP address! Especially if you have various callers sitting in the same office, household or network.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. User-Based Rate Limiting (or API-Key)
&lt;/h3&gt;

&lt;p&gt;If your API is restricted by a login anyways, another possibility is to track the user specifically after they logged in successfully. This way you can target the very person that is spamming the API and there is no more collateral damage for other users. This also works great with API-Key restricted endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Limiting Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.Fixed Window
&lt;/h3&gt;

&lt;p&gt;Let's talk about implementations. The 1st idea most developers have is to set a limit of e.g. 120 per minute. They will count up to 100 and reset the counter whenever 60 seconds have passed. This is called &lt;em&gt;Fixed Window&lt;/em&gt; Limiting naturally. While this is certainly a way of handling excessive requests, there are other solutions that might fit your use case a little better.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sliding Window
&lt;/h3&gt;

&lt;p&gt;For example if you want to keep the "120 Requests per 1 minute" mindset, you could also define smaller intervals to replenish the counter. Let's break the minute into 3x 20 second segments that replenish however many requests were made exactly 60 seconds before.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Available&lt;/th&gt;
&lt;th&gt;Taken&lt;/th&gt;
&lt;th&gt;Recycled from expired&lt;/th&gt;
&lt;th&gt;Carry over&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Token Bucket
&lt;/h3&gt;

&lt;p&gt;Very similar to the sliding window variant, the token bucket limit will not replenish exactly the requests you made last minute, but rather a fixed value. So basically every 20 seconds you would get up to 20 new requests credited, but never more than the initial limit of 120 requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Concurrency
&lt;/h3&gt;

&lt;p&gt;Sometimes the pure amount of requests is not the main issue, but rather some synchronous operations that might get problematic if too many requests hit the same code multiple times within a very short time. With the concurrency limit you can ensure that there are never more than X requests handled at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Handling Requests
&lt;/h3&gt;

&lt;p&gt;Keep your main focus on the user experience. Everybody understands that your system and infrastructure is valuable and worth protecting but please be graceful with your users and handle requests in a proper way. There are two very important things users should know when their request is not being processed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send them a HTTP response code of 429 - Too Many Requests&lt;/li&gt;
&lt;li&gt;There is a HTTP Header "Retry-After" that you should set to the window defined for your app.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Monitor and Adjust
&lt;/h3&gt;

&lt;p&gt;Check the state of your API regularly and consider the defined limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the window too small or too big?&lt;/li&gt;
&lt;li&gt;Is the limit still appropriate?&lt;/li&gt;
&lt;li&gt;Is the limit hitting the right people / routes on your API?&lt;/li&gt;
&lt;li&gt;Is the method of limiting useful to you?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Documentation
&lt;/h3&gt;

&lt;p&gt;A good documentation on your API containing the rate limiting strategy is key for your users. It also encourages them to build their consuming system in a friendly way, to either not run into the limits or at least stop spamming, when the limit hits them. A reference to the “Retry-After” header and the units used in it is also very helpful to build a nice consuming system.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Conclusion
&lt;/h2&gt;

&lt;p&gt;Now you know the most important things about rate limiting. I suggest you start implementing them into your next project, or add your knowledge to an existing API of yours to gather some hands-on experience. There are many frameworks that handle rate limiting for you, but sometimes they are not 100% fitting your use case. In fact I got into learning about rate limiting because the .NET Library could not do what I needed, and I had to go down that rabbit hole. &lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why I un-discontinued my Project</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Sat, 24 Aug 2024 19:19:19 +0000</pubDate>
      <link>https://dev.to/suneeh/why-i-un-discontinued-my-project-8i2</link>
      <guid>https://dev.to/suneeh/why-i-un-discontinued-my-project-8i2</guid>
      <description>&lt;h2&gt;
  
  
  The Project
&lt;/h2&gt;

&lt;p&gt;So some of you might know, that I started a small and simple project end of last year in my free time. I started a small webApp written in Angular to play around with the new Angular Signals and some other new features. The topic and purpose of the app was to be a &lt;strong&gt;LOLDLE&lt;/strong&gt; clone (basically a "Guess the character" of Riot Games' &lt;em&gt;League of Legends&lt;/em&gt; game) with a small twist - you can play as often as you want. The original game only has &lt;strong&gt;one&lt;/strong&gt; game per day, but it is the same for any person playing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I stopped it
&lt;/h2&gt;

&lt;p&gt;First of all the app was working as intended which is a neck breaker for most apps (right?). I had a blast during the bad weather days and got my hands onto some new features and gained some experience in deploying Angular apps as well - which wasn't even on my list. &lt;/p&gt;

&lt;p&gt;So it was time to wrap up and &lt;strong&gt;finalize&lt;/strong&gt; the page. Fix the UI / UX to be somewhat pleasing and show it to some friends. When I showed it to my first friend, they instantly typed in the freshly released champion that just came out and I then realized, that it does not exist in my data-set. &lt;/p&gt;

&lt;p&gt;When I started the app back in October '23 I had an API that cost money after some limit threshold, so I saved the data needed back then and used it for my app locally, but I never refreshed the data ever since. &lt;/p&gt;

&lt;p&gt;So I sat back on my machine, trying to query said API - 404. The API changed? I checked their website to find out that it was discontinued. I quickly checked for other APIs but sadly didn't find something similar. &lt;/p&gt;

&lt;p&gt;I thought about this problem for some days and decided that it would be too much work to maintain/extend this app. Not only where there about 15 Champions missing (the API had some old data as well - but I found that out just now) but also it was missing information about Champions that it showed. To be completely honest, 168 Champions with roughly 10 pieces of data would probably take me a day to recreate, but I was &lt;strong&gt;frustrated&lt;/strong&gt; and I pushed the &lt;code&gt;last commit&lt;/code&gt; in March of this year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I continued
&lt;/h2&gt;

&lt;p&gt;Well I still liked the game and honestly I felt stupid. How could the original Loldle get the data somehow and I couldn't? I checked the site over and over again and felt bad about it. I checked the http requests that it made to the server and didn't understand where the data came from, either they obfuscated it in a way that I did not see or there was some magic happening.&lt;/p&gt;

&lt;p&gt;Magic doesn't fool you twice. Sometimes it does, but if you get the chance to look at it over and over again you might find out how it's done. So I sat there, and broke it down into little pieces that my Girlfriend would understand about this problem. I told her about Frontend, Backend, Client, Server, Requests and how Websites normally work. And very quickly she said: "If there is no Request made, then the Frontend needs to know about it already, right?" - Right !&lt;/p&gt;

&lt;p&gt;This phenomenon is called "Rubberducking". Try to break it down into reasonable sized portions and talk about this with a rubber duck (or to anything - a Girlfriend seems to do the Trick as well). &lt;/p&gt;

&lt;p&gt;So I checked the Frontend. Opening the DevTools of my Browser, this time not navigating to the Console or Network tab, but the Debugger. This tab also shows downloaded .html and .js files and their content. I found a file that contained the names of the champions - all 167 of them! (Yes the original Loldle is a bit slow when it comes to new releases, and so they didn't pick up the champion of July). &lt;/p&gt;

&lt;p&gt;Not only did I find the translations of said champions, but also the data items I needed: Gender, Race, Region and Release Date.&lt;/p&gt;

&lt;p&gt;So I copied that huge array, together with the data I already had, it was easy to create a little script that merged those arrays into one - et voila !&lt;/p&gt;

&lt;p&gt;Quickly added 2 new features and updated the Angular version as well - and here we are. Looking at the latest version with the most up to date info.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help
&lt;/h2&gt;

&lt;p&gt;If you read this post and found it amusing, inspiring or even interesting, it would mean a lot to me hear feedback.&lt;br&gt;
Leave a Comment here or checkout the &lt;a href="https://github.com/Suneeh/LoldleUnlimited" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt; or my &lt;a href="https://loldle.suneeh.de/" rel="noopener noreferrer"&gt;Lodle App&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;p&gt;I lost my data because the API I used was discontinued. &lt;br&gt;
I didn't find a new one.&lt;br&gt;
I Rubberducked my Girlfried to find out that the data was exactly where I was looking for 5 months. &lt;br&gt;
I used the new Data and updated my App. &lt;br&gt;
Now go read the whole thing and checkout this link and roast me for it: &lt;a href="https://github.com/Suneeh/LoldleUnlimited" rel="noopener noreferrer"&gt;https://github.com/Suneeh/LoldleUnlimited&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>sideprojects</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Angular + Auth0 + .NET</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Fri, 21 Jun 2024 17:33:12 +0000</pubDate>
      <link>https://dev.to/suneeh/angular-auth0-net-10i3</link>
      <guid>https://dev.to/suneeh/angular-auth0-net-10i3</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;As some of you might know, I am on my road to become a senior software engineer. To do so, I follow a backend roadmap that will teach me everything I need to know about .NET, Databases and some deployment as well. Since I currently work as Fullstack Software Engineer - I wanted to start a frontend project along side with it.&lt;/p&gt;

&lt;p&gt;Since Webshops were the biggest part of my training, the choice for the topic of the Angular frontend became very obvious. Today I want to share my first steps and future goals of this series.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖥️ Backend
&lt;/h2&gt;

&lt;p&gt;The backend will consist of the new &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-8.0" rel="noopener noreferrer"&gt;minimal APIs of .NET&lt;/a&gt;. You can see my introduction &lt;a href="https://dev.to/suneeh/net-fundamentals-minimal-api-1h9"&gt;here&lt;/a&gt;. A &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgeSQL Database&lt;/a&gt;, EfCore and some &lt;a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete" rel="noopener noreferrer"&gt;CRUD&lt;/a&gt; endpoints were created super quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 Frontend
&lt;/h2&gt;

&lt;p&gt;I created a new Angular App using all the newest features: &lt;a href="https://angular.dev/guide/signals" rel="noopener noreferrer"&gt;Signals&lt;/a&gt;, the &lt;a href="https://angular.dev/guide/templates/control-flow" rel="noopener noreferrer"&gt;new control flow syntax&lt;/a&gt;, &lt;a href="https://blog.angular-university.io/angular-standalone-components/" rel="noopener noreferrer"&gt;standalone components&lt;/a&gt; and all that. I started out with a simple "shell" component, that will be the main "frame" of the website - it holds items like the side-nav, header, footer and a router-outlet for the content of the current page. Basically this is ALWAYS shown, to be consistent with my navigation and over all look and feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Auth0 and RBAC (Role based Access Control)
&lt;/h2&gt;

&lt;p&gt;Today I started using &lt;a href="https://auth0.com/" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt; - a free Identity Provider by &lt;a href="https://www.okta.com/" rel="noopener noreferrer"&gt;okta&lt;/a&gt;. They have a nice free plan that is very much enough for my little project and can be upgraded afterwards, if this project will ever go live and commercial. See my progress &lt;a href="https://github.com/Suneeh/webshop/commit/b6a0d3b83d886e50366ea8c68361583d4dfbb33c" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Auth0 has a nice &lt;a href="https://www.npmjs.com/package/@auth0/auth0-angular" rel="noopener noreferrer"&gt;Angular npm package&lt;/a&gt; &lt;code&gt;ng add @auth0/auth0-angular&lt;/code&gt; that makes it super simple to handle login/logout/session/userinfo. After a 5-10 minute setup of your Auth0 App, API and Roles/Permissions you can start seeing the first results already! Registering your first user through your own Angular app and all that was needed was a login button that calls the &lt;code&gt;AuthService&lt;/code&gt; provided by the package. After logging in, you get an AccessToken and IdentityToken holding all the information about the User and their permissions. &lt;/p&gt;

&lt;p&gt;Afterwards I built an API-Service that can call my .NET backend while appending the AccessToken as an Authorization Header to the request.&lt;/p&gt;

&lt;p&gt;On the Backend I then built an Authorization Handler that checked the AccessToken claims for the permissions and added the &lt;code&gt;.RequireAuthorization(string permission)&lt;/code&gt; to the endpoints that I wanted to protect. It took me some time to figure out some &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;CORS&lt;/a&gt; stuff on my local machine, but in the end everything worked out just fine, and a &lt;a href="https://en.wikipedia.org/wiki/Proof_of_concept" rel="noopener noreferrer"&gt;POC&lt;/a&gt; was successfully created. &lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Future Tasks
&lt;/h2&gt;

&lt;p&gt;Future goals will be, to copy this protection to all the endpoints, make a plan of what endpoints need protection. &lt;/p&gt;

&lt;p&gt;Maybe rethink the Roles, currently there is a &lt;code&gt;Admin&lt;/code&gt; role, that will be able to Create, Edit and Remove Products and Categories - as well as a &lt;code&gt;User&lt;/code&gt; role that represents an authenticated user (since logged in users have more features than non logged in users - Cart/Profile/History...). &lt;/p&gt;

&lt;p&gt;Create more endpoints (currently there is a set of endpoints that allows CRUD for &lt;code&gt;Products&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Create frontend pages and &lt;a href="https://angular.dev/guide/routing/common-router-tasks#preventing-unauthorized-access" rel="noopener noreferrer"&gt;guards&lt;/a&gt; for the existing CRUD endpoints.&lt;/p&gt;

&lt;p&gt;If you want to track my progress, or check out some &lt;a href="https://github.com/Suneeh/webshop" rel="noopener noreferrer"&gt;code&lt;/a&gt;, feel free.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙏🏽 Thanks
&lt;/h2&gt;

&lt;p&gt;Thank you so much if you read this article all the way! Leave a comment if you have any questions, I'll be more than happy to answer right away. If you are shy you can also message me directly on &lt;a href="https://github.com/Suneeh" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.instagram.com/_suneeh/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or &lt;a href="https://www.tiktok.com/@_suneeh" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>dotnet</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>.NET Fundamentals (Minimal API)</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Sun, 16 Jun 2024 15:08:42 +0000</pubDate>
      <link>https://dev.to/suneeh/net-fundamentals-minimal-api-1h9</link>
      <guid>https://dev.to/suneeh/net-fundamentals-minimal-api-1h9</guid>
      <description>&lt;h2&gt;
  
  
  🔍 What is .NET
&lt;/h2&gt;

&lt;p&gt;.Net (pronounced "dot net") is a free and open source application platform. The support by Microsoft and the regular updates and new features are what makes this tool so useful. It can be used for a variety of different things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile Apps&lt;/li&gt;
&lt;li&gt;Desktop Apps&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Game Development&lt;/li&gt;
&lt;li&gt;Machine Learning&lt;/li&gt;
&lt;li&gt;Web Development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article I want to focus on Web Development and the most important things you will need when building your first Web App. To be completely honest I will only be covering the API side of things, knowing that &lt;a href="https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor"&gt;Blazor&lt;/a&gt; can also provide an integrated frontend for your website. (Side note, I normally go with Angular for my frontends - let me know if you want me to write about it as well)&lt;/p&gt;

&lt;h2&gt;
  
  
  🆚 Minimal APIs vs Controller
&lt;/h2&gt;

&lt;p&gt;Traditional Controllers follow the MVC (&lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;Model-View-Controller&lt;/a&gt;) pattern to separate concerns as you should. They follow the typical conventions and are very well structured. Since they were the only way for most of our time, it is clear that most apps use this way to write APIs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;GetHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"echo"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Echo&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;FromBody&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Minimal APIs were introduced in .NET 6 to simplify API creation within .NET. The syntax is more concise, there is less boilerplate and you can still do most things that you could do with controllers as well (in .NET 8). Since Microsoft is heavily working on the feature parity of minimal APIs, I assume that in the future, this will be the preferred way to build APIs from scratch - but this might just be me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think the examples are already very telling and I do not need to mention, that one of them seems more &lt;em&gt;minimal&lt;/em&gt; than the other, do I?&lt;/p&gt;

&lt;h2&gt;
  
  
  🖥️ .NET Cli
&lt;/h2&gt;

&lt;p&gt;To start out a new App you need to install the &lt;a href="https://dotnet.microsoft.com/en-us/download"&gt;.NET SDK&lt;/a&gt; (Software Development Kit) and install the &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/tools/"&gt;.NET CLI&lt;/a&gt;. To create a new App run &lt;code&gt;dotnet new web -o [Project Name]&lt;/code&gt; and open it with the editor / IDE of choice. I recommend JetBrains Rider but if you want to go with free software you can also use Visual Studio or Visual Studio Code with some extensions. You want to look out for the &lt;code&gt;Program.cs&lt;/code&gt; which is the entry point of your application.&lt;/p&gt;

&lt;p&gt;Check the content and it should look somewhat like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating a &lt;code&gt;builder&lt;/code&gt; that could also handle things like Dependency Injection, Database Connections, Authentication and Authorization as well as lots of other things that I will talk about later. As you see, there is an Endpoint defined for &lt;code&gt;/hello&lt;/code&gt;. If we run the app via our IDE (or .NET CLI &lt;code&gt;dotnet run&lt;/code&gt;) the API is waiting for a call. Try calling &lt;code&gt;http://localhost:5292/hello&lt;/code&gt; (check &lt;code&gt;/Properties/launchSettings.json&lt;/code&gt; of your project to see what Port you are running on) in your browser, and you should get a "Hello World" message on your screen.&lt;/p&gt;

&lt;p&gt;You can check all options of the dotnet CLI by using &lt;code&gt;dotnet --help&lt;/code&gt; in your terminal. Most of the commands will be handled by your IDE, but you can also execute them from the terminal if you are fancy.&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Validation
&lt;/h2&gt;

&lt;p&gt;As you have seen in the examples before those APIs really are &lt;em&gt;minimal&lt;/em&gt;. Let's have a closer look at an endpoint that also validates the request for the GET Route /colorSelector/&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ColorName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"Color specified: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/colorSelector/{color}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ColorName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEndpointFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocationContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;invocationContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetArgument&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Red"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Problem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Red not allowed!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocationContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see, we defined the route as the first parameter of &lt;code&gt;app.MapGet()&lt;/code&gt; and also map the specified color to our function by putting curly braces around it and matched the name. The validation is built with an endpoint filter that checks the invocation of the endpoint for the argument, then does checks (in this case the color is not allowed to be red, because red is evil) and calls &lt;code&gt;next&lt;/code&gt; so other filters can also run. A filter is not always a validator, but sometimes it just logs requests, or adds an entry for statistics or does some other effect that should happen on every endpoint call.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧭 Routing
&lt;/h2&gt;

&lt;p&gt;In many cases you want to cluster multiple endpoints. Reasons could be that you want to use the same filter on all of them, or use the same authorization for them, or just don't want to write the path multiple times. In this case we can group multiple routes like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/user"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/admin"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEndpointFilter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Admin route was called."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps with organizing different paths and endpoints, as well as reducing duplication. Also this allows you to cluster your endpoints in folders or files outside the Program.cs without losing track of a file.&lt;/p&gt;

&lt;h2&gt;
  
  
  💉 Dependency Injection (e.g. Database) and Configuration
&lt;/h2&gt;

&lt;p&gt;You can inject services into your API endpoints to reduce the complexity of the endpoint. Mostly you want to extract some logic into services so you can reuse them. In this example I setup a database in my project and inject the DbContext in my endpoint&lt;/p&gt;

&lt;p&gt;Program.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.EntityFrameworkCore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;backend.ShopDbContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetConnectionString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ShopDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseNpgsql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;Scope&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateScope&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ShopDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Migrate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ShopDbContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;prod&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Appsettings.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Server=localhost; Port=5432; Database=postgres; Username=postgres; Password=MYPASSWORD;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To use Npgsql I installed a &lt;a href="https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL"&gt;Nuget Package&lt;/a&gt; that works with EF-Core and supports &lt;a href="https://www.postgresql.org/"&gt;PostreSQL Databases&lt;/a&gt;. The code extracts the &lt;a href="https://www.connectionstrings.com/"&gt;connection string&lt;/a&gt; provided in the configuration (Appsettings.json) in the object &lt;code&gt;ConnectionStrings&lt;/code&gt;. To setup the Database to match the schema defined in the code, you will have to apply the schema by calling &lt;code&gt;Database.Migrate()&lt;/code&gt; so I do it at the start of the application.&lt;/p&gt;

&lt;p&gt;The Endpoint now injects the ShopDbContext magically (you could specify it by using the &lt;code&gt;[FromServices]&lt;/code&gt; attribute) and gets the first element, which is a rather useless example. Most likely you want to return all, or specify the ID of the entry you want to get and look for it in the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙏🏽 Thanks
&lt;/h2&gt;

&lt;p&gt;Thank you so much if you read this article all the way! Leave a comment if you have any questions, I'll be more than happy to answer right away. If you are shy you can also message me directly on &lt;a href="https://github.com/Suneeh"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.instagram.com/_suneeh/"&gt;Instagram&lt;/a&gt; or &lt;a href="https://www.tiktok.com/@_suneeh"&gt;TikTok&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>git</category>
      <category>devops</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>C# Fundamentals</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Sun, 02 Jun 2024 13:50:43 +0000</pubDate>
      <link>https://dev.to/suneeh/c-fundamentals-3n08</link>
      <guid>https://dev.to/suneeh/c-fundamentals-3n08</guid>
      <description>&lt;h2&gt;
  
  
  🔍 What is C
&lt;/h2&gt;

&lt;p&gt;C# (pronounced "C-sharp") is a modern, object-oriented programming language developed by &lt;a href="https://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;. It was first introduced in 2000 and has evolved into one of the most versatile and widely used programming languages since. C# is designed to be simple, yet powerful, making it an excellent choice for both beginners and experienced developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Object-Oriented&lt;/strong&gt;: C# supports all the core concepts of OOP (&lt;a href="https://en.wikipedia.org/wiki/Object-oriented_programming"&gt;object-oriented programming&lt;/a&gt;) such as encapsulation, inheritance and polymorphism, which help in creating modular and reuseable code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-Safe&lt;/strong&gt;: C# enforces strict type checking, reducing the chances of runtime errors and enhancing code reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich Library&lt;/strong&gt;: It provides a comprehensive standard library that simplifies many programming tasks, including file I/O, data manipulation and networking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component-Oriented&lt;/strong&gt;: C# is designed for creating software components, which are reusable code modules that can be easily integrated into larger systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrated with .NET Framework&lt;/strong&gt;: It has seamless integration with the &lt;a href="https://dotnet.microsoft.com"&gt;.NET framework&lt;/a&gt; providing access to a vast array of libraries and tools for building robust applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Uses of C
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desktop Applications&lt;/strong&gt;: C# is widely used to develop Windows desktop applications using frameworks like Windows Forms and WPF (Windows Presentation Foundation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Applications&lt;/strong&gt;: &lt;a href="https://dotnet.microsoft.com/en-us/apps/aspnet"&gt;ASP.NET&lt;/a&gt;, a powerful framework for building web applications, is primarily based on C#. Developers can create dynamic websites, web APIs, and services with ASP.NET.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Applications&lt;/strong&gt;: With &lt;a href="https://dotnet.microsoft.com/en-us/apps/xamarin"&gt;Xamarin&lt;/a&gt;, a cross-platform mobile development framework, developers can write C# code to build native Android, iOS, and Windows mobile applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game Development&lt;/strong&gt;: C# is the primary language for Unity, one of the most popular game engines. It is used extensively in the development of both 2D and 3D games.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud and Enterprise Applications&lt;/strong&gt;: C# is commonly used to develop scalable cloud applications and enterprise-level software, particularly in environments that use Microsoft Azure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Applications&lt;/strong&gt;: C# can also be used for developing Internet of Things (IoT) applications, leveraging its ability to interface with hardware and communicate over networks.
Whatever the goal is, there most likely is a way to do it with C#.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📝 Basic Synctax and Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;del&gt;Main Method&lt;/del&gt; (Deprecated)
&lt;/h3&gt;

&lt;p&gt;Since C# 10 there is no more need for a &lt;code&gt;static void Main(string args[])&lt;/code&gt; method. Instead you can create a new file that contains &lt;code&gt;Console.WriteLine("Hello World");&lt;/code&gt; and run it without further code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables and Data Types
&lt;/h3&gt;

&lt;p&gt;The common data types are the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// INT for whole numbers&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// FLOAT for floating point numbers&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5.9f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// DOUBLE for double-precision floating point numbers&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;70.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// CHAR for single characters&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// STRING for words / text&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// BOOL for true or false (boolean)&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isStudent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A variable is always declared as seen. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;[TYPE / "var"] [VARIABLE_NAME] [(optional) = [VALUE / VALUABLE EXPRESSION]]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;var&lt;/code&gt; keyword can be used instead of any type keyword. Be careful with &lt;code&gt;var&lt;/code&gt; as it might get unclear what the type the variable is quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditional Statements &amp;amp; Loops
&lt;/h3&gt;

&lt;h4&gt;
  
  
  If / Else Conditions
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You are too young to do this."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You are old enough."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Short Form: Ternary Operator: [BOOLEAN] ? [TRUE] : [FALSE]&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You are too young to do this."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You are old enough."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Switch Statements
&lt;/h4&gt;

&lt;p&gt;If there are more than 2 possible outcomes that you want to handle a switch statement can be used. Switch statements should be preferred over multiple ifs to provide better readability.&lt;/p&gt;

&lt;p&gt;Attention! You should always cover ALL possible outcomes. A switch can also have a &lt;code&gt;default&lt;/code&gt; case to cover all paths that are not covered by the &lt;code&gt;case&lt;/code&gt; provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;19&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You are too young to drink in Germany."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You can drink in Germany but not in the US."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You can drink."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  For(each)-Loops
&lt;/h4&gt;

&lt;p&gt;For loops are being used to do the same thing multiple times.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;//12345&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For-Each loops are being used to do something for each element of an Array (a group of data)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Martin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alexander"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Michael"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Jens"&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello "&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello Martin&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello Alexander&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello Michael&lt;/span&gt;
    &lt;span class="c1"&gt;// Hello Jens&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  While-Loops
&lt;/h4&gt;

&lt;p&gt;There is also a &lt;code&gt;do { ... } while { ... }&lt;/code&gt; syntax, but the shor tform is way more common.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is still smaller than 100, so I will multiply it by 2."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;*=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// this is the same as x = x * 2;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Functions and Methods
&lt;/h3&gt;

&lt;p&gt;Defining and calling functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are numerous built in methods for the most common operations with basic data types. Here some examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// prints the number of characters in the string: 13&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// prints the first 5 Characters: Hello&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 7&lt;/span&gt;

&lt;span class="c1"&gt;// 2^4 or 2 * 2 * 2 * 2&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 16&lt;/span&gt;

&lt;span class="c1"&gt;// Takes the square root of the result (16): 4&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Object Oriented Programming
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Classes and Objects
&lt;/h4&gt;

&lt;p&gt;When working with multiple data sets of the same quality you can introduce a class to simplify work. Here an example for humans.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Human&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// getter and setter are functions being used to get or set a value.&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Introduce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Hi! I'm &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and I am &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years old."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Human&lt;/span&gt; &lt;span class="n"&gt;john&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;john&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Johnny"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;john&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Introduce&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// "Hi! I'm Johnny and I am 35 years old."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To simplify this even further, you could introduce a 'Constructor' to set values in the same step as initializing the Human.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Human&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Human&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Introduce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Hi! I'm &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and I am &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years old."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Human&lt;/span&gt; &lt;span class="n"&gt;john&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Johnny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Introduce&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// "Hi! I'm Johnny and I am 35 years old."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Inheritance
&lt;/h4&gt;

&lt;p&gt;Sometimes objects are somewhat similar, but yet different. Let's take Animals for example. All of them eat, but only dogs bark. Here the implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Eat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eating..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Bark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"WUFF!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="n"&gt;fish&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;fish&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Eat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Dog&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Eat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Bark&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Collections and Generics
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Lists
&lt;/h4&gt;

&lt;p&gt;Lists are somewhat similar to arrays but they can shrink and grow dynamically. They also provde built-in functions to use this feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Dictionaries / Key-Value
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;agesOfPeople&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;ages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Johnny"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Michael"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Alexander"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agesOfPeople&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Alexander"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// 42&lt;/span&gt;

&lt;span class="c1"&gt;// Looping through the dictionary&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeyValuePair&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;kvp&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agesOfPeople&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Name: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Age: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Generics
&lt;/h4&gt;

&lt;p&gt;When you want to write a Method in a way that is reusable for multiple types you can do so by using Generic Types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ConvertArrayToList&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Martin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alexander"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Michael"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Jens"&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;listNames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ConvertArrayToList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📚 Conclusion
&lt;/h2&gt;

&lt;p&gt;C# is a powerful and feature rich programming language. Together with the &lt;a href="https://www.nuget.org/packages"&gt;nuget&lt;/a&gt; package manager you can use pre-built feature from other users or create your own! Either way it is recommended to learn a language by speaking it. So start your own project.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 Starter Projects
&lt;/h2&gt;

&lt;p&gt;It is recommended to start with a simple and small project that can be finished within a short amount of time. Common projects to start are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todo App&lt;/li&gt;
&lt;li&gt;Calculator&lt;/li&gt;
&lt;li&gt;Tic-Tac-Toe&lt;/li&gt;
&lt;li&gt;Rock Paper Scissors&lt;/li&gt;
&lt;li&gt;Pinball&lt;/li&gt;
&lt;li&gt;Snake&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you feel comfortable with C# and feel like you want to do more: Check out the .NET Framework to build Webapplications or APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⁉ FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What IDE should i use for C# Development
&lt;/h3&gt;

&lt;p&gt;To start out Visual Studio is your best bet. If you get more serious you can look into a JetBrains subscription for &lt;a href="https://www.jetbrains.com/rider/"&gt;Rider&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Working with MacOS will become harder in August 2024, when Visual Studio is discontinued. Microsoft recommends Visual Studio Code with some Plug Ins, but keep in mind Rider is a valid option as well if you want to afford it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to run and debug my C# programs
&lt;/h3&gt;

&lt;p&gt;Visual Studio and Rider both come with a set of robust debugging tools. Set breakpoints and run your app, to see and analyze the state of your program in any given moment. This is also a nice way to learn and understand more about the internals of C#.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the best way to learn C
&lt;/h3&gt;

&lt;p&gt;Practice! Set yourself a goal of what you want to achieve. For example an Inventory App that tracks the stock of your company. Work until you get there and if you are stuck it is time to read some documentation or in depth guide for the feature you need to learn.&lt;/p&gt;

&lt;p&gt;Collaborate with other people or teams. Join hackathons or some open source project. You can learn from others and their code.&lt;/p&gt;

&lt;p&gt;Check the patch notes whenever there is a new version of C# coming your way. This way you know about the new features - try to use them in your code and refactor old code to stay up to date!&lt;/p&gt;

&lt;h2&gt;
  
  
  🙏🏽 Thanks
&lt;/h2&gt;

&lt;p&gt;Thank you so much if you read this article all the way! Leave a comment if you have any questions, I'll be more than happy to answer right away. If you are shy you can also message me directly on &lt;a href="https://github.com/Suneeh"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.instagram.com/_suneeh/"&gt;Instagram&lt;/a&gt; or &lt;a href="https://www.tiktok.com/@_suneeh"&gt;TikTok&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>csharp</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🔍 Searching the web</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Fri, 05 Apr 2024 13:46:50 +0000</pubDate>
      <link>https://dev.to/suneeh/searching-the-web-11ab</link>
      <guid>https://dev.to/suneeh/searching-the-web-11ab</guid>
      <description>&lt;h2&gt;
  
  
  Google
&lt;/h2&gt;

&lt;p&gt;As a Developer that fights new problems every day you will most likely start out by Googling the issue or error code you encounter. Googling currently is the 1st step I personally take whenever I encounter an issue, but I think Copilot or other AI Chat bots might take the #1 spot soon!&lt;/p&gt;

&lt;p&gt;To Google more efficiently you might want to learn about certain operators.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quotes
&lt;/h3&gt;

&lt;p&gt;Quotes (&lt;code&gt;" "&lt;/code&gt;) let you search for a exact match. This can be extremely useful for error codes, messages or when pinpointing exact version numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  site:
&lt;/h3&gt;

&lt;p&gt;By adding a &lt;code&gt;site:https://dev.to&lt;/code&gt; to your search, this will only find results that come from the dev.to page! This can be super useful, e.g. when you want to look up documentation of a specific framework on their site, or want to specifically get stackoverflow articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  filetype: / ext:
&lt;/h3&gt;

&lt;p&gt;Using the &lt;code&gt;filetype:pdf&lt;/code&gt; or &lt;code&gt;ext:pdf&lt;/code&gt; search you will only find PDF Files. This can sometimes be useful, but I don't use this very regularly.&lt;/p&gt;




&lt;h2&gt;
  
  
  YouTube
&lt;/h2&gt;

&lt;p&gt;When you feel like Google does not provide the info you need or you need some more visual examples YouTube might be a nice source of information as well! Check the Likes / Comments on a Video to quickly check if it is a 'good' video. Skip over Videos that disabled comments, trust me :). Also check the description of those videos, there might be a CodeBlitz or GitHub link that allows you to quickly get the code shown in the video.&lt;/p&gt;




&lt;h2&gt;
  
  
  Copilot
&lt;/h2&gt;

&lt;p&gt;If you have uncertainties about syntax or on how to do things within a framework that's known to the bot, I would check if it has a nice solution for you. The more input you give, the better the answer will be! Be as precise as possible about what inputs and outputs should look like, also provide an idea of how to achieve this if possible. Please be very careful with code provided by a bot, since it might not be correct. Also you should try to question the bot at any time! Don't copy stuff that you do not understand and also ensure that you do not introduce security issues by using AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;p&gt;Using software tools that have a GitHub Repository is very common. They often provide documentation about how to install and use their software - read it! If you encounter any bugs or stumble across problems at some point, check their open and closed issues to find details about it. Sometimes there are known workarounds or solutions to your problem in the comment section. If you feel like you encountered a new problem, open an issue and provide test data for the maintainer to reproduce your issue. If you feel like you can solve it yourself - feel free to create a Pull Request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;Many of us developers are lazy - I know, you don't want to hear it but if there is documentation, you should read it. It is written by the creator / maintainer of the software and often has detailed information about what the software provides and how to use it. Also, you should try and Document your code, yes I know it can be annoying but it's worth it, trust me.&lt;/p&gt;




&lt;h2&gt;
  
  
  StackOverflow
&lt;/h2&gt;

&lt;p&gt;Our lord and savior StackOverflow. Most likely you will encounter this page rather sooner than later when googling for any issue in almost any programming language. People can explicitly ask questions about coding and (hopefully) get helpful answers.&lt;/p&gt;




&lt;p&gt;Did I miss anything? Where do you get your information from?&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>ai</category>
      <category>github</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introduction Version Control</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Tue, 26 Mar 2024 21:38:34 +0000</pubDate>
      <link>https://dev.to/suneeh/introduction-version-control-1034</link>
      <guid>https://dev.to/suneeh/introduction-version-control-1034</guid>
      <description>&lt;h2&gt;
  
  
  Version Control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🤨 What is Version Control?
&lt;/h3&gt;

&lt;p&gt;Version control is like a ‘history’ of your code. It records and stores the changes you made to your code over time. It also allows you to save some changes and start a new feature without losing the progress by using a different branch. This enables functionalities like comparing your code and changes to the “original” code you started with, revert (some of) your changes or merge changes. This gets increasingly important if you develop software as a team! Different developers can work on different features without getting into each others ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤷🏽 Why should you use Version Control?
&lt;/h3&gt;

&lt;p&gt;A change log of your code is always handy! It helps with collaboration, prevents errors when multiple developers work on the same project, prevents data loss. It’s also used to review changes and have other people read through your changes before you want to merge them into the project, this is called “Code Review”.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ What tools can you use?
&lt;/h3&gt;

&lt;p&gt;There are many tools available that help you to version your code properly. &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; has by far the highest market share with almost 90%, so let’s just go with that. The git command line interface (CLI) can be a bit overwhelming at first, but it’s worth having a closer look at. Ever though there are a lot of graphical user interfaces (GUI) that show what is happening in a more visual way, I would recommend to learn the basic CLI commands non the less.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧐 How to use git?
&lt;/h3&gt;

&lt;p&gt;To get started you want to either use the &lt;code&gt;git init&lt;/code&gt; command to start out a new project or use the &lt;code&gt;git clone [URL]&lt;/code&gt; command to download an existing project and start participating right away.&lt;/p&gt;

&lt;p&gt;You will find yourself in the ‘main’ branch after that. To not interfere with other people working on this project, you should start out by creating your own branch from here by using &lt;code&gt;git branch [Branch Name]&lt;/code&gt; followed by &lt;code&gt;git checkout [Branch Name]&lt;/code&gt;. While you created a branch with the first command, you switched to it in the second command. To save some time you can also use the shorthand &lt;code&gt;git checkout -b [Branch Name]&lt;/code&gt; the &lt;code&gt;-b&lt;/code&gt; flag switches and creates the specified branch.&lt;/p&gt;

&lt;p&gt;Now that you are on your own branch, you can start developing and make some changes. Whenever you want to specify files that you want to track, use &lt;code&gt;git add [File Name]&lt;/code&gt; to track it. You can also specify many files or even folders by using &lt;code&gt;*&lt;/code&gt; but to be honest, you will most likely use &lt;code&gt;git add .&lt;/code&gt; most, to track ALL files in that path including files in folders.&lt;/p&gt;

&lt;p&gt;When you are done with your changes you want to either commit them by using &lt;code&gt;git commit -m "[Commit Message]"&lt;/code&gt;. This will bundle all changes into a commit with a short but descriptive message that tells others what you’ve done. If you do not want to commit your changes, you might want to use&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git diff&lt;/code&gt; to see what has been changed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git reset&lt;/code&gt; [file] to unstage your changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git stash push&lt;/code&gt; to push those changes into a stash that you can come back to later by using &lt;code&gt;git stash pop&lt;/code&gt; with will load all changes from the stash into your current state.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All this happens on your local machine, if you want to share your code with the others you want &lt;code&gt;git push&lt;/code&gt; those changes.&lt;/p&gt;

&lt;p&gt;To see what others did you can use &lt;code&gt;git fetch&lt;/code&gt;, this will load all branches from the remote state. If you want to fetch commits and their changes and merge them into your current state use &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lastly there is &lt;code&gt;git merge [Branch Name]&lt;/code&gt; which will try to merge changes from another branch into your current state. This might result into merge conflicts if both your changes and the ones from the branch you merged target the same file / lines of code.&lt;/p&gt;

&lt;p&gt;These are the basics! Since git is so popular, you can easily google your way to the solution needed. You can almost never lose code, unless you use &lt;code&gt;reset&lt;/code&gt; commands or flags like &lt;code&gt;--force&lt;/code&gt; or &lt;code&gt;--hard&lt;/code&gt; which you should not use without extra care!&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑🏻‍💻 Common Workflows
&lt;/h3&gt;

&lt;p&gt;Many teams use git, and many teams have many conventions about how to work with it. There might be conventions about branch names, commit messages or pull requests. But what most of them have in common, are Merge or Pull Requests, which is the same thing - different name. It’s the process of requesting to merge your branch into the main (or any other) branch. Someone will then most likely have a look at what your changes do and decide on whether or not the changes are okay or not - this is called a Code Review. After the merge happened you start all over :)&lt;/p&gt;

</description>
      <category>git</category>
      <category>devops</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Hello World!</title>
      <dc:creator>Suneeh</dc:creator>
      <pubDate>Sat, 09 Mar 2024 11:46:22 +0000</pubDate>
      <link>https://dev.to/suneeh/hello-world-3k94</link>
      <guid>https://dev.to/suneeh/hello-world-3k94</guid>
      <description>&lt;h2&gt;
  
  
  👋🏽 Greetings
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Hello World!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hi, I want to introduce myself. I'm Suneeh - a 27 y/o professional Fullstack Software Engineer from Bavaria/Germany.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧐 Why am I here
&lt;/h2&gt;

&lt;p&gt;I want to learn and explore new things I don't find the time for during my working hours. Since I am currently aiming for a promotion I want to spend my free time with coding for the next months and blogging helps to persist the learned techniques and building a portfolio.&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;.NET&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I might try different things over the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 About me and my project
&lt;/h2&gt;

&lt;p&gt;I was working for a small e-commerce company as a trainee for 2 years but I also had to do some sales and support, which I didn't like - so I got a new Job as a pure Developer which made me so much more happy. Sometimes I miss the old web shop stuff, that's why I decided to start a web shop project on the side.&lt;/p&gt;

&lt;p&gt;I will try to blog consistently about my journey towards being a Senior here (I will abuse this as my daily standup tbh). &lt;/p&gt;

&lt;h2&gt;
  
  
  📷 Socials
&lt;/h2&gt;

&lt;p&gt;If you want to follow what I'm doing, feel free to comment, message me on &lt;a href="https://www.instagram.com/_suneeh/"&gt;social media&lt;/a&gt; or pair program with me live on &lt;a href="https://www.twitch.tv/suneeh"&gt;twitch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also find my code on &lt;a href="https://github.com/Suneeh"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Daily Standup Over
&lt;/h2&gt;

&lt;p&gt;Other than that, I have nothing to report for today.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
