- [TOOL] Chia sẻ phần mềm thay đổi thông tin cấu hình máy tính
- [C#] Hướng dẫn Export dữ liệu ra file Microsoft Word Template
- [C#] Chia sẻ source code tool kiểm tra domain website
- [C#] Hướng dẫn tạo file PDF sử dụng thư viện QuestPDF
- [C#] Hướng dẫn tạo ứng dụng dock windows giống Taskbar
- [C#] Chia sẻ source code sử dụng Object Listview trên Winform
- [VB.NET] Chia sẻ source code quản lý thu chi mô hình 3 lớp Winform
- [DATABASE] Xóa lịch sử danh sách đăng nhập tài khoản trên SMSS Sqlserver Management Studio
- [C#] Sử dụng FolderBrowserDialog Vista trên Winform
- [DEVEXPRESS] Chia sẻ tool Winform UI Templates Early Access Preview (EAP)
- [C#] Chia sẻ source code Spin Content (Trộn nội dung văn bản theo từ đồng nghĩa) trên Winform
- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
Có gì mới trong C# 6.0?
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