Những tính năng mới trong C# 6.0

C# 6.0 mang đến những tính năng mạnh mẽ sẽ giúp cho việc codeing trở lên dễ dàng hơn đồng thời những dòng code của bạn sẽ dễ dàng có thể đọc hiểu. Bài này chúng ta cùng tìm hiểu về các tính năng mới trong C# 6.0 của Microsoft nhé.

Khởi tạo giá trị cho Properties

Trong các phiên bản trước của C# nếu chúng ta muốn khởi tạo các giá trị cho các thuộc tính của class thì phải tạo constructor sau đó mới khởi tạo các giá trị của thuộc tính trong constructor. Ví dụ:

public class Vehicle

    {

        public string Name { get; set; }

        public int NumberOfDoors { get; set; }

        public int NumberOfSeats { get; set; }

        public Vehicle()

        {

            NumberOfDoors = 4;

            NumberOfSeats = 6;

        }

    }

Nhưng với phiên bản mới của C# 6.0, chúng ta có thể khởi tạo các thuộc tính trực tiếp mà không cần phải thêm constructor mặc định nữa. Đây là đoạn code trên trong C# 6.0:

public class Vehicle

    {

        public string Name { get; set; }

        public int NumberOfDoors { get; set; } = 4;

        public int NumberOfSeats { get; set; } = 6;

    }

ReadOnly Properies

Với C# 6.0 chúng ta có thể định nghĩa một thuộc tính read-only bằng cách bỏ đi từ khóa set. Đây là ví dụ:

public class Vehicle

    {

        public string Name { get; set; }

        public int NumberOfDoors { get; set; } = 4;

        public int NumberOfSeats { get; set; } = 6;

        public int NumberOfTires { get; } = 4;

    }

Chú ý rằng thuộc tính NumberOfTires được khởi tạo trực tiếp với giá trị là 4.

Khởi tạo Dictionary

Để khởi tạo một Dictionary<Tkey,Tvalue> với các đối tượng khác nhau chúng ta thường sử dụng phương thức generic Add(). Với phiên bản hiện tại của C# chúng ta có thể dùng index để chỉ ra key và gán cho nó một đối tượng đây là ví dụ:

  Dictionary<string, Vehicle> vehicles = new Dictionary<string, Vehicle>()

            {

                ["BMW"] = new Vehicle {

                    Name = "BMW",

                    NumberOfDoors = "4",

                    NumberOfSeats = 6 },

                ["Mercedes"] = new Vehicle {

                    Name = "Mercedes",

                    NumberOfDoors = "2",

                    NumberOfSeats = 4 },

            };

Expression Bodied Members

Một phương thức chứa một biểu thức đơn bây giờ có thể được viết  dễ dàng hơn trong một biểu thức thân hàm như sau:

        // C# 5.0

        int MyMethod(int x) { return x + 1; }

        // C# 6.0

        int MyMethod(int x) = > return x + 1;

Chúng ta cũng có thể khai báo một thuộc tính read-only dễ dàng hơn với một thuộc tính  sử dụng cách khai báo biểu thức thân hàm:

public decimal NetPrice => MarkedPrice + TaxAmount;

Mũi tên biểu thức lamda thay thế tất cả ngoặc và return.

Using Static

C# 6.0 cho phép chúng ta  import không chỉ namspace mà còn có thể import cả static class. Tất cả các thành phần static đều có thể được dùng mà không cần viết đủ cả tên class. Ví dụ:

  using static System.Console;

    class Logger

    {

        static void info(string message) { WriteLine(message); }

    }

Toán tử điều kiện Null

Toán tử điều kiện Null(?) cho phép chúng ta gọi và truy cập đến các member giống cách thông thường thông qua dấu chấm (.) ngoại trừ trường hợp kiểu nullable. Biểu thức sẽ kiểm tra giá trị null và ngăn chặn các lệnh truy cập giá trị:     

    // C# 5.0

            var customer = Customers.GetCustomer(id: 1);

            var name = nul;

            var address = null;

            if (customer.Name != null)

            {

                name = customer.Name;

                address = customer.getAddress();

            }

            // C# 6.0

            var customer = Customers.GetCustomer(id: 1);

            var name = customer?.Name

            var address = customer?.getAddress();

String interpolation

Xây dựng chuỗi  bằng cách sử dụng ký tự “$”. Chúng ta có thể đặt biểu thức trực tiếp vào giữa hai dấu ngoặc trong chuỗi để hiển thị giá trị cần thay thế:

string VehicleName = "BMW";

            int NumberOfDoors = 4;

            int NumberOfSeats = 6;

            // C# 5.0

            Console.Write(string.Format("the vehicle {0} has {1} doors and {2} seats",

             VehicleName, NumberOfDoors, NumberOfSeats);

            // C# 6.0

            Console.Write($"the vehicle {VehicleName} has {NumberOfDoors} doors and {NumberOfSeats} seats");

Toán tử nameof

Toán tử nameof trong C# 6.0 trả về tên của bất kỳ cái gì dưới dạng string. Nameof() được xử lý ngay lúc biên dịch. Toán tử này có thể được sử dụng để kiểm tra sự tồn tại của một số thành phần với tên của chúng.

if (myObject == null) throw new ArgumentNullException("myObject");

            var city = "City";

chuyển sang:

if (myObject == null) throw new ArgumentNullException(nameof(myObject));

    var city = nameof(customer.Address.City);

Exception filters

Exception filters trong C# 6.0 được sử dụng để catch chỉ các ngoại lệ theo điều kiện nào đó. Cú pháp như sau:

          try

            {

            }

            catch (Exception ex) when (SomeFilter(ex))

            {

            }

Nếu điều kiện là đúng, ngoại lệ sẽ xảy ra ngược lại thì sẽ không chạy vào ngoại lệ này.

Await trong khối catch và finally

Từ khóa await trong C# 6.0 được gọi bên trong khối lệnh catch và finally. Hiện tại chúng ta có thể code như sau:

Resourse resource = null;

 try

 {

     resource =  processor.ProccessAsync();

 }

 catch (Exception exception)

 {

     await Logger.LogAsync(res, exception)

 }

 finally

 {

    if (resource != null) await res.CloseAsync();   

 }

 


Trích nguồn từ: (http://www.c-sharpcorner.com/)

Lên trên