- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
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