r/csharp • • 21d ago

Discussion Come discuss your side projects! [October 2026]

13 Upvotes

Hello everyone!

This is the monthly thread for sharing and discussing side-projects created by /r/csharp's community.

Feel free to create standalone threads for your side-projects if you so desire. This thread's goal is simply to spark discussion within our community that otherwise would not exist.

Please do check out newer posts and comment on others' projects.


Previous threads here.


r/csharp • • 21d ago

C# Job Fair! [October 2026]

5 Upvotes

Hello everyone!

This is a monthly thread for posting jobs, internships, freelancing, or your own qualifications looking for a job! Basically it's a "Hiring" and "For Hire" thread.

If you're looking for other hiring resources, check out /r/forhire and the information available on their sidebar.

  • Rule 1 is not enforced in this thread.

  • Do not any post personally identifying information; don't accidentally dox yourself!

  • Under no circumstances are there to be solicitations for anything that might fall under Rule 2: no malicious software, piracy-related, or generally harmful development.


r/csharp • • 13h ago

About codebase conventions, who is actually right and who is wrong here?

Post image
80 Upvotes

Let's say you're a Technical Founder like Mark Zuckerberg or Bill Gates. You have a CS degree worked as mid level developer.

You've written some code (as show in the pic) and added comments to remind yourself and other developers what the code does, so nobody forgets in the future.

Now, you have a Senior Developer on your team who worships Uncle Bob's Clean Code principles like a cult!

she reviews your PR and reject it, saying

"Good code should be self-explanatory. The code itself should explain what it's doing.

Anyone should be able to look at it on the first time and understand it right away.

So go back and remove those comments. They're not clean! God damn it!"

--

What would you do in this situation?

Would you trust the senior dev and delete the comments because they have more experience than you, even though you're the founder and have less development experience than they do?

Ps. We have to move fast


r/csharp • • 1h ago

Help What’s the best way to learn c#?

• Upvotes

I don’t know how to do anything with c# but I won’t to learn what’s the best way? Is it YouTube, online classes, learn to code websites or something else


r/csharp • • 11h ago

Discussion Can I learn computer architecture and operating systems with C#?

12 Upvotes

I'm a full-stack developer, and I want to learn more about computer architecture and operating systems to become a better developer and understand what's happening under the hood.Can I learn these things with C#, or should I learn C first? Does the language even matter that much?What would you recommend?


r/csharp • • 14h ago

Help Anyone here built measurement/monitoring software in C#?

11 Upvotes

Hey, has anyone here worked on industrial measurement or monitoring software with C#?

I'm currently looking into rebuilding an older monitoring solution from scratch and still figuring out the right architecture.

We're talking different measurement devices, continuous data streams (up to 1k samples/sec per channel), older Windows PCs with 4 GB RAM, and ideally something that can run reliably for months.

What I'm a bit unsure about is the data integrity side of things, especially crash recovery, audit trails, and GMP requirements.

I'm leaning towards C#, probably with SQLite, but not sure if I'm overlooking something.

Would be really interested to hear from anyone who's built something similar. What would you do differently today?


r/csharp • • 4h ago

ResXLocalization 2.0: .resx files based localization for Avalonia and WPF, now with ICU MessageFormat support

1 Upvotes

Hi, I have just released version 2.0.0 of ResXLocalization, my localization library for WPF and Avalonia (MIT-licensed).

In essence:

  1. Create your .resx files.

  2. Install ResXLocalization.Avalonia or ResXLocalization.WPF.

  3. Let it generate the typed resource keys (source generator) and use them in XAML and code:

    <TextBlock Text="{l:Localize {x:Static res:SettingsViewKeys.SaveSetting}}" />

    this.SaveButton.Content = Localizer.Current.Get(SettingsViewKeys.SaveSetting);

  4. And live switch the language/culture:

    Localizer.Current.CurrentCulture = new CultureInfo("de-DE");

Typed keys mean you can reference resources like objects and get compile time checking.
This avoids having typos in resource names go unnoticed.

When you change Localizer.Current.CurrentCulture it updates all localization bindings in place. If you assign a string directly in code as above, you need to call Get again after changing the culture.

The biggest new feature of V2 is the optional ICU MessageFormat support (thank you livonium for the feature request that sparked the work on V2!):
For something like “1 file deleted” / “5 files deleted”, you can use a plural rule in your resource text:

{Count, plural, one {# file deleted} other {# files deleted}}

(You need to install the NuGet package ResXLocalization.MessageFormat and call Localizer.Current.UseMessageFormat() at startup for this to work)

Then just bind the count like this:

<TextBlock>
  <TextBlock.Text>
    <l:Localize Key="{x:Static res:AppStringsKeys.FilesDeleted}">
      <l:Argument Name="Count" Value="{Binding DeletedCount}" />
    </l:Localize>
  </TextBlock.Text>
</TextBlock>

The text block is automatically updated when either the count or the language changes.
Of course you can also bind multiple values to a localized text/message.

Each translation can use its language/culture plural rules.
The ICU message format support is opt-in. If you don't use it, the default formatter (based on string.Format) is used.

A few other changes in this release:

  • Typed keys now finally work also without a .Designer.cs file.
  • Formatting arguments are now placed via <Argument> children of the Localize/LocalizeEnum markup extension, which replaces the old Arg0…Arg8 attached properties, so arguments now also work in styles and templates.
  • Resource keys are bindable, so the view model can dynamically decide which resource to use.
  • You can change the preview language (for VS XAML Designer/Rider XAML previewer) with DesignTime.Culture. However, ResXLocalization does not work correctly in Rider's WPF previewer due to a number (there are quite a few) of bugs in it. JetBrains has really made quite a few unfortunate design decisions for their previewer. I tried to work around them as far as possible, but it's nowhere near perfect.

The library supports .NET 8 and later with Avalonia (12+) or WPF.
For Avalonia it is completely native AOT compatible and trim safe (for WPF, native AOT is not supported, because WPF doesn't have support for it).

If you are upgrading from V1, please read the migration guide, because there are quite a few breaking changes to make it all work.

The repository has runnable sample apps (both for Avalonia and WPF):
https://github.com/rent-a-developer/ResXLocalization

AI attribution:
I used AI, mainly Claude, for brainstorming, planning, experiments, and parts of the implementation. It helped me save a great deal of time finding good solutions for a couple of quirks of Avalonia and (especially) WPF and the source generator’s MSBuild integration. I reviewed the generated code and I use ResXLocalization in my own projects, so I would not settle for some half-baked vibe coded garbage. Of course, if you don't like projects where AI is involved, then just ignore this project and that's fine too.

I hope this helps someone with the localization of their app(s)!

If you find this library useful I would appreciate a star on GitHub.

Of course feature request and (reasonable) criticism is welcome too.


r/csharp • • 6h ago

[Open Source] Created a simple tool to fix broken Windows Update policies and reliably install .NET Framework 3.5 (dev on .NET 4.7.2)

Thumbnail
1 Upvotes

r/csharp • • 4h ago

I built a small Windows file encryptor in C# / WinForms with my own cipher. It's unaudited, looking for feedback

0 Upvotes

Snowy is a Windows desktop app for encrypting local files. It has three levels: Simple (obfuscation only), Moderate (password with Argon2id) and Protected (a graphical pattern or a question).

The cipher is Snow-II, my own construction: 256-bit block, 18 rounds, built on the AES S-box and the Rijndael-256 round structure, with a different hash-based key schedule. Please don't treat it as secure. It hasn't been reviewed by anyone outside the project, and the README says so at the top.

What might interest C# people:

  • Custom WinForms UI with animations, themes and a vsync-driven frame clock.
  • Vault format with encrypt-then-MAC over the whole header, verified in constant time before anything is decrypted or written.
  • Argon2id via Konscious, with KDF parameters stored in the header and bounded before use.
  • Table-driven cipher with parallel CTR for large files; a naive reference implementation and frozen test vectors, reproduced by an independent Python file.
  • 61 unit tests in xUnit, run in CI on Windows.

Repo: https://github.com/chara123666/snowy

The most useful feedback would be on the design, especially the open questions in docs/SPEC.md section 7. If you see a real break, please report it privately as described in SECURITY.md.


r/csharp • • 1d ago

What is the most anticipated feature of the language that is not included in C#15 for you?

4 Upvotes

It 's coming up very soon .NET 11 and C#15, all the innovations are already known (at least in C#). Which of the non-products or proposals would you like to see in the next versions?


r/csharp • • 1d ago

Discussion Is it justified to create an interface in this specific case ?

8 Upvotes

An Admin panel is to be made.

There is a piece of code that paginates users ; instead of showing 50 users in one page in the admin panel, the users are split across 5 pages, so each page shows 10 users.

I recognized that I should also paginate products.

should I make IPaginator<T> interface with two concrete implementations, ProductsPaginator<Product> and UsersPaginator<User> ?

If that is wrong, then what do you suggest ?

EDIT:

I think that is wrong, because maybe the implementation of the pagination logic is the same in both cases, what is different is the input; in the first implementation, the input is all the products , for the second implementation the input is all the users, so what is actually different is the input, not the implementation, therefore it is better to make Paginator<T> ?

Also there is another question:

When the user clicks on the page number 1, should the data come from the database or from a cache ?

How do you normally design the pagination feature ?

Second edit :

I realized that I neither need interface nor a class, I can just use the skip and take methods that LINQ offers.


r/csharp • • 12h ago

Help Is C# worth learning in the AI era? (Web dev background looking to future-proof)

0 Upvotes

Hey everyone,

I’ve been building things for the web using JavaScript, TypeScript, and PHP (Mostly). Up to now, it’s been a solid stack with a great job market. But with how fast things are shifting, especially with AI tooling changing the landscape. I’m trying to future-proof my skills and can't entirely predict where things are heading.

I keep hearing about C# and .NET as a robust enterprise choice, but I’m wondering how it fits into the current AI-driven era.

  • For those of you working in C#/.NET right now, how has the job market and day-to-day work changed with AI code assistants?
  • Is learning C# a smart pivot or addition for a web dev trying to stay relevant, or should I double down elsewhere?

Curious to hear your thoughts and experiences!


r/csharp • • 1d ago

Request for wisdom regarding VS when learning C#

0 Upvotes

Dear C# devs,

My main language is python, but due to work I got exposed to C#, and would greatly benefit from learning it. I already am mostly familiar with the language's syntax due to some C++ exposure, but I am far from familiar with many C# concepts and the visual studio editor. In summary, I am a beginner to the language, but not to programming. I can write simple programs, but heavily lack the knowledge of C#'s environment such as projects, solutions, their respective settings, how to link DLLs and set up tests within visual studio.

I strongly feel that visual studio code is abstract (albeit efficient) in the way it performs those tasks and like it prevents me from learning what is actually going on. All I am learning is that I should click seemingly arbitrary submenu A, then B and then C. Voila, you now can run tests. Why? I have no idea.

To actually get an understanding of C#'s environment I therefore am considering omitting VS entirely and instead develop through the CLI. Hopefully, that way I actually learn what the .NET framework is, and how to work with it, how to set up projects, solutions, go through the compilation processes,and more.

I just wanted to ask the true C# veterans among us whether this proposed learning approach is a good idea, or whether I am missing something.

All constructive feedback is greatly appreciated.
Good night everyone!


r/csharp • • 1d ago

NET MVC multilingual website: JSON vs RESX vs separate Razor views

Thumbnail
0 Upvotes

r/csharp • • 1d ago

Tip Indexing into a Vector is slow, store to stack first

9 Upvotes

Needed to fall out of vectorized back to scalar,

  • 22.19 us to store to stack and read from stack
  • 24.12 us to index into a vector directly

Discovered when I was optimizing DrawSpans8,

public static void DrawSpans8_Fast(ESpan_t* pspan)
{
    /* Other code omitted for brevity */
    int* idx = stackalloc int[Vector256<int>.Count];
    ulong* idx64 = (ulong*)idx;

    do
    {
        Vector256<int> sV = Vector256.Create(s) + Vector256.Create(sstep) * indexV;
        Vector256<int> tV = Vector256.Create(t) + Vector256.Create(tstep) * indexV;
        ((sV >> 16) + (tV >> 16) * cachewidthV).Store(idx);
        // Fast
        ulong i01 = idx64[0], i23 = idx64[1], i45 = idx64[2], i67 = idx64[3];

    } while ((pspan = pspan->PNext) != null);
}

public static void DrawSpans8_Slow(ESpan_t* pspan)
{
    /* Other code omitted for brevity */

    do
    {
        // Omitted
        Vector256<int> sV = Vector256.Create(s) + Vector256.Create(sstep) * indexV;
        Vector256<int> tV = Vector256.Create(t) + Vector256.Create(tstep) * indexV;
        Vector256<ulong> idxV = ((sV >> 16) + (tV >> 16) * cachewidthV).AsUInt64();
        // Slow
        ulong i01 = idxV[0], i23 = idxV[1], i45 = idxV[2], i67 = idxV[3];
    } while ((pspan = pspan->PNext) != null);
}

r/csharp • • 2d ago

Update: I added interactive CLI execution and in-depth explanations to the 73 Design Patterns repo

Thumbnail
github.com
13 Upvotes

Hey everyone,

A while ago, I shared my repository implementing 73 design patterns in C# (previous post).

Following community feedback, I just rolled out two major updates to make the project much easier to navigate and learn from:

  1. Interactive CLI runner: Instead of digging through multiple entry points or modifying code to run a specific pattern, you can now run everything from a centralized CLI menu. Select any pattern by category/name, run it immediately, and inspect the console output.
  2. Complete, in-depth documentation: Every single pattern now includes a dedicated breakdown explaining the core problem it solves, the structural mechanics behind it, when to use it, and practical trade-offs in modern .NET.
  3. F# solutions for the final problem of each topic: Added an F# implementation for the capstone problem of each category. Rather than forcing purity where it hurts LeetCode performance, it explores an idiomatic, functional-first perspective—contrasting immutable pipelines, tail-recursion, and pattern matching against pragmatic imperative optimizations where arrays and mutable state make sense.

The repo covers everything from classic Gang of Four patterns to Enterprise, Cloud/Distributed, and Concurrency patterns in idiomatic C#.

Check it out here:

https://github.com/jonas1ara/73

Would love to hear your thoughts, feedback, or any edge cases you’d like to see covered!


r/csharp • • 2d ago

Fun Funny mistake I made

7 Upvotes

I'm learning C# for fun and wrote the simplest possible calculator, just to try combining loops, WriteLine, ReadLine and other basic commands. There was one problem, though. I couldn't for the life of me figure out how to include decimal numbers into that. Went through a couple sites and nothing. My result would always be a whole number with the decimal point removed, meaning it would be 10^x times bigger depending on the amount of decimal places the input had. Then I thought of using a comma in the input instead of a dot. I didn't think it would work, but... it did. Kinda dumb not to try that immediately, right?


r/csharp • • 2d ago

Busca por referência para aprender c#

0 Upvotes

Estou a 3 meses trabalhando com c#, meu primeiro emprego como desenvolvedor, porem sinto dificuldades em encontrar definições CLARAS de alguns conceitos. Como um exemplo, o conceito de coleções, a página da microsoft learn não define muito bem o que é isso, a I.A me da definições mas em geral não gosto de pesquisar esse tipo de coisa nela. Então pergunto, existe algum livro/curso bom para que eu obtenha essa base, se não, aceito algumas dicas pra melhorar meu auto-ditatismo.


r/csharp • • 2d ago

.NET Agent Framework feature request

Thumbnail
0 Upvotes

r/csharp • • 2d ago

Convertino: a drag-and-drop radial file converter in .NET 10 (WPF + Avalonia), with an OLE drop target and global input hooks

1 Upvotes

Sharing a side project and some of the less obvious parts of building it.

The app: drag any file, tap Shift, and a radial menu opens under the cursor. Drop on a petal to convert (images, PDF, Office, Markdown, video) or edit (crop, annotate, redact, AI cut-out).

Interesting bits:

- Windows: WH_KEYBOARD_LL / WH_MOUSE_LL hooks on their own thread, plus a layered, topmost, non-activating WPF window that acts as an OLE drop target. IDropTargetHelper keeps Explorer's drag image and sets the "Convert to PNG" caption via DropDescription. Effects are copy-only, so Shift ("move") never deletes the source.

- Linux: Avalonia 12 for XDND drops, an override-redirect window, XShape. Input is polled through XQueryPointer/XQueryKeymap because Wayland doesn't allow global hooks.

- macOS: Avalonia plus NSVisualEffectView for real system blur. Mouse/modifier state is polled via CGEventSourceFlagsState, which works without Input Monitoring.

- Shared core: a catalog of petals per file kind, jobs with progress/cancel, ImageMagick, PdfPig + PDFsharp, ONNX Runtime (DirectML on Windows) for BiRefNet background removal, and a CLI using the same engine.

MIT: https://github.com/hasanzadee/convertino. Happy to answer questions about any of it.


r/csharp • • 2d ago

Does Velopack have a way to NOT install automatically on run?

0 Upvotes

The users of my app sometimes have trouble figuring out that the app has installed after they run the installer executable.

I'd like to know if there would be some way to have a dialog appear that asks the user if they'd want to install the app, and also have additional options to configure, like where to install.


r/csharp • • 3d ago

Hello, I want to share my free open source.

17 Upvotes

It's web CMS.

I hope this proves helpful to those who wish to manage their time, money, and documents using a personal server.

It took about 5 years to make it.

It currently in operation on the following site.

You are free to use the demo account provided on this site for logging in!

https://www.maroik.com/

DDD + CA & Unit test & CI/CD applied.

https://github.com/IkhyeonJo/Maroik


r/csharp • • 3d ago

News TMS .NET Maps open beta: one map control for WinForms, WPF, .NET MAUI and Blazor

Post image
26 Upvotes

I work at TMS Software. We've released TMS .NET Maps as an open beta on nuget.org: a map control for .NET 10 with the same API in WinForms, WPF, .NET MAUI (Android, iOS, Mac Catalyst, Windows) and Blazor. It also includes geocoding, directions, places search and a few other services that work without the map control, for example in an ASP.NET Core API.

Providers include Google Maps, Azure Maps, HERE, Mapbox and Leaflet with OpenStreetMap, which needs no API key, so you can try it without signing up anywhere else.

To try it, install the package for your framework from NuGet and request a free beta key at https://www.tmssoftware.com/site/tmsdotnetmaps.asp

The beta builds work until December 31, 2026 and aren't meant for production yet. We're looking for feedback on the API and on what's missing for your use case.

Full announcement with code samples: https://www.tmssoftware.com/site/blog.asp?post=2532


r/csharp • • 3d ago

Help Generate plots using BenchmarkDotNet

0 Upvotes

Some context:

WorkSheetToDbSyncronizerV2 service is to be benchmarked, and plots are to be shown.

WorkSheetToDbSyncronizerV2 ensures that the data in a database matches the data in an Excel worksheet.

There are multiple versions of that service, thus the suffix V2 .

Inputs to WorkSheetToDbSyncronizerV2 are Stream and CancellationToken —the latter is not shown in the code.

The general mechanism is that SqlBulkCopy class bulk-inserts the Excel data into a staging table then the data from that table is mapped to the target tables in the database.

AI generated image that simplifies the idea
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Running;
using HardwareStore.Models;
using HardwareStore.Services.ActorIdGetterServices;
using HardwareStore.Services.AdminServices.ImportProductsFromExcelFile;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using BenchmarkDotNet.Loggers;

namespace MyBenchMark
{
    [Config(typeof(Config))]
    public class Config : ManualConfig
    {
        public Config()
        {

            AddExporter(RPlotExporter.Default);

            AddLogger(ConsoleLogger.Default);
        }
    }
    public class ActorIdGetter:IActorIdGetter
    {
        public string GetActorId()
        {
            return "a1f28e89-2ba1-493e-b005-744decdd78b3";
        }
    }
    [MinColumn, MaxColumn]
    public class SyncronizationService
    {       
        private readonly DbDataReaderGetter _dbDataReaderGetter=new DbDataReaderGetter();
        private readonly BulkInserter _bulkInserter=new BulkInserter();
        private readonly IActorIdGetter _actorIdGetter=new ActorIdGetter();
        private readonly ApplicationDbContext _context;
        private readonly WorkSheetToDbSyncronizerV2 _syncronizerV2;



        public SyncronizationService()
        {

            IConfiguration configuration = new ConfigurationBuilder()
                .SetBasePath(Path.GetFullPath(
                    @"D:\Training\NETLEARNING\EF_learning\HardwareStore"))
                .AddJsonFile("appsettings.json")
                .Build();

            string connectionString =
                configuration.GetConnectionString("HardwareDB")
                ?? throw new InvalidOperationException(
                    "Connection string 'HardwareDB' was not found.");

            var contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(connectionString)
    .Options;

            _context = new ApplicationDbContext(contextOptions);


            _syncronizerV2=new WorkSheetToDbSyncronizerV2(_dbDataReaderGetter, _bulkInserter,_actorIdGetter,_context);
        }



        [Benchmark(Baseline =true)]
        public async Task SyncronizeV2()
        {
            await using var stream = File.OpenRead(
               @"D:\Training\NETLEARNING\EF_learning\HardwareStore\Available_Products\Excel2.xlsx");
            await _syncronizerV2.SyncronizeAsync(stream);
        }

    }

    public class Program
    {
        public static void Main(string[] args)
        {


            var summary = BenchmarkRunner.Run<SyncronizationService>(new Config());



        }
    }

}

Result:

// * Export *
  BenchmarkDotNet.Artifacts\results\MyBenchMark.SyncronizationService-measurements.csv
  BenchmarkDotNet.Artifacts\results\BuildPlots.R
  BenchmarkDotNet.Artifacts\results\*.png

// * Detailed results *
SyncronizationService.SyncronizeV2: DefaultJob
Runtime = .NET 10.0.11 (10.0.11, 10.0.1126.37416), X64 RyuJIT x86-64-v3; GC = Non-concurrent Workstation
Mean = 1.876 s, StdErr = 0.051 s (2.72%), N = 87, StdDev = 0.476 s
Min = 1.078 s, Q1 = 1.597 s, Median = 1.640 s, Q3 = 1.942 s, Max = 3.415 s
IQR = 0.345 s, LowerFence = 1.080 s, UpperFence = 2.460 s
ConfidenceInterval = [1.702 s; 2.050 s] (CI 99.9%), Margin = 0.174 s (9.27% of Mean)
Skewness = 1.54, Kurtosis = 4.31, MValue = 2.15

But there is no image in the results folder :

Plot was not generated

The following message is shown in BuildPlots.log :

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/gdata_3.0.1.zip'
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/tidyr_1.3.2.zip'
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/gridExtra_2.3.1.zip'
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/Rcpp_1.1.2.zip'
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/R.devices_2.17.4.zip'
Error in desc[1L, "Type"] : subscript out of bounds
Calls: install.packages -> .install.winbinary -> unpackPkgZip -> %in%
In addition: Warning message:
In unzip(zipname, exdir = dest) : write error in extracting from zip file
Execution halted

How can this be solved ?


r/csharp • • 4d ago

Help .Net interview preparation

25 Upvotes

Hi everyone!

I’m preparing for a Senior .NET Developer interview, and I was told that the interview will include a code review exercise and coding challenges.

Has anyone here recently gone through a similar interview, particularly for a Senior .NET / C# position? I’d really appreciate any tips on what to expect and how best to prepare.