Quản lý phạm vi truy cập với Access Modifiers trong C#

Trong ngôn ngữ lập trình C#, Access Modifiers (từ khóa chỉ định truy cập) đóng vai trò quan trọng trong việc thực hiện tính đóng gói (encapsulation). Chúng xác định mức độ hiển thị của các lớp (class) và các thành phần bên trong lớp đối với các thành phần khác trong cùng một chương trình hoặc từ các chương trình bên ngoài. Phạm vi truy cập ...

Đăng vào ngày 18 tháng 8 lúc 11:05

Zenith.NET: Tích hợp Metal Backend, Hành trình trừu tượng GPU đa nền tảng cho .NET

Zenith.NET đã đạt được mục tiêu ban đầu là cung cấp một bộ API .NET duy nhất để hoạt động trên nhiều backend đồ họa khác nhau, với việc tích hợp thành công backend Metal. Việc phát triển đã tiến triển từ việc khởi tạo `GraphicsContext.CreateDirectX12()` đến việc chạy thành công tất cả các bài kiểm tra với `GraphicsContext.CreateMetal()`. Bài v ...

Đăng vào ngày 1 tháng 8 lúc 16:40

Giải mã Base64 Steganography trong C# .NET

Gần đây tôi được mời tham gia một cuộc thi CTF, và trong kỳ nghỉ lễ端午节, tôi đã làm thử một số bài tập trực tuyến. Một số bài yêu cầu lập trình, phần lớn hướng dẫn trên mạng đều viết bằng Python, trong khi ngôn ngữ backend tôi quen dùng là C#. Việc đọc hiểu script Python khá vất vả vì có nhiều hàm phải tra cứu cách sử dụng, nên tôi quyết định ...

Đăng vào ngày 12 tháng 7 lúc 17:46

Các tính năng và kỹ thuật nâng cao trong C#

Danh sách (List) 1. Phần tử bên trong là kiểu tham chiếu src[0].Name là "11", cho thấy tham chiếu đã bị sửa đổi. List<NguonDuLieu> danhSachNguon = new List<NguonDuLieu>(); danhSachNguon.Add(new NguonDuLieu() { Ten = "1", Tuoi = 1, MoTa = "1" }); danhSachNguon.Add(new NguonDuLieu() { Ten = "2", Tuoi = 2, MoTa = "2" }); foreach (var n ...

Đăng vào ngày 9 tháng 7 lúc 15:48

Sự khác biệt giữa @bind và @bind-value trong Blazor

Trong Blazor, cơ chế liên kết dữ liệu hai chiều được hỗ trợ qua hai chỉ thị chính: @bind và @bind-value. Mặc dù cả hai đều đạt mục tiêu chung là đồng bộ hóa giá trị giữa giao diện người dùng và mô hình dữ liệu, cách thức triển khai và phạm vi linh hoạt lại khác biệt rõ rệt. 1. @bind — Cú pháp rút gọn cho trường hợp phổ biến Đây là cú pháp đượ ...

Đăng vào ngày 1 tháng 7 lúc 03:43

Triển khai Ứng dụng .NET Core bằng Docker Compose

Để bắt đầu, hãy tạo một dự án Web API mới và cấu hình nó để hỗ trợ Docker. Thêm việc đọc các biến môi trường vào cấu hình: config.AddEnvironmentVariables(); using DemoApi; var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureAppConfiguration(config => { config.AddEnvironmentVariables(); }); // Thêm các dịch vụ vào ...

Đăng vào ngày 28 tháng 6 lúc 21:01

Kết hợp Runtime Library và Source Generator trong một gói NuGet duy nhất

Các thư viện phổ biến như CommunityToolkit.Mvvm cung cấp một trải nghiệm lập trình mượt mà bằng cách vừa cung cấp các API để gọi trực tiếp, vừa tự động sinh mã nguồn thông qua Source Generator. Thực tế, cơ chế này không nằm trong một dự án duy nhất mà là sự kết hợp của hai thành phần riêng biệt được đóng gói chung vào một tệp NuGet. Cấu trúc g ...

Đăng vào ngày 25 tháng 5 lúc 10:27

Triển khai các phép nối dữ liệu Inner, Left và Right bằng LINQ trong C#

Trong quá trình phát triển ứng dụng .NET, việc tổng hợp dữ liệu từ nhiều collection khác nhau là một yêu cầu phổ biến. LINQ (Language Integrated Query) cung cấp các toán tử mạnh mẽ để thực hiện các phép nối tương tự như cấu trúc SQL ngay trên mã nguồn C#. Bài viết này sẽ hướng dẫn cách thực hiện Inner Join, Left Join và Right Join sử dụng cả cú ...

Đăng vào ngày 23 tháng 5 lúc 20:36

Triển khai gRPC trong .NET: Xử lý Yêu cầu và Dòng Dữ liệu

Cấu trúc Protocol Buffer cơ bản Để sử dụng kiểu dữ liệu rỗng, cần khai báo thư viện: import "google/protobuf/empty.proto"; Kiểu dữ liệu rỗng được định nghĩa là google.protobuf.Empty. Với mảng, sử dụng từ khóa repeated. Mẫu tệp .proto tiêu chuẩn syntax = "proto3"; option csharp_namespace = "UserManagementService"; package usermgmt; import "goo ...

Đăng vào ngày 19 tháng 5 lúc 17:15