Minimal API | Route Handler için Response çeşitleri

Minimal API içerisinde bir route handler’dan döndürülebilecek response çeşitlerini ele aldık bu videoda.

✅Github reposu: https://github.com/sonergonul/MinimalAPI

Response çeşitleri şu şekilde;

➡️ IResult – Task<IResult> veya ValueTask<IResult>

➡️ string – Task<string> veya ValueTask<string> – text/plain

➡️ T – Json seralize – application/json

🟢 app.MapGet("/response1", () lambda "Hello World");

🟢 app.MapGet("/response2", () => new { Message = "Hello World" });

🟢 app.MapGet("/response3", () => Results.Ok(new { Message = "Hello World" }));

🟢 app.MapGet("/response4", () => Results.Json(new { Message = "Hello World" }));

🟢 app.MapGet("/405", () => Results.StatusCode(405));

🟢 app.MapGet("/text", () => Results.Text("This is some text"));

🟢 app.MapGet("/old-path", () => Results.Redirect("/new-path"));

🟢 app.MapGet("/download", () => Results.File("C:/appsettings.json", contentType: "application/json", fileDownloadName: "appsettings.json"));

JIT Derleyicisine Giriş – Dizilerde sınır kontrolü

.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler‘ın dizilerin index sınırları konusunda yaptığı optimizasyonlara baktık bu videoda.

JIT compiler’ı bir dizi içerisinde eğer aynı branch’te (yani farklı bir kod akışına dallanma olmadan) büyük index’li kontrolü yaptıktan sonra kendisinden küçük index’ler için ayrı bir kontrol yapmasına gerek olmayacak şekilde optimizasyon yapıyor.

Yani

arr[2] = 3;

için 2 index’i için bir karşılaştırma yaptığında, bu satırdan daha sonra aynı brach’te;

arr[1] = 3;

şeklinde bir kodunuz varsa, ben zaten 2 için kontrol ettim, 2 index’li bir elemanı olan bir dizinin 1 index’li bir elemanı her zaman vardır şeklinde düşünüp burada bir karşılaştırma yapmayarak optimizasyona gidiyor.

Tabi bu optimizasyon farklı branch’lerde mevcut değil.

Videodaki kod bloğu;

 public void M(int[] arr) 
    {
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;
    }
    
    public void M1(int[] arr) 
    {
        arr[2] = 1;
        arr[1] = 2;
        arr[0] = 3;
    }

    public void M(int[] arr, int i) 
    {
        if(i == 1)
        {
            arr[0] = 1;
            arr[1] = 1;
        }
        else if(i == 2)
        {
            arr[0] = 1;
        }
    }

Kaynaklar:

https://sharplab.io

https://github.com/dotnet/coreclr/blob/master/src/jit/rangecheck.cpp

https://en.wikipedia.org/wiki/Branch_predictor

.NET MAUI Nedir? | .NET MAUI Mimarisi ve Kurulumu

.NET Multiplatform App UI (kısaca MAUI), Windows, macOS, iOS ve Android‘i hedefleyen cross platform UI uygulamaları oluşturmak için Microsoft’un yeni bir framework’ü.

.NET MAUI ile bu platformlardan herhangi birinde çalışan zengin, etkileşimli, yerel bir UI uygulaması oluşturabilirsiniz. Tek bir kod tabanı ile tüm bu platformları destekleyen ve kodun %100’ünü aralarında paylaşan bir uygulama oluşturabilirsiniz. Kısacası bir .NET dilinde bir uygulama yazıyorsunuz ve hedef platformların hiçbirinde herhangi bir değişiklik yapmadan çalışıyor. Tüm kod mantığınız bir .NET dilinde yazılabilir ve kullanıcı arayüzünüz de XAML veya seçtiğiniz .NET dilinde tanımlanabilir.

Seçtiğiniz .NET dilini (VB.Net, F# veya C#) kullanarak, .NET MAUI uygulamalarında kod yazabilirsiniz. Kullanıcı arayüzünüzü kodda da tanımlamanız mümkündür, ancak yalnızca C# ve F# desteklenir.

Bir .NET MAUI uygulamasının mimarisinin nasıl olduğunu ve bir .NET MAUI uygulamasının nasıl bir araya geldiğine bakalım;

  • En altta hedef işletim sistemimiz var (Android, iOS, macOS ve Windows). Sonraki katman, her hedef işletim sisteminde .NET MAUI uygulamamızı çalıştıracak .NET runtime’ı gösterir. Android, iOS ve macOS için bu çalışma zamanı Mono‘dur ve Windows için WinRT‘dir.
  • Bir sonraki katman, ilk abstraction katmanımız – .NET Base Class Library (BCL). BCL, .NET’in temel öğelerinin bir parçasını oluşturmayan List ve Generics gibi beklediğimiz tüm ortak dil özelliklerine erişim sağlar. Geliştirici açısından bakıldığında, .NET 5 ve .NET 6, netcoreapp ve netstandard‘ın yerini alarak hedef framework’ler haline geldi. .NET 6’da bir .NET MAUI uygulaması yazarken, tüm platformlarda BCL’ye erişiminiz olur.
  • BCL’nin üzerinde bulunan bir sonraki katman, platforma özel API’ler için soyutlamalara erişim sağlar. Android için .NET ve iOS için .NET, sırasıyla Xamarin.Android ve Xamarin.iOS‘un sonraki yinelemeleridir. Mac için .NET yeni geliştirilmiş Microsoft tarafından ancak aynı şekilde çalışır ve Windows için WinUI API’si kullanılır.
  • Son abstraction kısmı ise .NET MAUI’dir. Bu, desteklenen tüm platformlarda ortak olan UI öğeleri sağlayan birleşik bir API’dir. Bunlara layouts, buttons, text entry fields, navigation API vs. gibi örnekler verebiliriz. “Essentials” namespace’i aracılığıyla, (Xamarin‘de bu ayrı bir paketmiş bu) Bluetooth, konum hizmetleri ve cihaz depolaması gibi genel donanım özelliklerine de erişebilirsiniz.

Katmanlara aşağıdan yukarıya bakarken, bir .NET MAUI uygulaması oluşturma felsefesi yukarıdan aşağıya daha çok kabul edilir.

1- .NET MAUI kodu yazarak (örneğin, iOS veya Android kodu yerine) bir cross platform uygulaması oluşturursunuz.

2- İsterseniz, yine de uygulamanıza platforma veya işletim sistemine özel kod yazabilirsiniz, ancak bunu yapmak zorunda değilsiniz.

3- .NET MAUI, kodunuzu alır ve hedef platform için derler. .NET MAUI’nin çeşitli platformlar için uygulamanızı nasıl oluşturduğunu anlamak, bir .NET MAUI uygulaması oluşturmak için gerekli değildir, ancak bu platformları iyi anlamak faydalıdır.

.NET MAUI, Xamarin.Forms‘un bir sonraki sürümünden çok daha fazlasıdır. Xamarin, .NET’ten bağımsız olarak yüklediğiniz bir yazılım SDK’sı iken, MAUI bir workload, yani tıpkı ASP veya konsol uygulaması geliştirme gibi .NET’in bir parçasıdır.

Visual Studio içerisindeki proje template’leri:

.NET MAUI App: Bu, yeni .NET MAUI uygulamaları oluşturmak için kullanılan ana şablondur.

.NET MAUI Blazor App: Bu template, kullanıcı arabirimini tanımlamak için Blazor kullanan yeni bir .NET MAUI uygulaması oluşturmak için kullanılır.

.NET MAUI Class Library: Bu template, farklı .NET MAUI projeleri arasında kod paylaşımı için yeni bir class library oluşturur.

Tüm konuştuklarımızı özetlemek gerekirse;

1- .NET MAUI bir cross platformdur, bir kez yazılır, her yerde çalıştırılır. WORA (Write Once Run Anywhere) UI uygulama platformudur. Yalnızca bir .NET MAUI uygulaması oluşturabilirsiniz ve daha fazla değişiklik yapmadan birden çok platformda çalışacaktır.

2- .NET MAUI ile native uygulamalar yazabilirsiniz. .NET MAUI uygulamaları native uygulamalardır.

3- .NET MAUI’de web uygulamalarına göre işlevsel, performans ve güvenlik avantajları olan uygulamalar oluşturabilirsiniz.

4- .NET MAUI uygulamaları oluşturmak için tüm .NET ekosistemini kullanabilirsiniz. Bu, tüm favori NuGet paketlerinizi ve bir .NET geliştiricisi olarak tüm becerilerinizi içerir.

5- .NET MAUI uygulama kullanıcı arabirimlerini XAML, C#, F# veya Blazor’da yazabilirsiniz.

Visual Studio 2022 | DataTips penceresini sabitleme

Visual Studio 2022 17.1 Preview 2 ile birlikte, DataTips penceresini sabitleme özelliği geldi.

Şimdiye kadarki versiyonlarda datatips penceresi fareyi üzerinden çektiğiniz anda kayboluyordu ve çok derin bir listeye bakıyorsanız hepsini baştan açmanız gerekmekteydi. Doğal olarak çok sinir bozucu olabiliyor bu durum.

VS 2022 ile birlikte, bu pencereyi pencerenin dışında bir yere tıklamadığınız sürece sabitleyebileceğiniz bir özellik geldi. Bunun için Tools -- Options -- Debugging -- General kısmındaki “Keep expanded data tips open until clicked away” seçeneğini aktif edebilirsiniz.

Kaynaklar: https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes#1712–visual-studio-2022-version-1712-newreleasebutton

JIT Derleyicisine Giriş – Loop Cloning ve Loop Hoisting

.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler‘ın Loop cloning ve Loop Hoisting (Loop-invariant code motion olarak ta geçiyor) konularında yaptıklarına değindik bu videoda.

Kaynaklar:

https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA+ABATARgLABQGAzAATakDCphA3oaY6QPTOkAyEEADlQDYQAdgEtBAc1IA3GBy68AEhGEBnAC6ixDJiXIpSAWRwAKUaoDaAXVIBDKFAA0pUzcfPgAShoEmpWj59a/qQAZtAmgqpOpAC8pAAMANxRADykOHGJTgDUWe6B/vTeQf62UGbCVrHWpFmkwAn5PgC++S1FjPmssjz8QhqkgHqAtqp8toCMgPmdbAAqwrzOEHwAttZ8E+0sbABC1srCkcDCUDZQqmOA+oCkiytrU6Sp16vrARtdAAowANbCKSdQAHTsGDiVQACwA/JMNp0AFQ6DB6fRYcLmKylVwRFxOTEeLw+QrFJzBIylQHAsRgmKxOKkNBoP5kkGg+5pDJxPIbfGNYpiCCqCCkZQCADuDU5TDahO5jEktlIoKUahiNhqdTFUvFjFCUCMsuOP2pSR+qXSGSNOQ5hIJhKYpXKlXlitU6uKkuK0vIAHYXUEPUKIMKQB7tbq5Qb4kaWabMsILR7rTa/vbldVavUPW7GE0YcxCE0gA===

https://en.wikipedia.org/wiki/Loop-invariant_code_motion

https://github.com/dotnet/coreclr/blob/master/src/jit/loopcloning.cpp