Toán tử gán có điều kiện null mới của C# 14 gây tranh cãi về độ rõ ràng của code so với tính tiện lợi

Nhóm Cộng đồng BigGo
Toán tử gán có điều kiện null mới của C# 14 gây tranh cãi về độ rõ ràng của code so với tính tiện lợi

C# 14 sắp tới của Microsoft , dự kiến phát hành cùng với .NET 10 , giới thiệu các toán tử gán có điều kiện null cho phép các nhà phát triển gán giá trị mà không cần kiểm tra null một cách rõ ràng. Mặc dù tính năng này hứa hẹn giảm thiểu code boilerplate, nhưng nó đã châm ngòi cho một cuộc thảo luận sôi nổi trong cộng đồng nhà phát triển về việc liệu những tính năng tiện lợi như vậy thực sự cải thiện hay làm hại chất lượng code.

Cú pháp mới cho phép các nhà phát triển viết config?.Settings.RetryPolicy = new Policy() thay vì phải bao bọc các phép gán trong các câu lệnh if. Điều này mở rộng các toán tử có điều kiện null hiện có (?.) để hoạt động ở phía bên trái của phép gán, tạo ra tính nhất quán trong cách tiếp cận xử lý null của ngôn ngữ.

Ví dụ về Cú pháp Gán Null-Conditional trong C 14:

Cú pháp Truyền thống Cú pháp C 14 Mới
if (config.Settings != null) { config.Settings.RetryPolicy = new Policy(); } config?.Settings.RetryPolicy = new Policy();
if (customerData != null) { customerData["LastLogin"] = DateTime.UtcNow; } customerData?["LastLogin"] = DateTime.UtcNow;
if (results != null) { results.ItemsProcessed += 5; } results?.ItemsProcessed += 5;

Các Hạn chế Chính:

  • Các toán tử tăng/giảm (++, --) không được hỗ trợ
  • Các biểu thức phía bên phải sẽ không được đánh giá nếu phía bên trái là null
  • Yêu cầu .NET 10 preview SDK và <LangVersion>preview</LangVersion> trong tệp dự án

Cộng đồng chia rẽ về giá trị thực tế

Các nhà phát triển đang đặt câu hỏi về tính hữu ích thực tế của tính năng này. Nhiều người cho rằng việc gặp phải giá trị null trong quá trình gán thường cho thấy một vấn đề thiết kế cần được giải quyết thay vì bị bỏ qua một cách im lặng. Mối quan tâm tập trung vào việc liệu việc bỏ qua các phép gán khi các đối tượng trung gian là null có thực sự là hành vi mong muốn trong hầu hết các tình huống hay không.

Một số nhà phát triển chỉ ra rằng khi bạn đang cố gắng gán một giá trị, bạn thường muốn phép gán đó thành công và được duy trì. Hành vi của toán tử mới là loại bỏ các phép gán khi gặp phải giá trị null có thể che giấu các vấn đề cơ bản trong logic ứng dụng.

Nỗi lo về sự phức tạp ngôn ngữ tăng dần

Một phần đáng kể của cộng đồng lo lắng rằng C# đang đi theo con đường của C++ , tích lũy các tính năng tạo ra gánh nặng nhận thức mà không có lợi ích tương xứng. Mối quan tâm là các nhà phát triển sẽ cần hiểu một tập hợp ngày càng tăng các cấu trúc ngôn ngữ, khiến codebase khó bảo trì hơn khi các team khác nhau sử dụng các tập con khác nhau của các tính năng có sẵn.

Nó bắt đầu có cảm giác như C# đang đi theo con đường của C++. Hàng tấn tính năng giới thiệu những điều tinh tế và mọi người đều có tập hợp các tính năng yêu thích riêng mà họ biết cách sử dụng.

Cuộc thảo luận tiết lộ sự lo lắng về việc phình to tính năng, nơi mỗi bổ sung dường như hợp lý khi xét riêng lẻ nhưng tổng thể tạo ra một ngôn ngữ ngày càng khó nắm vững một cách toàn diện.

Sự đánh đổi giữa khả năng đọc và khả năng bảo trì

Trong khi những người ủng hộ cho rằng tính năng này giảm sự lộn xộn trực quan và làm cho code ngắn gọn hơn, những người chỉ trích lo lắng về những thách thức trong việc debug. Cú pháp mới có thể nối chuỗi nhiều phép gán có điều kiện, có khả năng tạo ra các tình huống mà không rõ tại sao một giá trị không được đặt. Điều này có thể dẫn đến những phiên troubleshooting khó khăn khi cố gắng xác định phần nào của chuỗi có điều kiện đã thất bại.

Hành vi ngăn chặn tác dụng phụ, nơi biểu thức phía bên phải không được đánh giá nếu phía bên trái là null, thêm một lớp phức tạp khác mà các nhà phát triển phải hiểu và nhớ.

Ý nghĩa rộng lớn hơn đối với chất lượng code

Cuộc tranh luận phản ánh những khác biệt triết học sâu sắc hơn về thiết kế ngôn ngữ. Một số nhà phát triển ủng hộ việc xử lý lỗi rõ ràng và luồng điều khiển rõ ràng, coi tính năng mới như khuyến khích các thực hành lập trình lười biếng. Những người khác coi nó như một sự tiến hóa tự nhiên giảm thiểu nghi thức và cho phép tập trung vào logic kinh doanh thay vì lập trình phòng thủ.

Những hạn chế của tính năng, chẳng hạn như không hỗ trợ các toán tử tăng và giảm, cho thấy các nhà thiết kế ngôn ngữ đang cố gắng cân bằng giữa sự tiện lợi và an toàn. Tuy nhiên, những hạn chế này bổ sung vào mô hình tinh thần mà các nhà phát triển phải duy trì.

Cuộc thảo luận xung quanh các phép gán có điều kiện null của C# 14 cuối cùng làm nổi bật sự căng thẳng đang diễn ra giữa năng suất nhà phát triển và độ rõ ràng của code. Khi ngôn ngữ tiếp tục phát triển, cộng đồng vẫn chia rẽ về việc liệu những tính năng tiện lợi như vậy có đại diện cho sự tiến bộ hay sự phức tạp tăng dần có thể làm hại khả năng bảo trì lâu dài.

Tham khảo: What's New in C# 14: Null-Conditional Assignments