Những tính năng mới trong C# 7.0
Dường như mới chỉ hôm qua chúng ta đón nhận C# 6.0. Tất cả xẩy ra một cách nhanh chóng trong mảnh đất phát triển phần mềm. Và bây giờ bạn đang thấy C# 7.0. Nó có nhiều hơn những tính năng so với version 6.0. Code một cách đơn giản và cải thiện hiệu suất là những vai trò chính trong phiên bản này. ...
Dường như mới chỉ hôm qua chúng ta đón nhận C# 6.0. Tất cả xẩy ra một cách nhanh chóng trong mảnh đất phát triển phần mềm. Và bây giờ bạn đang thấy C# 7.0. Nó có nhiều hơn những tính năng so với version 6.0. Code một cách đơn giản và cải thiện hiệu suất là những vai trò chính trong phiên bản này. Tupes, Pattern maching là một vài tính năng thực sự tuyệt vời đã được giới thiệu. C# 7.0 được phát hành cùng với Visual studio 2015 Preview 4
- Local functions
- Tuple Types and literals
- Record Types
- Minimizing OUT
- Non Nullable reference types
- Pattern matching
Local methods và functions là đã có trong phiên bản hiện tại của C#(Vâng, chúng ta có thể đạt được chúng với việc sử dụng Func và Action types, Thấy ở đây Func và Action), nhưng vẫn có một vài giới hạn với local method, chúng ta không thể có những tính năng sau.
- Generic
- Out parameter
- Ref parameter
- Params
Bây giờ với C# 7.0 chúng ta có thể vượt qua vấn đề này, nhìn đoạn code bên dưới.
private static void Main(string[] args) { int local_var = 100; int LocalFunction(int arg1) { return local_var * arg1; } Console.WriteLine(LocalFunction(100)); }
Trong đoạn code trên chúng ta đã định nghĩa 'LocalFunction' như local function cái mà là bên trong Main Function 'Main', ở đây chúng ta có thể sử dụng hoặc tham chiếu trong đó.
Trả về nhiều giá trị từ một method và bây giờ là một thực tế phổ biến, chúng ta nói chung sử dụng datatype tùy biến, out parameter, dynamic return type hoặc một đối tượng tuple nhưng ở đây C# 7.0 mang những kiểu tuples và tuple literals cho bạn. nó chỉ trả về nhiều giá trị/ nhiều kiểu thông báo của đối tượng tuple. Quan sát đoạn code bên dưới:
( string, string, string, string) getEmpInfo() { //read EmpInfo from database or any other source and just return them string strFirstName = "abc"; string strAddress = "Address"; string strCity= "City"; string strState= "State"; return (strFirstName, strAddress, strCity, strState); // tuple literal } //Just call above method and it will return multiple values var empInfo= getEmpInfo(); WriteLine("Emp info as {empInfo .Item1} {empInfo .Item2} {empInfo .Item3} {empInfo .Item4}.");
Ví dụ ở trên chúng ta có thể dễ dàng nhận nhiều giá trị từ tuples, tên nhưng Item1, Item2 là không ý nghĩa lắm. Vì vậy, hãy gán những tên ý nghĩa hơn trước lệnh return, nhìn ví dụ bên dưới:
(string strFName, string strAdd, string strC, string strSt) getEmpInfo() { //code goes here } //Now when you call method get values with specific name as below var empInfo= getEmpInfo(); WriteLine("Emp info as {empInfo.strFName} {empInfo.strAdd} {empInfo.strC} {empInfo.strSt}.");
Ngoài ra bạn có thể trả về tên của chúng trực tiếp trong tuple literal như bên dưới
return (strFName: strFirstName, strAdd: strAddress, strCity: strC, strState: strSt);
Tuples là điều hữu ích nơi bạn có thể thay thế hash table hoặc dictionary một cách dễ dàng, thậm chí bạn có thể trả về nhiều giá trị cho một key đơn. Ngoài ra bạn có thể sử dụng nó thay vì List nơi bạn lưu trữ nhiều giá trị tại một vị trí đơn.
.Net cũng có một kiểu Tuple (Tại đây) nhưng nó là một kiểu tham chiếu và cái đó dẫn tới vấn đề về hiệu suất, nhưng C# 7.0 mang một Tuple với kiểu giá trị cái mà là nhanh hơn trong hiệu suất và một kiểu mutable.
C# hỗ trợ kiểu record, cái mà là không có gì nhưng một container của các thuộc tính và biến, hầu hết thời gian classes là đầy với thuộc tính và biến, chúng ta cần nhiều code chỉ để khai báo chúng nhưng với sự hỗ trợ của Record Type bạn có thể giảm công sức của bạn, nhìn đoạn bên dưới:
class studentInfo { string _strFName; string _strMName; string _strLName; studentInfo(string strFN, string strMN, string strLN){ this._strFName = strFN; this._strMName = strMN; this._strLName = strLN; } public string StudentFName {get{ return this._strFName;}} public string StudentMName {get{ return this._strMName;}} public string StudentLName {get{ return this._strLName;}} }
Trong code trên chúng ta có một class với thuộc tính, constractor và biến, vì vậy để truy cập và khai báo biến tôi cần để viết thêm code. Để tránh nó tôi có thể sử dụng Record Type trong C#, nhìn đoạn sau
class studentInfo(string StudentFName, string StudentMName, string StudentLName);
Chính là nó. Chúng ta đã thực hiện nó rất ngắn gọn.
Out parameter là khá phổ biến khi chúng ta muốn để trả về nhiều giá trị từ method. Theo tự nhiên tham số out là kiểu ref và làm việc như một đối số, chúng ta có thể sử dụng một cách dễ dàng nhưng chỉ cần điều kiện biến out nên được khởi tạo trước khi nó truyền qua. Nhìn đoạn bên dưới.
class SetOut { void AssignVal(out string strName) { strName = "I am from OUT"; } static void Main() { string strArgu; AssignVal(out strArgu); // here contents of strArgu is "I am from OUT" } }
C# 7.0 giảm nỗ lực của bạn để viết mở rộng code và bạn chỉ cần truyền đối số với không khởi tạo chúng. Quan sát code bên dưới.
static void Main() { AssignVal(out string szArgu); // here contents of szArgu is "I am from OUT" }
Null referance là thực sự là một vấn đề đau đầu cho tất cả các lập trình viên, nó là rất nhiều ngoại lệ. Nếu bạn không kiểm tra chúng bạn sẽ nhận runtime exception hoặc nếu bạn kiểm tra chúng cho mỗi đối tượng thì code của bạn sẽ dài và rất dài, để giải quyết với vấn đề này C# 7.0 đến với kiểu non-nullable.
int objNullVal; //non-nullable value type int? objNotNullVal; //nullable value type string! objNotNullRef; //non-nullable reference type string objNullRef; //nullable reference type
Bây giờ nhìn tại trình phiên dịch bên dưới và ảnh hưởng sau khi chạy đoạn code
MyClass objNullRef; // Nullable reference type MyClass! objNotNullRef; // Non-nullable reference type objNullRef = null; // this is nullable, so no problem in assigning objNotNullRef = null; // Error, as objNotNullRef is non-nullable objNotNullRef = objNullRef; // Error, as nullable object can not be refered WriteLine(objNotNullRef.ToString()); // Not null so can convert to tostring WriteLine(objNullRef.ToString()); // could be null if (objNullRef != null) { WriteLine(objNullRef.ToString); } // No error as we have already checked it WriteLine(objNullRef!.Length); // No error
C# 7.0 cho phép người sử dụng để sử dụng pattern trong câu lệnh IS và với SWITCH, như vậy chúng ta có thể khớp pattern với bất kì kiểu dự liệu nào, patterns có thể là một hằng số patterns, type patterns, var patterns. Đoạn code sau sẽ làm rõ khái niệm của bạn, hãy bắt đầu với IS pattern
public void Method1( object obj) { //following null is constant pattern if (obj is null) return; //datatype pattern, string is datatype that we check directly if (obj is string st) { //code goes here } else return; }
Switch pattern trợ giúp nhiều như nó sử dụng bất kì kiểu dữ liệu nào cho việc khớp ngoài điều kiện 'case cũng vậy có thể pattern của nó là khá mềm dẻo trong triển khai. Quan sát code bên dưới.
class Calculate(); class Add(int a, int b, int c) : Calculate; class Substract(int a, int b) : Calculate; class Multiply(int a, int b, int c) : Calculate; Calculate objCal = new Multiply(2, 3, 4); switch (objCal) { case Add(int a, int b, int c): //code goes here break; case Substract(int a, int b): //code goes here break; case Multiply(int a, int b, int c): //code goes here break; default: //default case break; }
Trong ví dụ trên switch case kiểm tra pattern và gọi method 'Multiply'
Công nghệ thông tin nói chung và ngôn ngữ lập trình nói riêng luôn phát triển như vũ bão. Sẽ rất thú vị để khám phá những điều mới lạ trong các ngôn ngữ này. Bài viết giới thiệu những tính năng mới quan trọng trong phiên bản C# 7.0. Hy vọng các bạn có được cái nhìn tổng quan về những điểm mới trong ngôn ngữ hiện đại này và áp dụng hiệu quả với ứng dụng thực tế của mình.
Tham khảo New Features of C# 7.0 C sharp corner