NHỮNG ĐIỀU THÚ VỊ VỀ .NET

Hybrid Technologies muốn chia sẻ với các bạn những kiến thức thú vị về .NET sau khi tổng hợp qua quá trình làm việc, thảo luận. Nếu bạn đang trên con đường “theo đuổi” .NET hay đơn giản là bạn yêu thích ngôn ngữ này và muốn có thêm nhiều kiến thức về nó, đừng bỏ qua bài viết này của chúng mình nhé!

Các tham số luôn thay đổi giá trị

Dưới đây là một ví dụ đơn giản:

int testParameter = -1;

Int32.TryParse(“abc”, out testParameter);

Giá trị của testParameter sẽ thay đổi như thế nào sau khi TryParse được thực thi?

Các bạn có thể tự mình kiểm tra được bằng cách đặt nó trong console application và hiển thị kết quả của testParameter, nếu bạn mong đợi giá trị của nó sẽ là -1, bạn đã nhầm. Ngay cả khi TryParse không thực thi thành công, giá trị của biến số nguyên (int) sẽ trở về giá trị mặc định, vì vậy nó sẽ là 0 (zero). Và đây là những gì MSDN nói về các tham số: This parameter is passed uninitialized; any value originally supplied in result will be overwritten.

(Tạm dịch “Tham số này được thông qua chưa được khởi tạo; mọi giá trị ban đầu được cung cấp trong kết quả sẽ được ghi đè.”)

Sử dụng HashSet cho những phần tử riêng biệt

Dưới đây là ví dụ một đoạn code ở khá nhiều dự án:

List<string> uniqueItems = new List<string>();
if(!uniqueItems.Contains(parameter))
{
   uniqueItems.Add(parameter);
}

Có vấn đề gì với đoạn code này? Dĩ nhiên là không, nó hoạt động nhưng sẽ là vấn đề hiệu suất khi sử dụng quá nhiều. Trước đây với .NET 3.0 mọi người thường tạo các “Dictionaries” với các khóa sưu tập (key collection) cho các danh sách riêng biệt với các giá trị được gán là NULL. Nhưng kể từ .NET Framework 3.5 chúng ta có class có tên gọi là HashSet<T>. Đó là một collection mà không có bất kì sự trùng lặp phần tử nào.

Và như vậy đoạn code nhanh hơn sẽ là:

HashSet<string> uniqueItems = new HashSet<string>();
if(!uniqueItems.Contains(parameter))
{
   uniqueItems.Add(parameter);
}

Thậm chí, chúng ta có thể loại bỏ Contains bởi vì Add sẽ không thêm phần tử khi bị trùng lặp và chỉ trả lại False (hoặc True nếu đã thêm được phần tử). Và một lần nữa code của chúng ta sẽ trở thành:

HashSet<string> uniqueItems = new HashSet<string>();
uniqueItems.Add(parameter);

Vậy là chúng ta đã cải thiện được hiệu suất đáng kể cho project.

Các biến trong hàm có thể đặt trong chỉ dấu ngoặc

Trong Pascal, bạn phải khai báo tất cả các biến mà hàm của bạn sẽ sử dụng khi thực thi hàm. Rất may ngày nay chúng ta có thể vừa khởi tạo, gán giá trị và dùng luôn, điều này ngăn ngừa việc vô tình sử dụng biến trước khi bạn muốn. Mặt hạn chế là việc này dừng bạn sử dụng nó khi bạn muốn. Cho phép dùng luôn các câu lệnh điều kiện và lặp như / if / while / use,… điều đáng ngạc nhiên là bạn có thể khai báo các biến trong dấu ngoặc mà không cần từ khóa để đạt được kết quả tương tự:

private void MultipleScopes() { 
{ var a = 1; Console.WriteLine(a); } 
{ var b = 2; Console.WriteLine(a); } 
}

Việc này khá hữu ích, khối lệnh thứ hai sẽ được biên dịch như một giải pháp ưu tiên, điều đó tốt hơn là chia hàm của bạn thành các thành phần nhỏ hơn bằng cách sử dụng phương thức tái cấu trúc trích xuất.

Thứ tự khai báo các biến tĩnh trong mã nguồn cần được chú ý

Một số người cho rằng các biến tĩnh được sắp xếp theo thứ tự bảng chữ cái và có những công cụ có thể sắp xếp lại các biến đó cho bạn, tuy nhiên có một kịch bản sắp xếp lại biến tĩnh có thể phá vỡ ứng dụng của bạn.

static class Program { 
   private static int a = 5;
   private static int b = a; 
   static void Main(string[] args) { 
       Console.WriteLine(b); 
   } 
}

Đoạn mã trên sẽ in giá trị 5. Hoán đổi vị trí khai báo cho a và b và nó sẽ xuất **.

Các biến đối tượng riêng của một lớp có thể được truy cập bởi các đối tượng khác

Bạn có thể nghĩ đoạn mã sau đây sẽ hoạt động:

class KeepSecret { 
    private int someSecret;
    public bool Equals(KeepSecret other) {
        return other.someSecret == someSecret; 
    } 
}

Chúng ta dễ dàng nghĩ đến thuộc tính private nghĩa là chỉ có lớp chứa đối tượng này mới truy cập được chúng nhưng thực tế là kể cả các đối tượng khác của lớp này cũng có thể truy cập được nó. Điều này thực sự khá hữu ích trong một số phương pháp so sánh.

Chỉ mục có thể sử dụng nhiều tham số

Chúng ta đều biết biểu mẫu lập chỉ mục thông thường x = Something [“a”] và để thực hiện nó, bạn viết:

public string this[string key] { 
    get { return internalDictionary[key]; } 
}

Nhưng bạn có biết rằng bạn có thể sử dụng thông số để cho phép viết như thế này x = something[“a”, “b”, “c”, “d”]?

Đơn giản chỉ cần viết chỉ mục của bạn như sau:

public IEnumerable<string> this[params string[] keys] {
    get { return keys.Select(key => internalDictionary[key]).AsEnumerable(); } 
}

Điều thú vị là bạn có thể có cả hai bộ chỉ mục trong cùng một lớp. Nếu bạn vượt qua một mảng hoặc nhiều đối số, bạn sẽ nhận được một IEnumerable được gọi với một đối số duy nhất và nhận được một giá trị duy nhất.

Nguồn tham khảo: Hackernoon

Facebook Comments
Đánh giá bài viết

Bạn thích bài viết này chứ?
Đăng ký để nhận những bài viết thú vị như thế hàng tuần.

Đừng sợ thất bại, chỉ sợ việc dậm chân tại chỗ

TÌM VIỆC
Bình luận