Series C# hay ho: C# 6 có gì hay ho nào

Gần đây, mình tập trung viết một số bài về định hướng nghề nghiệp và phát triển bản thân mà ít viết về công nghệ. Vì vậy hôm nay mình quyết định tiếp tục viết series C# hay ho. Ở bài này, mình sẽ giới thiệu những cải tiến được Microsoft tích hợp vào C# 6. Bạn nào muốn biết thêm về sự phát triển của C# từ bản 1.0 lên 5.0 hãy đọc bài cũ của mình ở đây nhé.

Ở phiên bản này, C# không có nhiều cải tiến to lớn như Linq, hay async/await. Những thay đổi của bản 6 giúp việc viết code dễ hơn, code ngắn gọn và đẹp hơn.

1. Hàm nameof()

Đôi khi, ta cần lấy tên của một param dưới dạng string, trước đây ta phải hardcode như sau.

public void Delete(int id)
{
    //Call database to delete
    //"id" là hardcode tên param id
    _log.Info("id " + id + "is deleted"); 
}

Khi ta refactor code, đổi tên param, ta phải sửa lại phần đã hardcode.

public void Delete(int studentId)
{
    //Call database to delete
   _log.Info("studentId " + id + "is deleted");
}

Giờ đây với hàm nameof, ta chỉ cần refactor và đổi tên param là được

public void Delete(int studentId)
{
    //Call database to delete
   _log.Info(nameof(studentId) + id + "is deleted");
}

2. Khai báo giá trị mặc định cho property

Trước đây, để khai báo giá trị mặc định cho 1 property, ta phải khai báo trong constructor.

public class Student {

   public int Age { get; set; }

   //Khai báo giá trị mặc định trong instructor
   public Student()
   {
       Age = 18;
   }
}

Giờ đây ta đã có thể khai báo một cách dễ dàng

public class Student {
   //Quá nhanh quá nguy hiểm
   public int Age {get;set;} = 10; 
}

3. Khởi tạo danh sách với index

Một số kiểu collection như Map, Dictionary nhận dữ liệu vào dưới dạng key, value. Với C# 5, bạn sẽ phải gọi hàm khởi tạo như sau:

//Khó đọc
var idsAndNames = new Dictionary<int,string>{
   {1, "Hoang"},
   {2, "Minh"},
   {3, "Hùng"},
};

C#6 ta cho phép ta khởi tạo list với Index, với cú pháp dễ đọc hơn nhiều.

var idsAndNames = new Dictionary<int,string>{
   [1] = "Hoang",
   [2] = "Minh",
   [3] = "Hung"
};

4. Cú pháp using static
Khi viết ứng dụng Console, chắc đôi lúc bạn cũng bực mình vì phải viết Console.? lặp đi lặp lại nhiều lần nhỉ?

Console.ForegroundColor = ConsoleColor.Red;

foreach(int num in Enumerable.Range(1,10)){
   Console.WriteLine("Square of " + num + " is: " + Math.Pow(num,2));
} 

Với phiên bản mới, ta có thể loại bỏ việc lặp đi lặp lại bằng cách khai báo Console, Math, … ở mục using, sử dụng using static

using static Sytem.Console;
using static System.Linq.Enumerable;
using static System.Math

//Code ngắn hơn nhiều
ForegroundColor = ConsoleColor.Red;
foreach(int num in Range(1,10)){
   Console.WriteLine("Square of " + num + " is: " + Pow(num,2));
} 

Tuy nhiên, nếu dùng nhiều quá, code bạn sẽ khó đọc, dễ nhầm lẫn và conflict giữa các using với nhau. Vì vậy nhớ đừng lạm dụng nhé.

5. Dùng lambda expression để khai báo property và method

Với một số function hoặc property của method, ta phải viết một method có return đầy đủ.

public class Student {

    public string Name {get; set;}
    public int Age {get; set;}

    public bool IsOld {
        get { return Age >=20; }
    }
    public string ToString(){
        return "Name: ." + Name +"Age: " + Age;
    }

}

Giờ đây, ta có thể khai báo method đó bằng lambda expression. Lưu ý là ta chỉ nên áp dụng cách này cho các properties/method đơn giản. Những method dài thì hãy viết kiểu cũ.

public class Student {

    public string Name {get; set;}
    public int Age {get;set;}
    
    //Sử dụng lambda expression
    public bool IsOld => Age >=20;
    public string ToString() => "Name: ." + Name +"Age: " + Age;

}

Bạn nào xem không hiểu lắm thì đọc lại bài viết về lambda expression của mình nhé.

6. Format string ngắn gọn

Cá nhân mình thấy đây là cải tiến hay thứ nhì của bản 6. Ngày xưa, khi cần tạo một string, ta thường phải cộng chuỗi, hoặc sử dụng string.Format.

//Class student
public string ToString() {
        return "Name: ." + Name +"Age: " + Age;
}

//Sử dụng string.Format
public string ToString() {
        return string.Format("Name: {0}.Age: {1}", Name, Age);
}

Việc cộng chuỗi rất dễ nhầm lẫn và sai sót. Sử dụng string.Format đỡ sai sót hơn, nhưng đôi khi ta đặt nhầm vị trí các parameter thì sẽ cho kết quả sai. C# 6 đã giới thiệu một cách format string mới với dấu $.

public string ToString() {
        return $"Name: {Name}.Age: {Age}";
}

//Nếu muốn format chữ và số, 
//ta chỉ thêm các kí tự format sau dấu :
public string ToString() {
        return $"Name: {Name}.Age: {Age:0}";
}

Rất hay và dễ đọc/dễ hiểu phải không nào.

7. Toán tử điều kiện null (?.)

Theo mình, đây là cải tiến hay nhất của phiên bản này. Lập trình lâu năm, hẳn bạn nào cũng từng đau đầu vì “NullPointerException“. Để tránh bị Exception này, ta thường phải check null rất nhiều lần, làm code dài dòng như sau

if (response != null && response.Result != null 
             && response.Result.Status == Status.Success) {
      Console.WriteLine("Success");
}

(Các bạn nên xem lại khái niệm short-circuited để biết vì sao đoạn code trên chạy đúng nhé)
Với toán tử ?. mới: nếu đối tượng là null, câu lệnh sẽ trả ra null; nếu đối tượng khác null, câu lệnh sẽ chạy bình thường. Code sẽ ngắn gọn và dễ đọc hơn nhiều.

if (response?.Result?.Status == Status.Success) {
      Console.WriteLine("Success");
}

//Cách viết cũ (Tránh NullPointerException)
if (stream != null) stream.Close();
//Cách viết mới
stream?.Close();

//Vd class Student có property Age kiểu int
//student?.Age sẽ trả về kiểu int? 
//Bạn nên kết hợp với toán tử null (??)

//Lấy tuổi của student, nếu null thì studentAge = 0 
int studentAge = student?.Age ?? 0; 

Lưu ý nho nhỏ là chỉ có phiên bản Visual Studio 2015 mới hỗ trợ cú pháp C# 6.0 nhẹ Mình tạo project mới trong VS2015, dùng VS2013 vẫn mở được nhưng nó không hiểu các cú pháp mới :'(.
Bài viết có tham khảo từ bản gốc tiếng Anh: http://geekswithblogs.net/BlackRabbitCoder/archive/2015/04/27/the-little-wonders-of-c-6—a-presentation-to.aspx

Advertisements

3 thoughts on “Series C# hay ho: C# 6 có gì hay ho nào”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s