Một số cách tối ưu code và performance c#

Mở đầu Trong bài viết này, chúng ta sẽ tìm hiểu một số mẹo và thủ thuật C# hữu ích về cách cải thiện chất lượng và hiệu suất khi viết code. Đầu tiên, chúng ta sẽ tìm hiểu cách cải thiện chất lượng code của mình bằng một số mẹo liên quan đến khả

Mở đầu

Trong bài viết này, chúng ta sẽ tìm hiểu một số mẹo và thủ thuật C# hữu ích về cách cải thiện chất lượng và hiệu suất khi viết code.
Đầu tiên, chúng ta sẽ tìm hiểu cách cải thiện chất lượng code của mình bằng một số mẹo liên quan đến khả năng đọc và giảm reducing nesting code.
Sau đó, chúng ta sẽ thấy một số lưu ý khi nói đến việc xử lý ngoại lệ mà chúng ta cần lưu ý.
Khi code chúng ta rất hay bắt gặp các trường hợp

  • Guarding against null values : Kiểm tra các giá trị null
  • If-else statements : Lệnh if-else
  • Exception handling : Bắt exception
Cách kiểm tra null
  • Khắ chắc rằng trong bất kỳ dự án lớn nhỏ nào chúng ta đều có đoạn check null. Nếu object return null thì exception NullReferenceException được throw. Bình thường chúng ta sẽ viết
    var product = GetProduct();
    if (product == null)
    {
        // Do something if the object is null.
    }
  • Một cách check null khá hay và hiệu vơi is và is not quả ở C#9
    var product = GetProduct();
    if (product is not null)
    {
        // Do something if the object is not null.
    }
Tối ưu code với if- else
    Product PurchaseProduct(int id)
    {
        var product = GetProduct(id);
        if (product.Quantity > 0)
        {
            product.Quantity--;
            return product;
        }
        else
        {
            SendOutOfStockNotification(product);
            return null;
        }
    }
  • Khá loằng ngoằng. Ở đây chúng ta có thể xóa hẳn câu lệnh else ở dưới đi
    Product PurchaseProduct(int id)
    {
        var product = GetProduct(id);
        if (product.Quantity > 0)
        {
            product.Quantity--;
            return product;
        }
        SendOutOfStockNotification(product);
        return null;
    }
  • Nhìn có vẻ clear hơn nhưng nếu product null thì sao nhỉ. Bình thường thì chúng ta sẽ viết code như thế này
    bool IsProductInStock(int id)
    {
        var product = GetProduct(id);
        if (product is not null)
        {
            if (product.Quantity > 0)
            {
                return true;
            }
        }
        return false;
    }
  • Ở đây chúng ta thấy có 2 cái if lồng nhau. Để đảm bảo early return principle thì chúng ta nên viết
    bool IsProductInStock(int id)
    {
        var product = GetProduct(id);
        if (product is null)
        {
            return false;
        }
        if (product.Quantity <= 0)
        {
            return false;
        }
        return true;
    }
  • Gọn hơn một chút thì chúng ta nên gộp 2 câu if kia vào thành 1
    bool IsProductInStock(int id)
    {
        var product = GetProduct(id);
        if (product is null || product.Quantity <= 0)
        {
            return false;
        }
        return true;
    }
Sử dụng using
  • Câu lệnh using đảm bảo rằng Dispose (hoặc DisposeAsync) được gọi ngay cả khi một ngoại lệ xảy ra trong khối using. Tìm hiểu thêm về using
    Một cách bình thường nhất khi chúng ta sử dụng using
    using (var streamReader = new StreamReader("..."))
    {
        string content = streamReader.ReadToEnd();
    }
  • Ở c#8 thì chúng ta có thể bỏ luôn dấu ngoặc kép sau using nhưng thế này
    using var streamReader = new StreamReader("...");
    string content = streamReader.ReadToEnd();
Tối ưu cách đọc một Logical Expression
  • Ví dụ chúng ta có một hàm để check xem ký tự truyền vào có phải một chữ cái hay không
    bool IsLetter(char ch) => (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
  • Ở C# 9 thì chúng ta có một cách viết đơn giản hơn. Chúng ta không cần truyền nhiều lần param ch vào nữa
    bool IsLetter(char ch) => ch is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');
Xóa if-else khi check bool values
  • Cách viết bình thường
    bool IsInStock(Product product)
    {
        if (product.Quantity > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  • Đơn giản hơn
    bool IsInStock(Product product)
    {
        return product.Quantity > 0;
    }

hoặc

    bool IsInStock(Product product) => product.Quantity > 0;
Với switch case thì sao
  • Ví dụ chúng ta có một đoạn switch check xem hôm nay có phải ngày cuối tuần hay không.
    switch (DateTime.Now.DayOfWeek)
    {
        case DayOfWeek.Monday:
            return "Not Weekend";
        case DayOfWeek.Tuesday:
            return "Not Weekend";
        case DayOfWeek.Wednesday:
            return "Not Weekend";
        case DayOfWeek.Thursday:
            return "Not Weekend";
        case DayOfWeek.Friday:
            return "Not Weekend";
        case DayOfWeek.Saturday:
            return "Weekend";
        case DayOfWeek.Sunday:
            return "Weekend";
        default:
            throw new ArgumentOutOfRangeException();
    }
  • Hoàn toàn có thể viết ngắn gọn lại
    switch (DateTime.Now.DayOfWeek)
    {
        case DayOfWeek.Monday:
        case DayOfWeek.Tuesday:
        case DayOfWeek.Wednesday:
        case DayOfWeek.Thursday:
        case DayOfWeek.Friday:
            return "Not Weekend";
        case DayOfWeek.Saturday:
        case DayOfWeek.Sunday:
            return "Weekend";
        default:
            throw new ArgumentOutOfRangeException();
    }
  • hoặc với C# 8
    DateTime.Now.DayOfWeek switch
    {
        DayOfWeek.Monday => "Not Weekend",
        DayOfWeek.Tuesday => "Not Weekend",
        DayOfWeek.Wednesday => "Not Weekend",
        DayOfWeek.Thursday => "Not Weekend",
        DayOfWeek.Friday => "Not Weekend",
        DayOfWeek.Saturday => "Weekend",
        DayOfWeek.Sunday  => "Weekend",
        _ => throw new ArgumentOutOfRangeException()
    }
  • với C# 9
    DateTime.Now.DayOfWeek switch
    {
        DayOfWeek.Monday or DayOfWeek.Tuesday or DayOfWeek.Wednesday or DayOfWeek.Thursday or DayOfWeek.Friday => "Not Weekend",
        DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
        _ => throw new ArgumentOutOfRangeException()
    }
  • dùng not trong C# 9
    DateTime.Now.DayOfWeek switch
    {
        not (DayOfWeek.Saturday or DayOfWeek.Sunday) => "Not Weekend",
        DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
        _ => throw new ArgumentOutOfRangeException()
    }
Cách tối hơn khi filter exception
  • Ví dụ chúng ta có một đoạn filter exception 400 bad request với 404 not found
    try
    {
        await GetBlogsFromApi();
    }
    catch (HttpRequestException e)
    {
        if (e.StatusCode == HttpStatusCode.BadRequest)
        {
            HandleBadRequest(e);
        }
        else if (e.StatusCode == HttpStatusCode.NotFound)
        {
            HandleNotFound(e);
        }
    }
  • đơn giản và clear hơn khi dùng với when
    try
    {
        await GetBlogsFromApi();
    }
    catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.BadRequest)
    {
        HandleBadRequest(e);
    }
    catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound)
    {
        HandleNotFound(e);
    }

Tóm lại

Ở đây mình tổng hợp một số trick thường được dùng hoặc là mình hay dùng để tối ưu code. Cho dòng code ngắn gọn dễ hiểu và performance tốt hơn trong C#. Cảm ơn các bạn đã theo dõi ❤️

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ