C# 8 và hơn thế nữa
Nội dung chính bao gồm
- Thể hiện kỳ vọng null và không null cho các loại tham chiếu
- Sử dụng các biểu thức switch với các mẫu phù hợp
- Sử dụng cú pháp chỉ mục và khoảng để có mã nguồn ngắn gọn và nhất quán
- Sử dụng các phiên bản không đồng bộ của các câu lệnh using, foreach và yield
Tại thời điểm viết bài này, C# 8 vẫn đang được thiết kế. Kho mã nguồn GitHub cho thấy rất nhiều tính năng tiềm năng, nhưng chỉ một vài trong số đó chạm đến giai đoạn sẵn có rộng rãi của các bản đóng gói xem trước của trình biên dịch. Chương này là phỏng đoán có giáo dục; không có gì viết ra ở đây là chắc chắn. Gần như không thể tin rằng tất cả các tính năng được coi là sẽ chứa trong C# 8, và tôi giới hạn bản thân ở những tính năng mà tôi thấy hợp lý để cắt giảm. Tôi đã cung cấp chi tiết nhất về các tính năng sẵn có trong bản xem trước tại thời điểm viết, nhưng thậm chí ngay cả như vậy, không có nghĩa rằng trong sự thay đổi không xảy ra trong tương lai.
Lưu ý: Tại thời điểm viết sách, chỉ vài tính năng C# 8 sẵn có trong bản đóng gói xem trước, và có nhiều bản đóng gói khác với các tính năng khác nhau. Bản xem trước các kiểu tham chiếu cho phép null chỉ hỗ trợ trong các dự án .NET đầy đủ (.NET Framework) (chứ không phải các dự án theo kiểu .NET Core SDK), cái mà khiến cho thử nghiệm khó hơn với mã nguồn thực nếu tất cả các dự án sử dụng định dạng dự án mới. Tôi mong đợi những giới hạn sẽ được vượt qua trong các bản đóng gói sau, có thể vào lúc bạn đang đọc quyển sách này.
Chúng ta bắt đầu với các kiểu tham chiếu có thể null.
Các kiểu tham chiếu có thể null
À, các tham chiếu null. Nó là sai lầm tỷ đô mà Tony Hoare đã xin lỗi vào năm 2009 khi giới thiệu chúng vào những năm 1960. Thật khó để tìm một lập trình viên C# chưa từng bị đau đớn bởi NullReference Exception ít nhất vài lần. Đội phát triển C# cố gắng thuần hóa các tham chiếu null, làm cho nó rõ ràng hơn khi chúng ta kỳ vọng tìm chúng.
** Điều gì mà các kiểu tham chiếu nullable có thể giải quyết?**
Như một ví dụ mà tôi đã mở rộng xuyên suốt phần này, hãy xem xét các class trong danh sách dưới đây. Nếu bạn đang làm theo mã nguồn có thể tải về, bạn sẽ thấy rằng nó được khai báo trong các class lồng nhau trong mỗi ví dụ, vì mà nguồn thay đổi theo thời gian.
Khởi tạo model trước C# 8
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Customer</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">string</span> Name <span class="token punctuation">{</span><span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token class-name">Address</span> Address <span class="token punctuation">{</span><span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Address</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">string</span> Country <span class="token punctuation">{</span><span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Một địa chỉ thường chưa nhiều thông tin hơn một quốc gia nhưng một thuộc tính đơn là đủ cho các ví dụ trong chương này. Với những class kia, mã nguồn an toàn đến mức nào?
1 2 3 | <span class="token class-name">Customer</span> customer <span class="token operator">=</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span>customer<span class="token punctuation">.</span>Address<span class="token punctuation">.</span>Country<span class="token punctuation">)</span><span class="token punctuation">;</span> |