paint-brush
7 khái niệm chính để kiểm tra kỹ năng .NET của bạntừ tác giả@ssukhpinder
Bài viết mới

7 khái niệm chính để kiểm tra kỹ năng .NET của bạn

từ tác giả Sukhpinder Singh7m2024/09/30
Read on Terminal Reader

dài quá đọc không nổi

Bài viết này đề cập đến các khái niệm quan trọng về C# dành cho các nhà phát triển .NET, bao gồm IEnumerable so với ICollection, Dependency Injection, async/await, ref so với out tham số, xử lý ngoại lệ và sự khác biệt giữa Task và Thread trong lập trình đồng thời. Bài viết cung cấp các ví dụ mã thực tế để kiểm tra và đào sâu hiểu biết của bạn.
featured image - 7 khái niệm chính để kiểm tra kỹ năng .NET của bạn
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item
3-item

Bài viết này hoàn hảo cho bất kỳ ai muốn chứng minh trình độ chuyên môn về .NET của mình!


Xin chào các nhà phát triển .NET,


Trong bài viết này, tôi sẽ khám phá các khái niệm C# khác nhau mà mọi nhà phát triển phải biết. Luôn là một ý tưởng tuyệt vời để kiểm tra kiến thức của bạn và tôi đã đưa ra một số ví dụ trong bài viết này với các giải thích và ví dụ về mã.


Nếu bạn biết và hiểu các ví dụ mã, có thể bạn đang làm khá tốt trong .NET.

1. Sự khác biệt giữa IEnumerable<T> so với ICollection<T>

Khi viết logic trong C# , các nhà phát triển thường gặp IEnumerable<T> và ICollection<T>. Chúng có thể trông khá giống nhau nhưng chúng phục vụ các mục đích khác nhau trong phát triển phần mềm.


  • IEnumerable<T> hoạt động như giao diện cơ sở cho các bộ sưu tập không chung chung. Nó giúp lặp lại một bộ sưu tập có kiểu được xác định.


Tốt nhất là có một bộ sưu tập nhẹ an toàn hơn vì không được phép thao tác dữ liệu. Bất kỳ bộ sưu tập nào nếu bạn muốn ngăn chặn thao tác dữ liệu, nên sử dụng 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> mở rộng IEnumerable<T> cho phép sửa đổi với sự trợ giúp của các phương pháp thay đổi. Giao diện này bao gồm các phương pháp để thêm, xóa và kiểm tra số lượng trong bộ sưu tập.


 ICollection<int> data = new List<int> { 12,43,556}; numbers.Add(4); Console.WriteLine(data.Count); // Outputs: 4

Nên sử dụng ICollection<T> khi cần phương thức thay đổi cho bộ sưu tập và IEnumerable<T> cho các hành động đọc đơn giản.

2. Vai trò của Dependency Injection trong .NET Core

Nên sử dụng mẫu thiết kế DI khi bạn muốn viết mã có thể kiểm tra và liên kết lỏng lẻo. Với DI, các nhà phát triển có thể quản lý sự phụ thuộc giữa các lớp một cách dễ dàng.


.NET Core có hỗ trợ tích hợp cho DI, giúp việc triển khai trở nên dễ dàng.


Làm thế nào một nhà phát triển có thể triển khai DI trong C#

  • Đăng ký dịch vụ trong phương thức ConfigureServices của tệp Startup.cs. Đây là nơi bạn xác định dịch vụ nào sẽ có sẵn để tiêm.
 public void ConfigureServices(IServiceCollection services) { // Register a transient service services.AddTransient<IMyService, MyService>(); }


  • Tiêm dịch vụ vào các lớp của bạn thông qua constructor injection. Điều này đảm bảo rằng các lớp của bạn nhận được các phụ thuộc của chúng mà không cần phải tạo chúng trực tiếp.
 public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { var data = _myService.GetData(); return View(data); } }

Mã sẽ dễ bảo trì và kiểm tra hơn khi nhà phát triển tách biệt việc tạo ra các dịch vụ.

3. Sự khác biệt giữa tham số ref và out

Trong C#, ref và out được sử dụng để truyền tham số theo tham chiếu, nhưng chúng có những đặc điểm riêng biệt.

  • tham số ref yêu cầu biến phải được khởi tạo trước khi được truyền vào phương thức. Sau đó, phương thức có thể sửa đổi giá trị của biến.
 public void UpdateValue(ref int number) { number += 10; } int myNumber = 5; UpdateValue(ref myNumber); Console.WriteLine(myNumber); // Outputs: 15


  • tham số out không yêu cầu khởi tạo trước khi được truyền. Phương thức phải gán giá trị cho tham số out trước khi trả về.
 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 thường được sử dụng khi một phương thức cần sửa đổi một biến hiện có, trong khi out được sử dụng khi một phương thức cần trả về nhiều giá trị hoặc khởi tạo các giá trị không được cung cấp bởi trình gọi.

4. Async và Await: Cải thiện hiệu suất ứng dụng

Trong .NET, lập trình bất đồng bộ là điều cần thiết để viết các ứng dụng hiệu quả, hoạt động tốt khi tải. Từ khóa async và await đơn giản hóa việc làm việc với các hoạt động bất đồng bộ.

  • phương thức async cho phép bạn thực hiện các tác vụ một cách không đồng bộ. Đánh dấu phương thức bằng từ khóa async để cho phép sử dụng await bên trong phương thức đó.
 public async Task<string> FetchDataAsync() { await Task.Delay(1000); // Simulates an asynchronous operation return "Data fetched"; }


  • await giúp giao diện người dùng của ứng dụng không chặn luồng chính.
 public async Task ShowDataAsync() { string data = await FetchDataAsync(); Console.WriteLine(data); }

Nếu bạn muốn cải thiện hiệu suất của ứng dụng, hãy sử dụng async và await một cách hiệu quả và đồng thời giữ cho giao diện người dùng của ứng dụng phản hồi nhanh.

5. Xử lý ngoại lệ trong ứng dụng .NET Core

Xử lý ngoại lệ một cách khéo léo là rất quan trọng để duy trì các ứng dụng mạnh mẽ và thân thiện với người dùng. .NET Core cung cấp nhiều cơ chế khác nhau để xử lý ngoại lệ.

  • Xử lý ngoại lệ cục bộ: Sử dụng khối try-catch để bắt và xử lý ngoại lệ.
 try { int result = 10 / 0; // This will throw a DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("An error occurred: " + ex.Message); }


  • Xử lý ngoại lệ toàn cục trong ASP.NET Core có thể được quản lý bằng phần mềm trung gian. Bắt tất cả các loại ngoại lệ ở một nơi chung giúp các nhà phát triển quản lý các thông báo lỗi thân thiện với người dùng/thường gặp cho người dùng.
 public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Home/Error"); }

Phần mềm trung gian xử lý ngoại lệ toàn cục cung cấp một nơi chung để xử lý tất cả các lỗi và ngoại lệ của ứng dụng. Nó đảm bảo ứng dụng xử lý phản hồi một cách nhất quán.

6. Vai trò của appsettings.json ASP.NET Core

Tệp appsettings.json được sử dụng để quản lý thông tin xác thực của ứng dụng, chẳng hạn như chuỗi cấu hình và các khóa cụ thể khác của ứng dụng. Cài đặt cấu hình cũng có thể được chia theo môi trường

  • Ví dụ tệp appsettings.json:
 { "ConnectionStrings": { "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" }, "Logging": { "LogLevel": { "Default": "Warning" } } }


  • Việc truy cập các giá trị cấu hình trong ứng dụng của bạn rất đơn giản khi sử dụng hệ thống cấu hình tích hợp sẵn.
 public class MyService { private readonly string _connectionString; public MyService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } }

Tệp appsettings.json cho phép dễ dàng lấy các thiết lập cấu hình, cần được xử lý hiệu quả.

7. Hiểu về Task và Thread trong C#

Cả Task và Thread đều được sử dụng để lập trình đồng thời trong C#, nhưng chúng phục vụ các mục đích khác nhau.

  • Luồng biểu thị một đường dẫn thực thi duy nhất và là một cấu trúc cấp thấp hơn. Nó cung cấp nhiều quyền kiểm soát hơn đối với việc thực thi nhưng yêu cầu quản lý thủ công.
 Thread thread = new Thread(() => { Console.WriteLine("Running on a new thread"); }); thread.Start();


  • Nhiệm vụ cung cấp chức năng trừu tượng để triển khai các hoạt động bất đồng bộ và được sử dụng cùng với async/await.
 Task.Run(() => { Console.WriteLine("Running asynchronously"); });

Nhiệm vụ đơn giản hóa việc quản lý các hoạt động không đồng bộ và thường là lựa chọn ưu tiên cho quá trình phát triển C# hiện đại.


Truy cập vào toàn bộ Series phỏng vấn C# .Net

Vậy, bạn đã làm thế nào?

Nếu bạn biết rõ khái niệm này và hiểu các ví dụ mã, có thể bạn rất thành thạo về .NET.

Hãy tiếp tục cuộc trò chuyện và giúp đỡ nhau phát triển thành chuyên gia .NET.


Chúc bạn viết mã vui vẻ!