Bài viết mới

Có gì mới trong C# 6.0?

Có gì mới trong C# 6.0?
Đăng bởi: Mr. Cùi Bắp - Lượt xem: 775 00:54:11, 21/01/2016EBOOK

Nếu bạn nào thường xuyên cập nhật những phiên bản mới của Visual Studio thì sẽ biết là kèm theo bộ Visual Studio 2015 là C# 6.0. Vậy trong phần nâng cấp này của C# có gì mới và cải tiến?
Thật ra thì không có những thay đổi vượt bậc như đã từng bổ sung Linq hay lập trình bất đồng bộ async/await mà chủ yếu là cải tiến để code đơn giản,dễ nhìn, gọn và đẹp hơn.  Giờ chúng ta hãy tìm hiểu một số cải tiến mới có trên C# 6.0 nhé: 

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{
   {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{
   [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");
}
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

Link download Ebook mới nhất về C# 6.0 của Nutshell (Tiếng Anh)

Link tham khảo: toidicodedao.wordpress.com

Có gì mới trong C# 6.0?
Đăng bởi: Mr. Cùi Bắp - Lượt xem: 775 00:54:11, 21/01/2016EBOOK

THẢO LUẬN BÀI VIẾT