Ky artikull është i përsosur për këdo që dëshiron të provojë ekspertizën e tyre .NET!
Përshëndetje zhvilluesit e .NET,
Në këtë artikull, unë do të eksploroj koncepte të ndryshme C# që çdo zhvillues duhet të dijë. Është gjithmonë një ide e shkëlqyer për të testuar njohuritë tuaja dhe unë kam bashkuar disa shembuj në këtë artikull me shpjegime dhe shembuj kodesh.
Nëse i njihni dhe i kuptoni shembujt e kodit, ka të ngjarë të jeni mjaft mirë në .NET.
Gjatë shkrimit të logjikës në C# , zhvilluesit shpesh hasin IEnumerable<T> dhe ICollection<T>. Ato mund të duken mjaft të ngjashme, por ato shërbejnë për qëllime të ndryshme në zhvillimin e softuerit.
Është mirë të kesh një koleksion të lehtë që është më i sigurt, pasi manipulimi i të dhënave nuk lejohet. Çdo koleksion nëse doni të parandaloni manipulimin e të dhënave, rekomandohet të përdorni IEnumerable<T>
IEnumerable<int> numbers = new List<int> { 1, 2, 3 }; foreach (var number in numbers) { Console.WriteLine(number); // Outputs: 1 2 3 }
ICollection<T> shtrihet IEnumerable<T> lejon modifikime me ndihmën e metodave të ndryshimit. Kjo ndërfaqe përbëhet nga metoda për të shtuar, hequr dhe kontrolluar numërimet në koleksion.
ICollection<int> data = new List<int> { 12,43,556}; numbers.Add(4); Console.WriteLine(data.Count); // Outputs: 4
Rekomandohet për ICollection<T> kur kërkohen metoda të ndryshme për mbledhjen dhe IEnumerable<T> për veprime të thjeshta leximi.
Rekomandohet të përdorni një model dizajni DI kur dëshironi të shkruani kod të lidhur lirshëm dhe të testueshëm, d.m.th. Me DI, zhvilluesit mund të menaxhojnë lehtësisht varësitë midis klasave.
.NET Core ka mbështetje të integruar për DI, duke e bërë të lehtë zbatimin.
Si një zhvillues mund të zbatojë DI në C#
public void ConfigureServices(IServiceCollection services) { // Register a transient service services.AddTransient<IMyService, MyService>(); }
public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { var data = _myService.GetData(); return View(data); } }
Një kod është më i mirëmbajtur dhe i testueshëm kur një zhvillues shkëput krijimin e shërbimeve.
Në C#, ref dhe out përdoren për të kaluar parametrat me referencë, por ato kanë karakteristika të dallueshme.
public void UpdateValue(ref int number) { number += 10; } int myNumber = 5; UpdateValue(ref myNumber); Console.WriteLine(myNumber); // Outputs: 15
public void GetValues(out int value1, out int value2) { value1 = 10; value2 = 20; } GetValues(out int a, out int b); Console.WriteLine(a); // Outputs: 10 Console.WriteLine(b); // Outputs: 20
ref zakonisht përdoret kur një metodë duhet të modifikojë një variabël ekzistues, ndërsa out përdoret kur një metodë duhet të kthejë vlera të shumta ose të inicializojë vlera që nuk janë dhënë nga thirrësi.
Në .NET, programimi asinkron është thelbësor për të shkruar aplikacione efikase që performojnë mirë nën ngarkesë. Fjalët kyçe të asinkronizimit dhe pritjes thjeshtojnë punën me operacionet asinkrone.
public async Task<string> FetchDataAsync() { await Task.Delay(1000); // Simulates an asynchronous operation return "Data fetched"; }
public async Task ShowDataAsync() { string data = await FetchDataAsync(); Console.WriteLine(data); }
Nëse dëshironi të përmirësoni performancën e aplikacionit tuaj, përdorni asinkronizimin dhe prisni në mënyrë efektive dhe në të njëjtën kohë duke e mbajtur ndërfaqen e aplikacionit të përgjegjshëm.
Trajtimi me hijeshi i përjashtimeve është thelbësor për ruajtjen e aplikacioneve të fuqishme dhe miqësore për përdoruesit. .NET Core ofron mekanizma të ndryshëm për trajtimin e përjashtimeve.
try { int result = 10 / 0; // This will throw a DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("An error occurred: " + ex.Message); }
public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Home/Error"); }
Softueri i mesëm për trajtimin e përjashtimeve globale ofron një vend të përbashkët për të trajtuar të gjitha gabimet dhe përjashtimet e aplikacionit. Siguron që aplikacioni të trajtojë vazhdimisht përgjigjet.
Skedari appsettings.json përdoret për menaxhimin e kredencialeve të aplikacionit, të tilla si vargjet e konfigurimit dhe çelësat e tjerë specifikë të aplikacionit. Cilësimet e konfigurimit mund të ndahen gjithashtu sipas mjediseve
{ "ConnectionStrings": { "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" }, "Logging": { "LogLevel": { "Default": "Warning" } } }
public class MyService { private readonly string _connectionString; public MyService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } }
Skedari appsettings.json lejon marrjen e lehtë të cilësimeve të konfigurimit, të cilat duhet të trajtohen me efikasitet.
Të dy Task dhe Thread përdoren për programim të njëkohshëm në C#, por ato shërbejnë për qëllime të ndryshme.
Thread thread = new Thread(() => { Console.WriteLine("Running on a new thread"); }); thread.Start();
Task.Run(() => { Console.WriteLine("Running asynchronously"); });
Detyrat thjeshtojnë menaxhimin e operacioneve asinkrone dhe shpesh janë zgjedhja e preferuar për zhvillimin modern të C#.
Nëse e dini konceptin me besim dhe i kuptoni shembujt e kodit, ka të ngjarë të jeni të aftë për .NET.
Le të vazhdojmë bisedën dhe ta ndihmojmë njëri-tjetrin të rritemi si profesionistë të .NET.
Gëzuar kodimin!